diff --git a/.github/workflows/validating.yml b/.github/workflows/validating.yml index 173631b57..5028f783f 100644 --- a/.github/workflows/validating.yml +++ b/.github/workflows/validating.yml @@ -24,15 +24,12 @@ jobs: - name: Build run: yarn run build - - name: Run test - run: yarn run test - - uses: cypress-io/github-action@v6 with: install-command : yarn install --immutable --immutable-cache # fix issue with "Cannot find module 'cypress'" # https://github.com/cypress-io/github-action/issues/430#issuecomment-949936528 - command: yarn test:e2e + command: yarn run test start: yarn start-test-server wait-on: "http://localhost:8888" wait-on-timeout: 5 diff --git a/.gitignore b/.gitignore index c9d9629b3..f232089ec 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ _config.yaml dist .parcel-cache +cypress/screenshots/ + # The GitLab pages artifacts public diff --git a/cypress.config.js b/cypress.config.js index 6d7cd2a75..47d8beab2 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -2,11 +2,10 @@ const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, baseUrl: 'http://localhost:8888', + specPattern: [ + "cypress/e2e/**/*.cy.{js,jsx,ts,tsx}", + "cypress/unit/**/*.cy.{js,jsx,ts,tsx}", + ], }, }) diff --git a/cypress/e2e/1-basic/zero_configuration.cy.js b/cypress/e2e/1-basic/zero_configuration.cy.js index 915f73c7b..87d0f14e9 100644 --- a/cypress/e2e/1-basic/zero_configuration.cy.js +++ b/cypress/e2e/1-basic/zero_configuration.cy.js @@ -14,9 +14,7 @@ describe("Dropzone with zero configuration", () => { cy.wait("@upload").then((interception) => { expect(interception.response.statusCode).to.eq(200); - expect(interception.response.body).to.deep.eq({ - success: true, - }); + expect(interception.response.body).to.deep.eq({ success: true }); }); }); @@ -25,13 +23,17 @@ describe("Dropzone with zero configuration", () => { cy.get(".dropzone") .selectFile("cypress/fixtures/image.jpg", { action: "drag-drop" }) - .selectFile("cypress/fixtures/image.tiff", { action: "drag-drop" }) + .selectFile("cypress/fixtures/image.tiff", { action: "drag-drop" }); + // wait for BOTH uploads cy.wait("@upload").then((interception) => { expect(interception.response.statusCode).to.eq(200); - expect(interception.response.body).to.deep.eq({ - success: true, - }); + expect(interception.response.body).to.deep.eq({ success: true }); + }); + + cy.wait("@upload").then((interception) => { + expect(interception.response.statusCode).to.eq(200); + expect(interception.response.body).to.deep.eq({ success: true }); }); }); }); diff --git a/test/unit-tests/README.md b/cypress/e2e/README.md similarity index 100% rename from test/unit-tests/README.md rename to cypress/e2e/README.md diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 000000000..c40970173 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,16 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** +globalThis.sleep = (delay) => + new Promise((resolve) => setTimeout(resolve, delay)); diff --git a/cypress/support/unit.js b/cypress/support/unit.js new file mode 100644 index 000000000..71550f181 --- /dev/null +++ b/cypress/support/unit.js @@ -0,0 +1,14 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** diff --git a/test/unit-tests/all.js b/cypress/unit/all.cy.js similarity index 52% rename from test/unit-tests/all.js rename to cypress/unit/all.cy.js index bbe93867e..c7c39b806 100644 --- a/test/unit-tests/all.js +++ b/cypress/unit/all.cy.js @@ -4,7 +4,7 @@ describe("Dropzone", function () { let getMockFile = ( type = "text/html", filename = "test file name", - contents = ["file contents"] + contents = ["file contents"], ) => { let file = new File(contents, filename, { type: type }); file.status = Dropzone.ADDED; @@ -15,9 +15,6 @@ describe("Dropzone", function () { return file; }; - let xhr = null; - beforeEach(() => (xhr = sinon.useFakeXMLHttpRequest())); - describe("constructor()", function () { let dropzone = null; @@ -29,37 +26,37 @@ describe("Dropzone", function () { it("should throw an exception if the element is invalid", () => expect(() => (dropzone = new Dropzone("#invalid-element"))).to.throw( - "Invalid dropzone element: not an instance of HTMLElement." + "Invalid dropzone element: not an instance of HTMLElement.", )); it("should throw an exception if assigned twice to the same element", function () { let element = document.createElement("div"); dropzone = new Dropzone(element, { url: "url" }); return expect(() => new Dropzone(element, { url: "url" })).to.throw( - "Dropzone already attached." + "Dropzone already attached.", ); }); it("should set itself as element.dropzone", function () { let element = document.createElement("div"); dropzone = new Dropzone(element, { url: "url" }); - return element.dropzone.should.equal(dropzone); + return expect(element.dropzone).to.equal(dropzone); }); it("should add itself to Dropzone.instances", function () { let element = document.createElement("div"); dropzone = new Dropzone(element, { url: "url" }); - return Dropzone.instances[Dropzone.instances.length - 1].should.equal( - dropzone + return expect(Dropzone.instances[Dropzone.instances.length - 1]).to.equal( + dropzone, ); }); it("should use the action attribute not the element with the name action", function () { let element = Dropzone.createElement( - '
' + '
', ); dropzone = new Dropzone(element); - return dropzone.options.url.should.equal("real-action"); + return expect(dropzone.options.url).to.equal("real-action"); }); return describe("options", function () { @@ -79,28 +76,31 @@ describe("Dropzone", function () { it("should take the options set in Dropzone.options", function () { dropzone = new Dropzone(element); - dropzone.options.url.should.equal("/some/url"); - return dropzone.options.parallelUploads.should.equal(10); + expect(dropzone.options.url).to.equal("/some/url"); + return expect(dropzone.options.parallelUploads).to.equal(10); }); it("should prefer passed options over Dropzone.options", function () { dropzone = new Dropzone(element, { url: "/some/other/url" }); - return dropzone.options.url.should.equal("/some/other/url"); + return expect(dropzone.options.url).to.equal("/some/other/url"); }); it("should take the default options if nothing set in Dropzone.options", function () { dropzone = new Dropzone(element2, { url: "/some/url" }); - return dropzone.options.parallelUploads.should.equal(2); + return expect(dropzone.options.parallelUploads).to.equal(2); }); - it("should call the fallback function if forceFallback == true", (done) => - (dropzone = new Dropzone(element, { + it("should call the fallback function if forceFallback == true", () => { + const fallback = Cypress.sinon.spy(); + + dropzone = new Dropzone(element, { url: "/some/other/url", forceFallback: true, - fallback() { - return done(); - }, - }))); + fallback, + }); + + expect(fallback).to.have.been.calledOnce; + }); return describe("options.clickable", function () { let clickableElement = null; @@ -119,21 +119,21 @@ describe("Dropzone", function () { it("should use the default element if clickable == true", function () { dropzone = new Dropzone(element, { clickable: true }); - return dropzone.clickableElements.should.eql([dropzone.element]); + expect(dropzone.clickableElements).to.deep.equal([dropzone.element]); }); it("should lookup the element if clickable is a CSS selector", function () { dropzone = new Dropzone(element, { clickable: ".some-clickable" }); - return dropzone.clickableElements.should.eql([clickableElement]); + expect(dropzone.clickableElements).to.deep.equal([clickableElement]); }); it("should simply use the provided element", function () { dropzone = new Dropzone(element, { clickable: clickableElement }); - return dropzone.clickableElements.should.eql([clickableElement]); + expect(dropzone.clickableElements).to.deep.equal([clickableElement]); }); it("should accept multiple clickable elements", function () { dropzone = new Dropzone(element, { clickable: [document.body, ".some-clickable"], }); - return dropzone.clickableElements.should.eql([ + expect(dropzone.clickableElements).to.deep.equal([ document.body, clickableElement, ]); @@ -143,9 +143,9 @@ describe("Dropzone", function () { () => (dropzone = new Dropzone(element, { clickable: ".some-invalid-clickable", - })) + })), ).to.throw( - "Invalid `clickable` option provided. Please provide a CSS selector, a plain HTML element or a list of those." + "Invalid `clickable` option provided. Please provide a CSS selector, a plain HTML element or a list of those.", )); }); }); @@ -156,16 +156,17 @@ describe("Dropzone", function () { let dropzones = { "using acceptedFiles": new Dropzone( Dropzone.createElement('
'), - { clickable: true, acceptedFiles: "audio/*,video/*" } + { clickable: true, acceptedFiles: "audio/*,video/*" }, ), }; it("should not add an accept attribute if no acceptParameter", function () { let dropzone = new Dropzone( Dropzone.createElement('
'), - { clickable: true, acceptParameter: null, acceptedFiles: null } + { clickable: true, acceptParameter: null, acceptedFiles: null }, ); - return dropzone.hiddenFileInput.hasAttribute("accept").should.be.false; + return expect(dropzone.hiddenFileInput.hasAttribute("accept")).to.be + .false; }); return (() => { @@ -176,18 +177,18 @@ describe("Dropzone", function () { describe(name, () => (function (dropzone) { it("should create a hidden file input if clickable", function () { - dropzone.hiddenFileInput.should.be.ok; - dropzone.hiddenFileInput.tagName.should.equal("INPUT"); + expect(dropzone.hiddenFileInput).to.be.ok; + expect(dropzone.hiddenFileInput.tagName).to.equal("INPUT"); }); it("should have a tabindex of -1", function () { - dropzone.hiddenFileInput.tabIndex.should.equal(-1); + expect(dropzone.hiddenFileInput.tabIndex).to.equal(-1); }); it("should use the acceptParameter", () => - dropzone.hiddenFileInput - .getAttribute("accept") - .should.equal("audio/*,video/*")); + expect( + dropzone.hiddenFileInput.getAttribute("accept"), + ).to.equal("audio/*,video/*")); it("should create a new input element when something is selected to reset the input field", () => (() => { @@ -197,18 +198,19 @@ describe("Dropzone", function () { let event = document.createEvent("HTMLEvents"); event.initEvent("change", true, true); hiddenFileInput.dispatchEvent(event); - dropzone.hiddenFileInput.should.not.equal( - hiddenFileInput + expect(dropzone.hiddenFileInput).to.not.equal( + hiddenFileInput, ); result1.push( - Dropzone.elementInside(hiddenFileInput, document).should - .not.be.ok + expect( + Dropzone.elementInside(hiddenFileInput, document), + ).to.not.be.ok, ); } return result1; })()); - })(dropzone) - ) + })(dropzone), + ), ); } return result; @@ -217,29 +219,31 @@ describe("Dropzone", function () { it("should create a .dz-message element", function () { let element = Dropzone.createElement( - '
' + '
', ); let dropzone = new Dropzone(element, { clickable: true, acceptParameter: null, }); - return element.querySelector(".dz-message").should.be.instanceof(Element); + return expect(element.querySelector(".dz-message")).to.be.instanceof( + Element, + ); }); it("should not create a .dz-message element if there already is one", function () { let element = Dropzone.createElement( - '
' + '
', ); let msg = Dropzone.createElement('
TEST
'); element.appendChild(msg); - let dropzone = new Dropzone(element, { + new Dropzone(element, { clickable: true, acceptParameter: null, }); - element.querySelector(".dz-message").should.equal(msg); + expect(element.querySelector(".dz-message")).to.equal(msg); - return element.querySelectorAll(".dz-message").length.should.equal(1); + return expect(element.querySelectorAll(".dz-message").length).to.equal(1); }); }); @@ -274,23 +278,24 @@ describe("Dropzone", function () { describe(".addedFile()", () => it("should properly create the previewElement", function () { - file.previewElement.should.be.instanceof(Element); - - file.previewElement - .querySelector("[data-dz-name]") - .innerHTML.should.eql("test name"); - return file.previewElement - .querySelector("[data-dz-size]") - .innerHTML.should.eql("2.1 MB"); + expect(file.previewElement).to.be.instanceof(Element); + + expect( + file.previewElement.querySelector("[data-dz-name]").innerHTML, + ).to.equal("test name"); + expect( + file.previewElement.querySelector("[data-dz-size]").innerHTML, + ).to.equal("2.1 MB"); })); describe(".error()", function () { it("should properly insert the error", function () { dropzone.options.error.call(dropzone, file, "test message"); - return file.previewElement - .querySelector("[data-dz-errormessage]") - .innerHTML.should.eql("test message"); + return expect( + file.previewElement.querySelector("[data-dz-errormessage]") + .innerHTML, + ).to.equal("test message"); }); it("should properly insert the error when provided with an object containing the error", function () { @@ -298,9 +303,10 @@ describe("Dropzone", function () { error: "test message", }); - return file.previewElement - .querySelector("[data-dz-errormessage]") - .innerHTML.should.eql("test message"); + return expect( + file.previewElement.querySelector("[data-dz-errormessage]") + .innerHTML, + ).to.equal("test message"); }); }); @@ -310,30 +316,34 @@ describe("Dropzone", function () { "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="; dropzone.options.thumbnail.call(dropzone, file, transparentGif); let thumbnail = file.previewElement.querySelector( - "[data-dz-thumbnail]" + "[data-dz-thumbnail]", ); - thumbnail.src.should.eql(transparentGif); - return thumbnail.alt.should.eql("test name"); + expect(thumbnail.src).to.deep.equal(transparentGif); + return expect(thumbnail.alt).to.equal("test name"); })); describe(".uploadprogress()", () => it("should properly set the width", function () { dropzone.options.uploadprogress.call(dropzone, file, 0); - file.previewElement - .querySelector("[data-dz-uploadprogress]") - .style.width.should.eql("0%"); + expect( + file.previewElement.querySelector("[data-dz-uploadprogress]").style + .width, + ).to.equal("0%"); dropzone.options.uploadprogress.call(dropzone, file, 80); - file.previewElement - .querySelector("[data-dz-uploadprogress]") - .style.width.should.eql("80%"); + expect( + file.previewElement.querySelector("[data-dz-uploadprogress]").style + .width, + ).to.equal("80%"); dropzone.options.uploadprogress.call(dropzone, file, 90); - file.previewElement - .querySelector("[data-dz-uploadprogress]") - .style.width.should.eql("90%"); + expect( + file.previewElement.querySelector("[data-dz-uploadprogress]").style + .width, + ).to.equal("90%"); dropzone.options.uploadprogress.call(dropzone, file, 100); - return file.previewElement - .querySelector("[data-dz-uploadprogress]") - .style.width.should.eql("100%"); + return expect( + file.previewElement.querySelector("[data-dz-uploadprogress]").style + .width, + ).to.equal("100%"); })); return describe(".resize()", function () { @@ -344,19 +354,19 @@ describe("Dropzone", function () { file, 120, 120, - "crop" + "crop", ); - info.trgWidth.should.eql(120); - info.trgHeight.should.eql(100); + expect(info.trgWidth).to.equal(120); + expect(info.trgHeight).to.equal(100); info = dropzone.options.resize.call( dropzone, file, 100, 100, - "crop" + "crop", ); - info.trgWidth.should.eql(100); - return info.trgHeight.should.eql(100); + expect(info.trgWidth).to.equal(100); + return expect(info.trgHeight).to.equal(100); }); it("should properly return target dimensions for 'contain'", function () { @@ -365,19 +375,19 @@ describe("Dropzone", function () { file, 120, 120, - "contain" + "contain", ); - info.trgWidth.should.eql(120); - info.trgHeight.should.eql(60); + expect(info.trgWidth).to.equal(120); + expect(info.trgHeight).to.equal(60); info = dropzone.options.resize.call( dropzone, file, 100, 100, - "contain" + "contain", ); - info.trgWidth.should.eql(100); - return info.trgHeight.should.eql(50); + expect(info.trgWidth).to.equal(100); + return expect(info.trgHeight).to.equal(50); }); }); @@ -389,37 +399,31 @@ describe("Dropzone", function () { [150, null], ]; - return (() => { - let result = []; - for (let i = 0; i < testSettings.length; i++) { - let setting = testSettings[i]; - let info = dropzone.options.resize.call( - dropzone, - file, - setting[0], - setting[1], - "crop" - ); - - if (i === 0) { - info.trgWidth.should.eql(200); - info.trgHeight.should.eql(100); - } - - if (i === 1) { - info.trgWidth.should.eql(160); - info.trgHeight.should.eql(80); - } - - if (i === 2) { - info.trgWidth.should.eql(150); - result.push(info.trgHeight.should.eql(75)); - } else { - result.push(undefined); - } + for (let i = 0; i < testSettings.length; i++) { + let setting = testSettings[i]; + let info = dropzone.options.resize.call( + dropzone, + file, + setting[0], + setting[1], + "crop", + ); + + if (i === 0) { + expect(info.trgWidth).to.equal(200); + expect(info.trgHeight).to.equal(100); + } + + if (i === 1) { + expect(info.trgWidth).to.equal(160); + expect(info.trgHeight).to.equal(80); } - return result; - })(); + + if (i === 2) { + expect(info.trgWidth).to.equal(150); + expect(info.trgHeight).to.equal(75); + } + } }); it("should properly return target dimensions for contain", function () { @@ -428,32 +432,26 @@ describe("Dropzone", function () { [150, null], ]; - return (() => { - let result = []; - for (let i = 0; i < testSettings.length; i++) { - let setting = testSettings[i]; - let info = dropzone.options.resize.call( - dropzone, - file, - setting[0], - setting[1], - "contain" - ); - - if (i === 0) { - info.trgWidth.should.eql(160); - info.trgHeight.should.eql(80); - } - - if (i === 1) { - info.trgWidth.should.eql(150); - result.push(info.trgHeight.should.eql(75)); - } else { - result.push(undefined); - } + for (let i = 0; i < testSettings.length; i++) { + let setting = testSettings[i]; + let info = dropzone.options.resize.call( + dropzone, + file, + setting[0], + setting[1], + "contain", + ); + + if (i === 0) { + expect(info.trgWidth).to.equal(160); + expect(info.trgHeight).to.equal(80); } - return result; - })(); + + if (i === 1) { + expect(info.trgWidth).to.equal(150); + expect(info.trgHeight).to.equal(75); + } + } }); }); }); @@ -463,11 +461,7 @@ describe("Dropzone", function () { describe("instance", function () { let element = null; let dropzone = null; - let requests = null; beforeEach(function () { - requests = []; - xhr.onCreate = (xhr) => requests.push(xhr); - element = Dropzone.createElement("
"); document.body.appendChild(element); return (dropzone = new Dropzone(element, { @@ -481,43 +475,42 @@ describe("Dropzone", function () { afterEach(function () { document.body.removeChild(element); dropzone.destroy(); - return xhr.restore(); }); describe(".accept()", function () { it("should pass if the filesize is OK", () => dropzone.accept( { size: 2 * 1024 * 1024, type: "audio/mp3" }, - (err) => expect(err).to.be.undefined + (err) => expect(err).to.be.undefined, )); it("shouldn't pass if the filesize is too big", () => dropzone.accept({ size: 10 * 1024 * 1024, type: "audio/mp3" }, (err) => - err.should.eql("File is too big (10MiB). Max filesize: 4MiB.") + expect(err).to.equal("File is too big (10MiB). Max filesize: 4MiB."), )); it("should properly accept files which mime types are listed in acceptedFiles", function () { dropzone.accept( { type: "audio/mp3" }, - (err) => expect(err).to.be.undefined + (err) => expect(err).to.be.undefined, ); dropzone.accept( { type: "image/png" }, - (err) => expect(err).to.be.undefined + (err) => expect(err).to.be.undefined, ); return dropzone.accept( { type: "audio/wav" }, - (err) => expect(err).to.be.undefined + (err) => expect(err).to.be.undefined, ); }); it("should properly reject files when the mime type isn't listed in acceptedFiles", () => dropzone.accept({ type: "image/jpeg" }, (err) => - err.should.eql("You can't upload files of this type.") + expect(err).to.equal("You can't upload files of this type."), )); it("should fail if maxFiles has been exceeded and call the event maxfilesexceeded", function () { - sinon.stub(dropzone, "getAcceptedFiles"); + Cypress.sinon.stub(dropzone, "getAcceptedFiles"); let file = { type: "audio/mp3" }; dropzone.getAcceptedFiles.returns({ length: 99 }); @@ -527,18 +520,18 @@ describe("Dropzone", function () { let called = false; dropzone.on("maxfilesexceeded", function (lfile) { - lfile.should.equal(file); + expect(lfile).to.equal(file); return (called = true); }); dropzone.accept(file, (err) => expect(err).to.be.undefined); - called.should.not.be.ok; + expect(called).to.not.be.ok; dropzone.getAcceptedFiles.returns({ length: 100 }); dropzone.accept(file, (err) => - expect(err).to.equal("You can only upload 100 files.") + expect(err).to.equal("You can only upload 100 files."), ); - called.should.be.ok; + expect(called).to.be.ok; return dropzone.getAcceptedFiles.restore(); }); @@ -550,54 +543,69 @@ describe("Dropzone", function () { let called = false; dropzone.on("maxfilesexceeded", function (lfile) { - lfile.should.equal(file); + expect(lfile).to.equal(file); return (called = true); }); dropzone.accept(file, (err) => - expect(err).to.equal("You cannot upload any more files.") + expect(err).to.equal("You cannot upload any more files."), ); - return called.should.be.ok; + return expect(called).to.be.ok; }); }); describe(".removeFile()", () => - it("should abort uploading if file is currently being uploaded", function (done) { - let mockFile = getMockFile(); - dropzone.uploadFile = function (file) {}; + it("should abort uploading if file is currently being uploaded", function () { + cy.clock(); + + const mockFile = getMockFile(); + + // Important: Dropzone uses uploadFiles(), not uploadFile() + Cypress.sinon.stub(dropzone, "uploadFiles").callsFake(() => { + // do nothing: keep it "uploading" forever + }); + dropzone.accept = (file, done) => done(); - sinon.stub(dropzone, "cancelUpload"); + Cypress.sinon.stub(dropzone, "cancelUpload"); dropzone.addFile(mockFile); - return setTimeout(function () { - mockFile.status.should.equal(Dropzone.UPLOADING); - dropzone.getUploadingFiles()[0].should.equal(mockFile); - dropzone.cancelUpload.callCount.should.equal(0); + // Force processing so status becomes UPLOADING + dropzone.processFile(mockFile); + + cy.tick(0).then(() => { + expect(mockFile.status).to.equal(Dropzone.UPLOADING); + expect(dropzone.getUploadingFiles()[0]).to.equal(mockFile); + + expect(dropzone.cancelUpload.callCount).to.equal(0); dropzone.removeFile(mockFile); - dropzone.cancelUpload.callCount.should.equal(1); - return done(); - }, 100); + expect(dropzone.cancelUpload.callCount).to.equal(1); + }); })); - describe(".cancelUpload()", function () { - it("should properly cancel upload if file currently uploading", function (done) { - let mockFile = getMockFile(); + describe(".cancelUpload()", () => { + it("should properly cancel upload if file currently uploading", function () { + const mockFile = getMockFile(); dropzone.accept = (file, done) => done(); + // Keep the upload from completing so status stays UPLOADING + Cypress.sinon.stub(dropzone, "uploadFiles").callsFake(() => {}); + dropzone.addFile(mockFile); - return setTimeout(function () { - mockFile.status.should.equal(Dropzone.UPLOADING); - dropzone.getUploadingFiles()[0].should.equal(mockFile); - dropzone.cancelUpload(mockFile); - mockFile.status.should.equal(Dropzone.CANCELED); - dropzone.getUploadingFiles().length.should.equal(0); - dropzone.getQueuedFiles().length.should.equal(0); - return done(); - }, 10); + // Force it into UPLOADING deterministically + dropzone.processFile(mockFile); + + expect(mockFile.status).to.equal(Dropzone.UPLOADING); + expect(dropzone.getUploadingFiles()[0]).to.equal(mockFile); + + dropzone.cancelUpload(mockFile); + + expect(mockFile.status).to.equal(Dropzone.CANCELED); + expect(dropzone.getUploadingFiles().length).to.equal(0); + expect(dropzone.getQueuedFiles().length).to.equal(0); }); it("should properly cancel the upload if file is not yet uploading", function () { @@ -609,13 +617,13 @@ describe("Dropzone", function () { dropzone.options.parallelUploads = 0; dropzone.addFile(mockFile); - mockFile.status.should.equal(Dropzone.QUEUED); - dropzone.getQueuedFiles()[0].should.equal(mockFile); + expect(mockFile.status).to.equal(Dropzone.QUEUED); + expect(dropzone.getQueuedFiles()[0]).to.equal(mockFile); dropzone.cancelUpload(mockFile); - mockFile.status.should.equal(Dropzone.CANCELED); - dropzone.getQueuedFiles().length.should.equal(0); - return dropzone.getUploadingFiles().length.should.equal(0); + expect(mockFile.status).to.equal(Dropzone.CANCELED); + expect(dropzone.getQueuedFiles().length).to.equal(0); + return expect(dropzone.getUploadingFiles().length).to.equal(0); }); it("should call processQueue()", function (done) { @@ -626,166 +634,182 @@ describe("Dropzone", function () { // Making sure the file stays in the queue. dropzone.options.parallelUploads = 0; - sinon.spy(dropzone, "processQueue"); + Cypress.sinon.spy(dropzone, "processQueue"); dropzone.addFile(mockFile); return setTimeout(function () { - dropzone.processQueue.callCount.should.equal(1); + expect(dropzone.processQueue.callCount).to.equal(1); dropzone.cancelUpload(mockFile); - dropzone.processQueue.callCount.should.equal(2); + expect(dropzone.processQueue.callCount).to.equal(2); return done(); }, 10); }); - it("should properly cancel all files with the same XHR if uploadMultiple is true", function (done) { - let mock1 = getMockFile(); - let mock2 = getMockFile(); - let mock3 = getMockFile(); + it("should properly cancel all files with the same XHR if uploadMultiple is true", function () { + const mock1 = getMockFile(); + const mock2 = getMockFile(); + const mock3 = getMockFile(); dropzone.accept = (file, done) => done(); - // Making sure the file stays in the queue. dropzone.options.uploadMultiple = true; dropzone.options.parallelUploads = 3; - sinon.spy(dropzone, "processFiles"); + // Keep the shared XHR from completing (prevents SUCCESS race) + const sendStub = Cypress.sinon + .stub(window.XMLHttpRequest.prototype, "send") + .callsFake(() => {}); - dropzone.addFile(mock1); - dropzone.addFile(mock2); - dropzone.addFile(mock3); + // Observe that processing happened once + Cypress.sinon.spy(dropzone, "processFiles"); - return setTimeout(function () { - dropzone.processFiles.callCount.should.equal(1); + try { + dropzone.addFile(mock1); + dropzone.addFile(mock2); + dropzone.addFile(mock3); - sinon.spy(mock1.xhr, "abort"); + // Start the batch upload deterministically + dropzone.processQueue(); - dropzone.cancelUpload(mock1); + expect(dropzone.processFiles.callCount).to.equal(1); + // All files should share the same XHR in uploadMultiple mode + expect(mock1.xhr).to.exist; expect(mock1.xhr === mock2.xhr && mock2.xhr === mock3.xhr).to.be.ok; - mock1.status.should.equal(Dropzone.CANCELED); - mock2.status.should.equal(Dropzone.CANCELED); - mock3.status.should.equal(Dropzone.CANCELED); + Cypress.sinon.spy(mock1.xhr, "abort"); + + dropzone.cancelUpload(mock1); - // The XHR should only be aborted once! - mock1.xhr.abort.callCount.should.equal(1); + expect(mock1.status).to.equal(Dropzone.CANCELED); + expect(mock2.status).to.equal(Dropzone.CANCELED); + expect(mock3.status).to.equal(Dropzone.CANCELED); - return done(); - }, 10); + // The shared XHR should only be aborted once + expect(mock1.xhr.abort.callCount).to.equal(1); + } finally { + sendStub.restore(); + } }); }); describe(".disable()", () => - it("should properly cancel all pending uploads", function (done) { + it("should properly cancel all pending uploads", function () { dropzone.accept = (file, done) => done(); - dropzone.options.parallelUploads = 1; + Cypress.sinon.spy(dropzone, "cancelUpload"); + dropzone.addFile(getMockFile()); dropzone.addFile(getMockFile()); return setTimeout(function () { - dropzone.getUploadingFiles().length.should.equal(1); - dropzone.getQueuedFiles().length.should.equal(1); - dropzone.files.length.should.equal(2); + expect(dropzone.getUploadingFiles().length).to.equal(1); + expect(dropzone.getQueuedFiles().length).to.equal(1); + expect(dropzone.files.length).to.equal(2); - sinon.spy(requests[0], "abort"); - - requests[0].abort.callCount.should.equal(0); + expect(dropzone.cancelUpload.callCount).to.equal(0); dropzone.disable(); - requests[0].abort.callCount.should.equal(1); + // should cancel at least the uploading file (and may cancel queued too depending on impl) + expect(dropzone.cancelUpload.callCount).to.be.greaterThan(0); - dropzone.getUploadingFiles().length.should.equal(0); - dropzone.getQueuedFiles().length.should.equal(0); - dropzone.files.length.should.equal(2); + expect(dropzone.getUploadingFiles().length).to.equal(0); + expect(dropzone.getQueuedFiles().length).to.equal(0); + expect(dropzone.files.length).to.equal(2); - dropzone.files[0].status.should.equal(Dropzone.CANCELED); - dropzone.files[1].status.should.equal(Dropzone.CANCELED); - return done(); + expect(dropzone.files[0].status).to.equal(Dropzone.CANCELED); + expect(dropzone.files[1].status).to.equal(Dropzone.CANCELED); }, 10); })); describe(".destroy()", function () { - it("should properly cancel all pending uploads and remove all file references", function (done) { + it("should properly cancel all pending uploads and remove all file references", function () { dropzone.accept = (file, done) => done(); - dropzone.options.parallelUploads = 1; dropzone.addFile(getMockFile()); dropzone.addFile(getMockFile()); - return setTimeout(function () { - dropzone.getUploadingFiles().length.should.equal(1); - dropzone.getQueuedFiles().length.should.equal(1); - dropzone.files.length.should.equal(2); + // Force queue processing so states are set before assertions + dropzone.processQueue(); - sinon.spy(dropzone, "disable"); + expect(dropzone.getUploadingFiles().length).to.equal(1); + expect(dropzone.getQueuedFiles().length).to.equal(1); + expect(dropzone.files.length).to.equal(2); - dropzone.destroy(); + Cypress.sinon.spy(dropzone, "disable"); - dropzone.disable.callCount.should.equal(1); - element.should.not.have.property("dropzone"); - return done(); - }, 10); + dropzone.destroy(); + + expect(dropzone.disable.callCount).to.equal(1); + expect(element).to.not.have.property("dropzone"); }); it("should be able to create instance of dropzone on the same element after destroy", function () { dropzone.destroy(); - return (() => - new Dropzone(element, { - maxFilesize: 4, - url: "url", - acceptedFiles: "audio/*,image/png", - uploadprogress() {}, - })).should.not.throw(Error); + return expect( + () => + new Dropzone(element, { + maxFilesize: 4, + url: "url", + acceptedFiles: "audio/*,image/png", + uploadprogress() {}, + }), + ).to.not.throw(Error); }); it("should remove itself from Dropzone.instances", function () { - (Dropzone.instances.indexOf(dropzone) !== -1).should.be.ok; + expect(Dropzone.instances.indexOf(dropzone) !== -1).to.be.ok; dropzone.destroy(); - return (Dropzone.instances.indexOf(dropzone) === -1).should.be.ok; + return expect(Dropzone.instances.indexOf(dropzone) === -1).to.be.ok; }); }); describe(".filesize()", function () { it("should handle files with 0 size properly", () => - dropzone.filesize(0).should.eql("0 b")); + expect(dropzone.filesize(0)).to.equal("0 b")); it("should convert to KiloBytes, etc..", function () { - dropzone.options.filesizeBase.should.eql(1000); // Just making sure the default config is correct - - dropzone.filesize(2 * 1000 * 1000).should.eql("2 MB"); - dropzone - .filesize(2 * 1024 * 1024) - .should.eql("2.1 MB"); - - dropzone - .filesize(2 * 1000 * 1000 * 1000) - .should.eql("2 GB"); - dropzone - .filesize(2 * 1024 * 1024 * 1024) - .should.eql("2.1 GB"); - - dropzone - .filesize(2.5111 * 1000 * 1000 * 1000) - .should.eql("2.5 GB"); - dropzone.filesize(1.1 * 1000).should.eql("1.1 KB"); - return dropzone - .filesize(999 * 1000) - .should.eql("1 MB"); + expect(dropzone.options.filesizeBase).to.equal(1000); // Just making sure the default config is correct + + expect(dropzone.filesize(2 * 1000 * 1000)).to.equal( + "2 MB", + ); + expect(dropzone.filesize(2 * 1024 * 1024)).to.equal( + "2.1 MB", + ); + + expect(dropzone.filesize(2 * 1000 * 1000 * 1000)).to.equal( + "2 GB", + ); + expect(dropzone.filesize(2 * 1024 * 1024 * 1024)).to.equal( + "2.1 GB", + ); + + expect(dropzone.filesize(2.5111 * 1000 * 1000 * 1000)).to.equal( + "2.5 GB", + ); + expect(dropzone.filesize(1.1 * 1000)).to.equal( + "1.1 KB", + ); + return expect(dropzone.filesize(999 * 1000)).to.equal( + "1 MB", + ); }); it("should convert to KibiBytes, etc.. when the filesizeBase is changed to 1024", function () { dropzone.options.filesizeBase = 1024; - dropzone.filesize(2 * 1024 * 1024).should.eql("2 MB"); - return dropzone - .filesize(2 * 1000 * 1000) - .should.eql("1.9 MB"); + expect(dropzone.filesize(2 * 1024 * 1024)).to.equal( + "2 MB", + ); + return expect(dropzone.filesize(2 * 1000 * 1000)).to.equal( + "1.9 MB", + ); }); }); @@ -793,39 +817,41 @@ describe("Dropzone", function () { it("should properly add the dz-max-files-reached class", function () { dropzone.getAcceptedFiles = () => ({ length: 10 }); dropzone.options.maxFiles = 10; - dropzone.element.classList.contains("dz-max-files-reached").should.not - .be.ok; + expect(dropzone.element.classList.contains("dz-max-files-reached")).to + .not.be.ok; dropzone._updateMaxFilesReachedClass(); - return dropzone.element.classList.contains("dz-max-files-reached") - .should.be.ok; + return expect( + dropzone.element.classList.contains("dz-max-files-reached"), + ).to.be.ok; }); it("should fire the 'maxfilesreached' event when appropriate", function () { - let spy = sinon.spy(); + let spy = Cypress.sinon.spy(); dropzone.on("maxfilesreached", () => spy()); dropzone.getAcceptedFiles = () => ({ length: 9 }); dropzone.options.maxFiles = 10; dropzone._updateMaxFilesReachedClass(); - spy.notCalled.should.be.true; + expect(spy.notCalled).to.be.true; dropzone.getAcceptedFiles = () => ({ length: 10 }); dropzone._updateMaxFilesReachedClass(); - spy.called.should.be.true; + expect(spy.called).to.be.true; dropzone.getAcceptedFiles = () => ({ length: 11 }); dropzone._updateMaxFilesReachedClass(); - spy.calledOnce.should.be.true; + expect(spy.calledOnce).to.be.true; }); //ie, it has not been called again it("should properly remove the dz-max-files-reached class", function () { dropzone.getAcceptedFiles = () => ({ length: 10 }); dropzone.options.maxFiles = 10; - dropzone.element.classList.contains("dz-max-files-reached").should.not - .be.ok; + expect(dropzone.element.classList.contains("dz-max-files-reached")).to + .not.be.ok; dropzone._updateMaxFilesReachedClass(); - dropzone.element.classList.contains("dz-max-files-reached").should.be - .ok; + expect(dropzone.element.classList.contains("dz-max-files-reached")).to + .be.ok; dropzone.getAcceptedFiles = () => ({ length: 9 }); dropzone._updateMaxFilesReachedClass(); - return dropzone.element.classList.contains("dz-max-files-reached") - .should.not.be.ok; + return expect( + dropzone.element.classList.contains("dz-max-files-reached"), + ).to.not.be.ok; }); }); @@ -858,7 +884,7 @@ describe("Dropzone", function () { let _called = 0; dropzone.on("totaluploadprogress", function (progress) { - progress.should.equal(totalProgressExpectation); + expect(progress).to.equal(totalProgressExpectation); if (++_called === 3) { return done(); } @@ -928,27 +954,27 @@ describe("Dropzone", function () { it("should only return the fallback element if it contains exactly fallback", function () { element.appendChild( - Dropzone.createElement('
') + Dropzone.createElement('
'), ); element.appendChild( - Dropzone.createElement('
') + Dropzone.createElement('
'), ); return expect(dropzone.getExistingFallback()).to.equal(undefined); }); it("should return divs as fallback", function () { let fallback = Dropzone.createElement( - '
' + '
', ); element.appendChild(fallback); - return fallback.should.equal(dropzone.getExistingFallback()); + return expect(fallback).to.equal(dropzone.getExistingFallback()); }); it("should return forms as fallback", function () { let fallback = Dropzone.createElement( - '
' + '
', ); element.appendChild(fallback); - return fallback.should.equal(dropzone.getExistingFallback()); + return expect(fallback).to.equal(dropzone.getExistingFallback()); }); }); @@ -958,14 +984,14 @@ describe("Dropzone", function () { dropzone.options.paramName = "myFile"; let fallback = dropzone.getFallbackForm(); let fileInput = fallback.querySelector("input[type=file]"); - return fileInput.name.should.equal("myFile"); + return expect(fileInput.name).to.equal("myFile"); }); it("should properly add [0] to the file name if uploadMultiple is true", function () { dropzone.options.uploadMultiple = true; dropzone.options.paramName = "myFile"; let fallback = dropzone.getFallbackForm(); let fileInput = fallback.querySelector("input[type=file]"); - return fileInput.name.should.equal("myFile[0]"); + return expect(fileInput.name).to.equal("myFile[0]"); }); }); @@ -991,9 +1017,9 @@ describe("Dropzone", function () { }); it("getAcceptedFiles() should only return accepted files", () => - dropzone.getAcceptedFiles().should.eql([mock1, mock3])); + expect(dropzone.getAcceptedFiles()).to.deep.equal([mock1, mock3])); it("getRejectedFiles() should only return rejected files", () => - dropzone.getRejectedFiles().should.eql([mock2, mock4])); + expect(dropzone.getRejectedFiles()).to.deep.equal([mock2, mock4])); }); describe("getQueuedFiles()", () => @@ -1010,57 +1036,63 @@ describe("Dropzone", function () { dropzone.addFile(mock3); dropzone.addFile(mock4); - dropzone.getQueuedFiles().should.eql([]); + expect(dropzone.getQueuedFiles()).to.deep.equal([]); mock1.done(); mock3.done(); - dropzone.getQueuedFiles().should.eql([mock1, mock3]); - mock1.status.should.equal(Dropzone.QUEUED); - mock3.status.should.equal(Dropzone.QUEUED); - mock2.status.should.equal(Dropzone.ADDED); - return mock4.status.should.equal(Dropzone.ADDED); + expect(dropzone.getQueuedFiles()).to.deep.equal([mock1, mock3]); + expect(mock1.status).to.equal(Dropzone.QUEUED); + expect(mock3.status).to.equal(Dropzone.QUEUED); + expect(mock2.status).to.equal(Dropzone.ADDED); + return expect(mock4.status).to.equal(Dropzone.ADDED); })); describe("getUploadingFiles()", () => - it("should return all files with the status Dropzone.UPLOADING", function (done) { - let mock1 = getMockFile(); - let mock2 = getMockFile(); - let mock3 = getMockFile(); - let mock4 = getMockFile(); + it("should return all files with the status Dropzone.UPLOADING", function () { + const mock1 = getMockFile(); + const mock2 = getMockFile(); + const mock3 = getMockFile(); + const mock4 = getMockFile(); dropzone.options.accept = (file, _done) => (file.done = _done); - dropzone.uploadFile = function () {}; + + // Important: Dropzone uses uploadFiles(), keep uploads from completing + Cypress.sinon.stub(dropzone, "uploadFiles").callsFake(() => {}); dropzone.addFile(mock1); dropzone.addFile(mock2); dropzone.addFile(mock3); dropzone.addFile(mock4); - dropzone.getUploadingFiles().should.eql([]); + expect(dropzone.getUploadingFiles()).to.deep.equal([]); + // Accept two files mock1.done(); mock3.done(); - return setTimeout(function () { - dropzone.getUploadingFiles().should.eql([mock1, mock3]); - mock1.status.should.equal(Dropzone.UPLOADING); - mock3.status.should.equal(Dropzone.UPLOADING); - mock2.status.should.equal(Dropzone.ADDED); - mock4.status.should.equal(Dropzone.ADDED); - return done(); - }, 10); + // Force processing now that files are accepted + dropzone.processQueue(); + + expect(dropzone.getUploadingFiles()).to.deep.equal([mock1, mock3]); + expect(mock1.status).to.equal(Dropzone.UPLOADING); + expect(mock3.status).to.equal(Dropzone.UPLOADING); + expect(mock2.status).to.equal(Dropzone.ADDED); + expect(mock4.status).to.equal(Dropzone.ADDED); })); describe("getActiveFiles()", () => - it("should return all files with the status Dropzone.UPLOADING or Dropzone.QUEUED", function (done) { - let mock1 = getMockFile(); - let mock2 = getMockFile(); - let mock3 = getMockFile(); - let mock4 = getMockFile(); + it("should return all files with the status Dropzone.UPLOADING or Dropzone.QUEUED", function () { + const mock1 = getMockFile(); + const mock2 = getMockFile(); + const mock3 = getMockFile(); + const mock4 = getMockFile(); dropzone.options.accept = (file, _done) => (file.done = _done); - dropzone.uploadFile = function () {}; + + // IMPORTANT: stub the method Dropzone actually uses + Cypress.sinon.stub(dropzone, "uploadFiles").callsFake(() => {}); + dropzone.options.parallelUploads = 2; dropzone.addFile(mock1); @@ -1068,20 +1100,22 @@ describe("Dropzone", function () { dropzone.addFile(mock3); dropzone.addFile(mock4); - dropzone.getActiveFiles().should.eql([]); + expect(dropzone.getActiveFiles()).to.deep.equal([]); + // Accept 1,3,4 (leave 2 unaccepted) mock1.done(); mock3.done(); mock4.done(); - return setTimeout(function () { - dropzone.getActiveFiles().should.eql([mock1, mock3, mock4]); - mock1.status.should.equal(Dropzone.UPLOADING); - mock3.status.should.equal(Dropzone.UPLOADING); - mock2.status.should.equal(Dropzone.ADDED); - mock4.status.should.equal(Dropzone.QUEUED); - return done(); - }, 10); + // Force queue processing now that files are accepted + dropzone.processQueue(); + + expect(dropzone.getActiveFiles()).to.deep.equal([mock1, mock3, mock4]); + + expect(mock1.status).to.equal(Dropzone.UPLOADING); + expect(mock3.status).to.equal(Dropzone.UPLOADING); + expect(mock2.status).to.equal(Dropzone.ADDED); + expect(mock4.status).to.equal(Dropzone.QUEUED); })); return describe("getFilesWithStatus()", () => @@ -1099,19 +1133,26 @@ describe("Dropzone", function () { dropzone.addFile(mock3); dropzone.addFile(mock4); - dropzone - .getFilesWithStatus(Dropzone.ADDED) - .should.eql([mock1, mock2, mock3, mock4]); + expect(dropzone.getFilesWithStatus(Dropzone.ADDED)).to.deep.equal([ + mock1, + mock2, + mock3, + mock4, + ]); mock1.status = Dropzone.UPLOADING; mock3.status = Dropzone.QUEUED; mock4.status = Dropzone.QUEUED; - dropzone.getFilesWithStatus(Dropzone.ADDED).should.eql([mock2]); - dropzone.getFilesWithStatus(Dropzone.UPLOADING).should.eql([mock1]); - return dropzone - .getFilesWithStatus(Dropzone.QUEUED) - .should.eql([mock3, mock4]); + expect(dropzone.getFilesWithStatus(Dropzone.ADDED)).to.deep.equal([ + mock2, + ]); + expect(dropzone.getFilesWithStatus(Dropzone.UPLOADING)).to.deep.equal([ + mock1, + ]); + return expect( + dropzone.getFilesWithStatus(Dropzone.QUEUED), + ).to.deep.equal([mock3, mock4]); })); }); @@ -1138,16 +1179,16 @@ describe("Dropzone", function () { dropzone.addFile(mockFile); - mockFile.status.should.eql(Dropzone.ADDED); + expect(mockFile.status).to.equal(Dropzone.ADDED); doneFunction(); - mockFile.status.should.eql(Dropzone.QUEUED); + expect(mockFile.status).to.equal(Dropzone.QUEUED); mockFile = getMockFile(); dropzone.addFile(mockFile); - mockFile.status.should.eql(Dropzone.ADDED); + expect(mockFile.status).to.equal(Dropzone.ADDED); doneFunction("error"); - return mockFile.status.should.eql(Dropzone.ERROR); + return expect(mockFile.status).to.equal(Dropzone.ERROR); }); it("should properly set the status of the file if autoProcessQueue is false and not call processQueue", function (done) { @@ -1158,14 +1199,14 @@ describe("Dropzone", function () { dropzone.uploadFile = function () {}; dropzone.addFile(mockFile); - sinon.stub(dropzone, "processQueue"); + Cypress.sinon.stub(dropzone, "processQueue"); - mockFile.status.should.eql(Dropzone.ADDED); + expect(mockFile.status).to.equal(Dropzone.ADDED); doneFunction(); - mockFile.status.should.eql(Dropzone.QUEUED); - dropzone.processQueue.callCount.should.equal(0); + expect(mockFile.status).to.equal(Dropzone.QUEUED); + expect(dropzone.processQueue.callCount).to.equal(0); return setTimeout(function () { - dropzone.processQueue.callCount.should.equal(0); + expect(dropzone.processQueue.callCount).to.equal(0); return done(); }, 10); }); @@ -1179,9 +1220,9 @@ describe("Dropzone", function () { dropzone.addFile(mockFile); - mockFile.status.should.eql(Dropzone.ADDED); + expect(mockFile.status).to.equal(Dropzone.ADDED); doneFunction(); - return mockFile.status.should.eql(Dropzone.ADDED); + return expect(mockFile.status).to.equal(Dropzone.ADDED); }); it("should create a remove link if configured to do so", function () { @@ -1189,12 +1230,14 @@ describe("Dropzone", function () { dropzone.processFile = function () {}; dropzone.uploadFile = function () {}; - sinon.stub(dropzone, "processQueue"); + Cypress.sinon.stub(dropzone, "processQueue"); dropzone.addFile(mockFile); - return dropzone.files[0].previewElement.querySelector( - "a[data-dz-remove].dz-remove" - ).should.be.ok; + return expect( + dropzone.files[0].previewElement.querySelector( + "a[data-dz-remove].dz-remove", + ), + ).to.be.ok; }); it("should create a remove link with HTML if configured to do so", function () { @@ -1204,16 +1247,20 @@ describe("Dropzone", function () { dropzone.processFile = function () {}; dropzone.uploadFile = function () {}; - sinon.stub(dropzone, "processQueue"); + Cypress.sinon.stub(dropzone, "processQueue"); dropzone.addFile(mockFile); return ( - dropzone.files[0].previewElement.querySelector( - "a[data-dz-remove].dz-remove" - ).should.be.ok && - dropzone.files[0].previewElement - .querySelector("a[data-dz-remove].dz-remove") - .innerHTML.should.equal(' Remove') + expect( + dropzone.files[0].previewElement.querySelector( + "a[data-dz-remove].dz-remove", + ), + ).to.be.ok && + expect( + dropzone.files[0].previewElement.querySelector( + "a[data-dz-remove].dz-remove", + ).innerHTML, + ).to.equal(' Remove') ); }); @@ -1234,31 +1281,31 @@ describe("Dropzone", function () { \ `; - sinon.stub(dropzone, "processQueue"); + Cypress.sinon.stub(dropzone, "processQueue"); dropzone.addFile(mockFile); let file = dropzone.files[0]; let removeLink1 = file.previewElement.querySelector( - "a[data-dz-remove].link1" + "a[data-dz-remove].link1", ); let removeLink2 = file.previewElement.querySelector( - "a[data-dz-remove].link2" + "a[data-dz-remove].link2", ); - sinon.stub(dropzone, "removeFile"); + Cypress.sinon.stub(dropzone, "removeFile"); let event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); removeLink1.dispatchEvent(event); - dropzone.removeFile.callCount.should.eql(1); + expect(dropzone.removeFile.callCount).to.equal(1); event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); removeLink2.dispatchEvent(event); - return dropzone.removeFile.callCount.should.eql(2); + return expect(dropzone.removeFile.callCount).to.equal(2); }); return describe("thumbnails", function () { @@ -1281,28 +1328,28 @@ describe("Dropzone", function () { thumbnailHeight, resizeMethod, fixOrientation, - callback + callback, ) { ct_file = file; ct_callback = callback; }; - sinon.spy(dropzone, "createThumbnail"); + Cypress.sinon.spy(dropzone, "createThumbnail"); dropzone.addFile(mock1); dropzone.addFile(mock2); dropzone.addFile(mock3); - dropzone.files.length.should.eql(3); + expect(dropzone.files.length).to.equal(3); return setTimeout(function () { - dropzone.createThumbnail.callCount.should.eql(1); - mock1.should.equal(ct_file); + expect(dropzone.createThumbnail.callCount).to.equal(1); + expect(mock1).to.equal(ct_file); ct_callback(); - dropzone.createThumbnail.callCount.should.eql(2); - mock2.should.equal(ct_file); + expect(dropzone.createThumbnail.callCount).to.equal(2); + expect(mock2).to.equal(ct_file); ct_callback(); - dropzone.createThumbnail.callCount.should.eql(3); - mock3.should.equal(ct_file); + expect(dropzone.createThumbnail.callCount).to.equal(3); + expect(mock3).to.equal(ct_file); return done(); }, 10); @@ -1336,11 +1383,11 @@ describe("Dropzone", function () { function (dataURI, canvas) { let fileReader = new FileReader(); fileReader.onload = function () { - fileReader.result.should.equal(dataURI); + expect(fileReader.result).to.equal(dataURI); return done(); }; return fileReader.readAsDataURL(blob); - } + }, ); })); }); @@ -1348,7 +1395,7 @@ describe("Dropzone", function () { describe("enqueueFile()", function () { it("should be wrapped by enqueueFiles()", function () { - sinon.stub(dropzone, "enqueueFile"); + Cypress.sinon.stub(dropzone, "enqueueFile"); let mock1 = getMockFile(); let mock2 = getMockFile(); @@ -1356,167 +1403,338 @@ describe("Dropzone", function () { dropzone.enqueueFiles([mock1, mock2, mock3]); - dropzone.enqueueFile.callCount.should.equal(3); - dropzone.enqueueFile.args[0][0].should.equal(mock1); - dropzone.enqueueFile.args[1][0].should.equal(mock2); - return dropzone.enqueueFile.args[2][0].should.equal(mock3); + expect(dropzone.enqueueFile.callCount).to.equal(3); + expect(dropzone.enqueueFile.args[0][0]).to.equal(mock1); + expect(dropzone.enqueueFile.args[1][0]).to.equal(mock2); + return expect(dropzone.enqueueFile.args[2][0]).to.equal(mock3); }); it("should fail if the file has already been processed", function () { mockFile.status = Dropzone.ERROR; expect(() => dropzone.enqueueFile(mockFile)).to.throw( - "This file can't be queued because it has already been processed or was rejected." + "This file can't be queued because it has already been processed or was rejected.", ); mockFile.status = Dropzone.COMPLETE; expect(() => dropzone.enqueueFile(mockFile)).to.throw( - "This file can't be queued because it has already been processed or was rejected." + "This file can't be queued because it has already been processed or was rejected.", ); mockFile.status = Dropzone.UPLOADING; return expect(() => dropzone.enqueueFile(mockFile)).to.throw( - "This file can't be queued because it has already been processed or was rejected." + "This file can't be queued because it has already been processed or was rejected.", ); }); it("should set the status to QUEUED and call processQueue asynchronously if everything's ok", function (done) { mockFile.status = Dropzone.ADDED; - sinon.stub(dropzone, "processQueue"); - dropzone.processQueue.callCount.should.equal(0); + Cypress.sinon.stub(dropzone, "processQueue"); + expect(dropzone.processQueue.callCount).to.equal(0); dropzone.enqueueFile(mockFile); - mockFile.status.should.equal(Dropzone.QUEUED); - dropzone.processQueue.callCount.should.equal(0); + expect(mockFile.status).to.equal(Dropzone.QUEUED); + expect(dropzone.processQueue.callCount).to.equal(0); return setTimeout(function () { - dropzone.processQueue.callCount.should.equal(1); + expect(dropzone.processQueue.callCount).to.equal(1); return done(); }, 10); }); }); describe("uploadFiles()", function () { + let xhr; let requests; - beforeEach(function () { requests = []; + xhr = Cypress.sinon.useFakeXMLHttpRequest(); return (xhr.onCreate = (xhr) => requests.push(xhr)); }); - afterEach(() => xhr.restore()); + afterEach(() => { + if (xhr && typeof xhr.restore === "function") xhr.restore(); + }); // Removed this test because multiple filenames can be transmitted now // it "should properly urlencode the filename for the headers" it("should be wrapped by uploadFile()", function () { - sinon.stub(dropzone, "uploadFiles"); + Cypress.sinon.stub(dropzone, "uploadFiles"); dropzone.uploadFile(mockFile); - dropzone.uploadFiles.callCount.should.equal(1); - return dropzone.uploadFiles.calledWith([mockFile]).should.be.ok; + expect(dropzone.uploadFiles.callCount).to.equal(1); + expect(dropzone.uploadFiles.calledWith([mockFile])).to.be.ok; }); + describe("with real XHR (cy.intercept)", function () { + beforeEach(function () { + // turn fake XHR off so Cypress can observe real requests + xhr.restore(); + }); + it("should use url options if strings", function () { + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; - it("should use url options if strings", function (done) { - dropzone.addFile(mockFile); + const method = String( + dropzone.options.method || "post", + ).toUpperCase(); + const urlPath = String(dropzone.options.url); - return setTimeout(function () { - expect(requests.length).to.equal(1); - expect(requests[0].url).to.equal(dropzone.options.url); - expect(requests[0].method).to.equal(dropzone.options.method); - return done(); - }, 10); - }); + const OriginalXHR = window.XMLHttpRequest; - it("should call url options if functions", function (done) { - let method = "PUT"; - let url = "/custom/upload/url"; + const openSpy = Cypress.sinon.spy(OriginalXHR.prototype, "open"); + const sendStub = Cypress.sinon + .stub(OriginalXHR.prototype, "send") + .callsFake(() => {}); - dropzone.options.method = sinon.stub().returns(method); - dropzone.options.url = sinon.stub().returns(url); + try { + dropzone.addFile(mockFile); + dropzone.processQueue(); - dropzone.addFile(mockFile); + expect(openSpy.callCount).to.be.greaterThan(0); - return setTimeout(function () { - dropzone.options.method.callCount.should.equal(1); - dropzone.options.url.callCount.should.equal(1); - sinon.assert.calledWith(dropzone.options.method, [mockFile]); - sinon.assert.calledWith(dropzone.options.url, [mockFile]); - expect(requests.length).to.equal(1); - expect(requests[0].url).to.equal(url); - expect(requests[0].method).to.equal(method); - return done(); - }, 10); - }); + // XHR.open(method, url, ...) + const [calledMethod, calledUrl] = openSpy.args[0]; - it("should use the timeout option", function (done) { - dropzone.options.timeout = 10000; - dropzone.addFile(mockFile); + expect(String(calledMethod).toUpperCase()).to.equal(method); + expect(String(calledUrl)).to.match( + new RegExp(`${urlPath.replace(/^\/+/, "")}$`), + ); + } finally { + sendStub.restore(); + openSpy.restore(); + } + }); + it("should call url options if functions", function () { + const method = "PUT"; + const url = "/custom/upload/url"; - return setTimeout(function () { - expect(requests[0].timeout).to.equal(10000); - return done(); - }, 10); - }); + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; - it("should properly handle if timeout is null", function (done) { - dropzone.options.timeout = null; - dropzone.addFile(mockFile); + dropzone.options.method = Cypress.sinon.stub().callsFake((files) => { + expect(files).to.deep.equal([mockFile]); + return method; + }); - return setTimeout(function () { - expect(requests[0].timeout).to.equal(0); - return done(); - }, 10); - }); + dropzone.options.url = Cypress.sinon.stub().callsFake((files) => { + expect(files).to.deep.equal([mockFile]); + return url; + }); - it("should ignore the onreadystate callback if readyState != 4", function (done) { - dropzone.addFile(mockFile); - return setTimeout(function () { - mockFile.status.should.eql(Dropzone.UPLOADING); + const openSpy = Cypress.sinon.spy( + window.XMLHttpRequest.prototype, + "open", + ); + const sendStub = Cypress.sinon + .stub(window.XMLHttpRequest.prototype, "send") + .callsFake(() => {}); - requests[0].status = 200; - requests[0].readyState = 3; - requests[0].responseHeaders = { "content-type": "text/plain" }; - requests[0].onload(); + try { + dropzone.addFile(mockFile); + dropzone.processQueue(); + + // verify option functions were called + expect(dropzone.options.method.callCount).to.equal(1); + expect(dropzone.options.url.callCount).to.equal(1); + Cypress.sinon.assert.calledWith(dropzone.options.method, [ + mockFile, + ]); + Cypress.sinon.assert.calledWith(dropzone.options.url, [mockFile]); + + // verify request used returned method/url + expect(openSpy.callCount).to.be.greaterThan(0); + const [calledMethod, calledUrl] = openSpy.args[0]; + expect(String(calledMethod).toUpperCase()).to.equal(method); + expect(String(calledUrl)).to.match( + new RegExp(`${url.replace(/^\/+/, "")}$`), + ); + } finally { + sendStub.restore(); + openSpy.restore(); + } + }); - mockFile.status.should.eql(Dropzone.UPLOADING); + it("should use the timeout option", function () { + dropzone.accept = (file, done) => done(); + dropzone.options.timeout = 10000; - requests[0].readyState = 4; - requests[0].onload(); + const OriginalXHR = window.XMLHttpRequest; + const openSpy = Cypress.sinon.spy(OriginalXHR.prototype, "open"); - mockFile.status.should.eql(Dropzone.SUCCESS); - return done(); - }, 10); - }); + const xhrInstances = []; + function WrappedXHR() { + const xhr = new OriginalXHR(); + xhrInstances.push(xhr); + return xhr; + } + WrappedXHR.prototype = OriginalXHR.prototype; - it("should emit error and errormultiple when response was not OK", function (done) { - dropzone.options.uploadMultiple = true; + window.XMLHttpRequest = WrappedXHR; - let error = false; - let errormultiple = false; - let complete = false; - let completemultiple = false; - dropzone.on("error", () => (error = true)); - dropzone.on("errormultiple", () => (errormultiple = true)); - dropzone.on("complete", () => (complete = true)); - dropzone.on("completemultiple", () => (completemultiple = true)); + try { + dropzone.addFile(mockFile); + dropzone.processFile(mockFile); + + expect(openSpy.callCount).to.be.greaterThan(0); + expect(xhrInstances.length).to.be.greaterThan(0); + expect(xhrInstances[0].timeout).to.equal(10000); + } finally { + window.XMLHttpRequest = OriginalXHR; + openSpy.restore(); + } + }); - dropzone.addFile(mockFile); + it("should properly handle if timeout is null", function () { + dropzone.accept = (file, done) => done(); + dropzone.options.timeout = null; - return setTimeout(function () { - mockFile.status.should.eql(Dropzone.UPLOADING); + // Prevent racing ahead before we start the upload + dropzone.options.autoProcessQueue = false; - requests[0].status = 400; - requests[0].readyState = 4; - requests[0].responseHeaders = { "content-type": "text/plain" }; - requests[0].onload(); + const OriginalXHR = window.XMLHttpRequest; + const openSpy = Cypress.sinon.spy(OriginalXHR.prototype, "open"); - expect( - true === error && - error === errormultiple && - errormultiple === complete && - complete === completemultiple - ).to.be.ok; + try { + dropzone.addFile(mockFile); + dropzone.processQueue(); - return done(); - }, 10); + expect(openSpy.callCount).to.be.greaterThan(0); + + const xhr0 = openSpy.thisValues[0]; + expect(xhr0).to.exist; + expect(xhr0.timeout).to.equal(0); + } finally { + openSpy.restore(); + } + }); + + it("should ignore the onreadystate callback if readyState != 4", function () { + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; + + const OriginalXHR = window.XMLHttpRequest; + + let xhr; + function WrappedXHR() { + xhr = new OriginalXHR(); + return xhr; + } + WrappedXHR.prototype = OriginalXHR.prototype; + + window.XMLHttpRequest = WrappedXHR; + + try { + dropzone.addFile(mockFile); + dropzone.processQueue(); + + expect(mockFile.status).to.equal(Dropzone.UPLOADING); + + // Prepare response-ish fields Dropzone might read (read-only on real XHR => define getters) + Object.defineProperty(xhr, "status", { + configurable: true, + get() { + return 200; + }, + }); + + Object.defineProperty(xhr, "responseText", { + configurable: true, + get() { + return "ok"; + }, + }); + + xhr.getResponseHeader = () => "text/plain"; + + const trigger = () => { + if (typeof xhr.onreadystatechange === "function") + xhr.onreadystatechange(); + else if (typeof xhr.onload === "function") xhr.onload(); + if (typeof xhr.onloadend === "function") xhr.onloadend(); + }; + + // Force readyState = 3 (non-final) and trigger callback + Object.defineProperty(xhr, "readyState", { + value: 3, + configurable: true, + }); + trigger(); + + expect(mockFile.status).to.equal(Dropzone.UPLOADING); + + // Force readyState = 4 (final) and trigger callback + Object.defineProperty(xhr, "readyState", { + value: 4, + configurable: true, + }); + trigger(); + + expect(mockFile.status).to.equal(Dropzone.SUCCESS); + } finally { + window.XMLHttpRequest = OriginalXHR; + } + }); + it("should emit error and errormultiple when response was not OK", function () { + dropzone.options.uploadMultiple = true; + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; + + let error = false; + let errormultiple = false; + let complete = false; + let completemultiple = false; + + dropzone.on("error", () => (error = true)); + dropzone.on("errormultiple", () => (errormultiple = true)); + dropzone.on("complete", () => (complete = true)); + dropzone.on("completemultiple", () => (completemultiple = true)); + + const sendStub = Cypress.sinon + .stub(window.XMLHttpRequest.prototype, "send") + .callsFake(function () { + Object.defineProperty(this, "status", { + configurable: true, + get() { + return 400; + }, + }); + + Object.defineProperty(this, "readyState", { + configurable: true, + get() { + return 4; + }, + }); + + Object.defineProperty(this, "responseText", { + configurable: true, + get() { + return "nope"; + }, + }); + + this.getResponseHeader = () => "text/plain"; + + if (typeof this.onreadystatechange === "function") + this.onreadystatechange(); + if (typeof this.onload === "function") this.onload(); + if (typeof this.onloadend === "function") this.onloadend(); + }); + + try { + dropzone.addFile(mockFile); + dropzone.processQueue(); + + expect(mockFile.status).to.equal(Dropzone.ERROR); + + expect( + true === error && + error === errormultiple && + errormultiple === complete && + complete === completemultiple, + ).to.be.ok; + } finally { + sendStub.restore(); + } + }); }); it("should include hidden files in the form and unchecked checkboxes and radiobuttons should be excluded", function (done) { @@ -1533,7 +1751,7 @@ describe("Dropzone", function () { let formData = null; dropzone.on("sending", function (file, xhr, tformData) { formData = tformData; - return sinon.spy(tformData, "append"); + return Cypress.sinon.spy(tformData, "append"); }); let mock1 = getMockFile(); @@ -1541,24 +1759,24 @@ describe("Dropzone", function () { dropzone.addFile(mock1); return setTimeout(function () { - formData.append.callCount.should.equal(5); + expect(formData.append.callCount).to.equal(5); - formData.append.args[0][0].should.eql("test"); - formData.append.args[0][1].should.eql("hidden"); + expect(formData.append.args[0][0]).to.equal("test"); + expect(formData.append.args[0][1]).to.equal("hidden"); - formData.append.args[1][0].should.eql("checked"); - formData.append.args[1][1].should.eql("value1"); + expect(formData.append.args[1][0]).to.equal("checked"); + expect(formData.append.args[1][1]).to.equal("value1"); - formData.append.args[2][0].should.eql("radio1"); - formData.append.args[2][1].should.eql("radiovalue2"); + expect(formData.append.args[2][0]).to.equal("radio1"); + expect(formData.append.args[2][1]).to.equal("radiovalue2"); - formData.append.args[3][0].should.eql("select"); - formData.append.args[3][1].should.eql("2"); + expect(formData.append.args[3][0]).to.equal("select"); + expect(formData.append.args[3][1]).to.equal("2"); - formData.append.args[4][0].should.eql("file"); - formData.append.args[4][1].should.equal(mock1); + expect(formData.append.args[4][0]).to.equal("file"); + expect(formData.append.args[4][1]).to.equal(mock1); - // formData.append.args[1][0].should.eql "myName[]" + // formData.append.args[1][0]).to.eql "myName[]" return done(); }, 10); }); @@ -1577,7 +1795,7 @@ describe("Dropzone", function () { let formData = null; dropzone.on("sending", function (file, xhr, tformData) { formData = tformData; - return sinon.spy(tformData, "append"); + return Cypress.sinon.spy(tformData, "append"); }); let mock1 = getMockFile(); @@ -1585,45 +1803,99 @@ describe("Dropzone", function () { dropzone.addFile(mock1); return setTimeout(function () { - formData.append.callCount.should.equal(3); + expect(formData.append.callCount).to.equal(3); - formData.append.args[0][0].should.eql("select"); - formData.append.args[0][1].should.eql("value2"); + expect(formData.append.args[0][0]).to.equal("select"); + expect(formData.append.args[0][1]).to.equal("value2"); - formData.append.args[1][0].should.eql("select"); - formData.append.args[1][1].should.eql("value4"); + expect(formData.append.args[1][0]).to.equal("select"); + expect(formData.append.args[1][1]).to.equal("value4"); - formData.append.args[2][0].should.eql("file"); - formData.append.args[2][1].should.equal(mock1); + expect(formData.append.args[2][0]).to.equal("file"); + expect(formData.append.args[2][1]).to.equal(mock1); - // formData.append.args[1][0].should.eql "myName[]" + // formData.append.args[1][0]).to.eql "myName[]" return done(); }, 10); }); describe("settings()", function () { it("should correctly set `withCredentials` on the xhr object", function () { - dropzone.uploadFile(mockFile); - requests.length.should.eql(1); - requests[0].withCredentials.should.eql(false); - dropzone.options.withCredentials = true; - dropzone.uploadFile(mockFile); - requests.length.should.eql(2); - return requests[1].withCredentials.should.eql(true); + const OriginalXHR = window.XMLHttpRequest; + + const openSpy = Cypress.sinon.spy(OriginalXHR.prototype, "open"); + const sendStub = Cypress.sinon + .stub(OriginalXHR.prototype, "send") + .callsFake(() => {}); + + try { + // first upload: default is false + dropzone.options.withCredentials = false; + dropzone.uploadFile(mockFile); + + expect(openSpy.callCount).to.be.greaterThan(0); + const xhr1 = openSpy.thisValues[0]; + expect(xhr1).to.exist; + expect(xhr1.withCredentials).to.equal(false); + + // second upload: set true + dropzone.options.withCredentials = true; + dropzone.uploadFile(mockFile); + + expect(openSpy.callCount).to.be.greaterThan(1); + const xhr2 = openSpy.thisValues[1]; + expect(xhr2).to.exist; + expect(xhr2.withCredentials).to.equal(true); + } finally { + sendStub.restore(); + openSpy.restore(); + } }); it("should correctly override headers on the xhr object", function () { dropzone.options.headers = { "Foo-Header": "foobar" }; - dropzone.uploadFile(mockFile); - return requests[0].requestHeaders["Foo-Header"].should.eql("foobar"); - }); + const setHeaderSpy = Cypress.sinon.spy( + window.XMLHttpRequest.prototype, + "setRequestHeader", + ); + + // Prevent any real network / completion side effects + const sendStub = Cypress.sinon + .stub(window.XMLHttpRequest.prototype, "send") + .callsFake(() => {}); + + try { + dropzone.uploadFile(mockFile); + + expect(setHeaderSpy.calledWith("Foo-Header", "foobar")).to.be.ok; + } finally { + sendStub.restore(); + setHeaderSpy.restore(); + } + }); it("should not set headers on the xhr object that are empty", function () { dropzone.options.headers = { "X-Requested-With": null }; - dropzone.uploadFile(mockFile); - return Object.keys(requests[0].requestHeaders).should.not.contain( - "X-Requested-With" + + const setHeaderSpy = Cypress.sinon.spy( + window.XMLHttpRequest.prototype, + "setRequestHeader", ); + + // Prevent any real network / completion side effects + const sendStub = Cypress.sinon + .stub(window.XMLHttpRequest.prototype, "send") + .callsFake(() => {}); + + try { + dropzone.uploadFile(mockFile); + + const headerNames = setHeaderSpy.args.map((a) => a[0]); + expect(headerNames).to.not.contain("X-Requested-With"); + } finally { + sendStub.restore(); + setHeaderSpy.restore(); + } }); it("should properly use the paramName without [n] as file upload if uploadMultiple is false", function (done) { @@ -1636,7 +1908,7 @@ describe("Dropzone", function () { sendingCount++; formData.push(tformData); - return sinon.spy(tformData, "append"); + return Cypress.sinon.spy(tformData, "append"); }); let mock1 = getMockFile(); @@ -1646,52 +1918,60 @@ describe("Dropzone", function () { dropzone.addFile(mock2); return setTimeout(function () { - sendingCount.should.equal(2); + expect(sendingCount).to.equal(2); - formData.length.should.equal(2); - formData[0].append.callCount.should.equal(1); - formData[1].append.callCount.should.equal(1); - formData[0].append.args[0][0].should.eql("myName"); - formData[0].append.args[0][0].should.eql("myName"); + expect(formData.length).to.equal(2); + expect(formData[0].append.callCount).to.equal(1); + expect(formData[1].append.callCount).to.equal(1); + expect(formData[0].append.args[0][0]).to.equal("myName"); + expect(formData[0].append.args[0][0]).to.equal("myName"); return done(); }, 10); }); - it("should properly use the paramName with [n] as file upload if uploadMultiple is true", function (done) { + it("should properly use the paramName with [n] as file upload if uploadMultiple is true", function () { dropzone.options.uploadMultiple = true; dropzone.options.paramName = "myName"; + // Ensure the sending events actually fire + dropzone.accept = (file, done) => done(); + let formData = null; let sendingMultipleCount = 0; let sendingCount = 0; - dropzone.on("sending", (file, xhr, tformData) => sendingCount++); + + dropzone.on("sending", () => { + sendingCount++; + }); + dropzone.on("sendingmultiple", function (files, xhr, tformData) { sendingMultipleCount++; formData = tformData; - return sinon.spy(tformData, "append"); + Cypress.sinon.spy(tformData, "append"); }); - let mock1 = getMockFile(); - let mock2 = getMockFile(); + const mock1 = getMockFile(); + const mock2 = getMockFile(); + // Add files so Dropzone knows about them (and will emit per-file events) dropzone.addFile(mock1); dropzone.addFile(mock2); - return setTimeout(function () { - sendingCount.should.equal(2); - sendingMultipleCount.should.equal(1); - dropzone.uploadFiles([mock1, mock2]); - formData.append.callCount.should.equal(2); - formData.append.args[0][0].should.eql("myName[0]"); - formData.append.args[1][0].should.eql("myName[1]"); - return done(); - }, 10); - }); + // Trigger the multi-upload directly (no timers) + dropzone.uploadFiles([mock1, mock2]); + expect(sendingCount).to.equal(2); + expect(sendingMultipleCount).to.equal(1); + + expect(formData).to.exist; + expect(formData.append.callCount).to.equal(2); + expect(formData.append.args[0][0]).to.equal("myName[0]"); + expect(formData.append.args[1][0]).to.equal("myName[1]"); + }); it("should use resizeImage if dimensions are provided", function (done) { - sinon.stub(dropzone, "resizeImage"); - sinon.stub(dropzone, "createThumbnail"); + Cypress.sinon.stub(dropzone, "resizeImage"); + Cypress.sinon.stub(dropzone, "createThumbnail"); dropzone.options.resizeWidth = 400; @@ -1700,13 +1980,13 @@ describe("Dropzone", function () { dropzone.addFile(mock1); return setTimeout(function () { - dropzone.resizeImage.callCount.should.eql(1); + expect(dropzone.resizeImage.callCount).to.equal(1); return done(); }, 10); }); it("should not use resizeImage for SVG if dimensions are provided", function (done) { - sinon.stub(dropzone, "uploadFiles"); + Cypress.sinon.stub(dropzone, "uploadFiles"); dropzone.createThumbnail = function ( file, @@ -1714,7 +1994,7 @@ describe("Dropzone", function () { height, resizeMethod, fixOrientation, - callback + callback, ) { callback(null, null); }; @@ -1726,30 +2006,30 @@ describe("Dropzone", function () { dropzone.addFile(mock1); setTimeout(function () { - dropzone.uploadFiles.callCount.should.eql(1); + expect(dropzone.uploadFiles.callCount).to.equal(1); let uploadedFiles = dropzone.uploadFiles.getCall(0).args[0]; - uploadedFiles.should.eql([mock1]); + expect(uploadedFiles).to.deep.equal([mock1]); done(); }, 10); }); it("should not use resizeImage if dimensions are not provided", function (done) { - sinon.stub(dropzone, "resizeImage"); - sinon.stub(dropzone, "createThumbnail"); + Cypress.sinon.stub(dropzone, "resizeImage"); + Cypress.sinon.stub(dropzone, "createThumbnail"); let mock1 = getMockFile("image/jpeg"); dropzone.addFile(mock1); return setTimeout(function () { - dropzone.resizeImage.callCount.should.eql(0); + expect(dropzone.resizeImage.callCount).to.equal(0); return done(); }, 10); }); it("should not use resizeImage if file is not an image", function (done) { - sinon.stub(dropzone, "resizeImage"); - sinon.stub(dropzone, "createThumbnail"); + Cypress.sinon.stub(dropzone, "resizeImage"); + Cypress.sinon.stub(dropzone, "createThumbnail"); dropzone.options.resizeWidth = 400; @@ -1758,7 +2038,7 @@ describe("Dropzone", function () { dropzone.addFile(mock1); return setTimeout(function () { - dropzone.resizeImage.callCount.should.eql(0); + expect(dropzone.resizeImage.callCount).to.equal(0); return done(); }, 10); }); @@ -1770,7 +2050,7 @@ describe("Dropzone", function () { let renamedFilename = dropzone._renameFile(mockFile); - renamedFilename.should.equal(mockFilename); + expect(renamedFilename).to.equal(mockFilename); return done(); }); @@ -1782,71 +2062,110 @@ describe("Dropzone", function () { let renamedFilename = dropzone._renameFile(mockFile); - renamedFilename.should.equal("t3st_"); + expect(renamedFilename).to.equal("t3st_"); return done(); }); - return describe("should properly set status of file", () => - it("should correctly set `withCredentials` on the xhr object", function (done) { - dropzone.addFile(mockFile); + describe("should properly set status of file", function () { + let xhr; + let requests; - setTimeout(function () { - mockFile.status.should.eql(Dropzone.UPLOADING); - - requests.length.should.equal(1); - requests[0].status = 400; - requests[0].readyState = 4; - requests[0].responseHeaders = { "content-type": "text/plain" }; + beforeEach(function () { + requests = []; + xhr = Cypress.sinon.useFakeXMLHttpRequest(); - requests[0].onload(); + return (xhr.onCreate = (xhr) => requests.push(xhr)); + }); - mockFile.status.should.eql(Dropzone.ERROR); + afterEach(() => { + if (xhr && typeof xhr.restore === "function") xhr.restore(); + }); + it("should correctly set `withCredentials` on the xhr object", function () { + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; + + const OriginalXHR = window.XMLHttpRequest; + + const sendStub = Cypress.sinon + .stub(OriginalXHR.prototype, "send") + .callsFake(function () { + // 1st send => 400, 2nd send => 200 + const statusCode = sendStub.callCount === 1 ? 400 : 200; + + // status is read-only on real XHR: define a getter instead + Object.defineProperty(this, "status", { + configurable: true, + get() { + return statusCode; + }, + }); + + Object.defineProperty(this, "readyState", { + configurable: true, + get() { + return 4; + }, + }); + + // responseText can be read-only too + Object.defineProperty(this, "responseText", { + configurable: true, + get() { + return ""; + }, + }); + + this.getResponseHeader = () => "text/plain"; + + if (typeof this.onreadystatechange === "function") + this.onreadystatechange(); + if (typeof this.onload === "function") this.onload(); + if (typeof this.onloadend === "function") this.onloadend(); + }); + + try { + // first file => ERROR + dropzone.addFile(mockFile); + dropzone.processQueue(); + expect(mockFile.status).to.equal(Dropzone.ERROR); + // second file => SUCCESS mockFile = getMockFile(); dropzone.addFile(mockFile); - - setTimeout(function () { - mockFile.status.should.eql(Dropzone.UPLOADING); - - requests.length.should.equal(2); - requests[1].status = 200; - requests[1].readyState = 4; - requests[1].responseHeaders = { "content-type": "text/plain" }; - - requests[1].onload(); - - mockFile.status.should.eql(Dropzone.SUCCESS); - return done(); - }, 10); - }, 10); - })); + dropzone.processQueue(); + expect(mockFile.status).to.equal(Dropzone.SUCCESS); + } finally { + sendStub.restore(); + } + }); + }); }); describe("transformFile()", function () { it("should be invoked and the result should be uploaded if configured", (done) => { - sinon.stub(dropzone, "_uploadData"); + Cypress.sinon.stub(dropzone, "_uploadData"); let mock1 = getMockFile("text/html", "original-file"); let mock2 = getMockFile("text/html", "transformed-file"); dropzone.options.transformFile = (file, done) => { - file.should.eql(mock1); + expect(file).to.equal(mock1); done(mock2); }; dropzone.addFile(mock1); setTimeout(function () { - dropzone._uploadData.callCount.should.equal(1); + expect(dropzone._uploadData.callCount).to.equal(1); let uploadedFiles = dropzone._uploadData.args[0][0]; let uploadedDataBlocks = dropzone._uploadData.args[0][1]; - uploadedFiles[0].should.equal(mock1); - uploadedDataBlocks[0].data.should.equal(mock2); + expect(uploadedFiles[0]).to.equal(mock1); + expect(uploadedDataBlocks[0].data).to.equal(mock2); done(); }, 10); }); it("should be used as a basis for chunked uploads", (done) => { - sinon.stub(dropzone, "_uploadData"); + Cypress.sinon.stub(dropzone, "_uploadData"); dropzone.options.chunking = true; dropzone.options.chunkSize = 1; @@ -1858,32 +2177,32 @@ describe("Dropzone", function () { let mock2 = getMockFile("text/html", "transformed-file", ["2b"]); // only 2 bytes dropzone.options.transformFile = (file, done) => { - file.should.eql(mock1); + expect(file).to.equal(mock1); done(mock2); }; dropzone.addFile(mock1); setTimeout(async function () { - dropzone._uploadData.callCount.should.equal(2); + expect(dropzone._uploadData.callCount).to.equal(2); // the same file should be passed on each call. - dropzone._uploadData.args[0][0][0].should.eql(mock1); - dropzone._uploadData.args[1][0][0].should.eql(mock1); + expect(dropzone._uploadData.args[0][0][0]).to.equal(mock1); + expect(dropzone._uploadData.args[1][0][0]).to.equal(mock1); // Since we only allow chunks of 1 byte, there should be 2 chunks, // because the transformed file only has 2 bytes. // If this would equal to 18 bytes, then the wrong file would have // been chunked. - mock1.upload.totalChunkCount.should.eql(2); + expect(mock1.upload.totalChunkCount).to.equal(2); let uploadedDataBlocks1 = dropzone._uploadData.args[0][1][0]; let uploadedDataBlocks2 = dropzone._uploadData.args[1][1][0]; let block1Text = await uploadedDataBlocks1.data.text(); let block2Text = await uploadedDataBlocks2.data.text(); - block1Text.should.equal("2"); - block2Text.should.equal("b"); + expect(block1Text).to.equal("2"); + expect(block2Text).to.equal("b"); done(); }, 10); }); @@ -1908,7 +2227,7 @@ describe("Dropzone", function () { dropzone.on("complete", (file) => completedFiles++); dropzone.on("queuecomplete", function () { - completedFiles.should.equal(3); + expect(completedFiles).to.equal(3); return done(); }); diff --git a/cypress/unit/amazon-s3.cy.js b/cypress/unit/amazon-s3.cy.js new file mode 100644 index 000000000..2a4d86912 --- /dev/null +++ b/cypress/unit/amazon-s3.cy.js @@ -0,0 +1,92 @@ +import { Dropzone } from "../../src/dropzone.js"; + +describe("Amazon S3 Support", function () { + const getMockFile = ( + type = "text/html", + filename = "test file name", + contents = ["file contents"], + ) => { + const file = new File(contents, filename, { type }); + file.status = Dropzone.ADDED; + file.accepted = true; + file.upload = { filename }; + return file; + }; + + let dropzone = null; + let element = null; + + afterEach(function () { + if (dropzone != null) { + dropzone.destroy(); + dropzone = null; + } + if (element != null) { + document.body.removeChild(element); + element = null; + } + }); + + describe("constructor()", function () { + it("should throw an exception if binaryBody and uploadMultiple", function () { + const el = document.createElement("div"); + expect(() => { + dropzone = new Dropzone(el, { + url: "/", + binaryBody: true, + uploadMultiple: true, + }); + }).to.throw("You cannot set both: binaryBody and uploadMultiple."); + }); + }); + + describe("upload", function () { + beforeEach(function () { + element = Dropzone.createElement("
"); + document.body.appendChild(element); + + dropzone = new Dropzone(element, { + url: "url", + binaryBody: true, + uploadprogress() {}, + }); + + // Ensure test determinism (we will start processing explicitly) + dropzone.accept = (file, done) => done(); + dropzone.options.autoProcessQueue = false; + }); + + it("should add proper Content-Type", function () { + const seen = []; + + cy.intercept("**/url", (req) => { + // Cypress normalizes header keys to lowercase + seen.push(req.headers["content-type"] || req.headers["Content-Type"]); + req.reply({ statusCode: 200, body: "" }); + }).as("upload"); + + // IMPORTANT: run Dropzone actions only after intercept is registered + cy.then(() => { + dropzone.addFile(getMockFile()); + dropzone.addFile( + getMockFile("image/jpeg", "some-file.jpg", [[1, 2, 3]]), + ); + dropzone.processQueue(); + }); + + // wait for two requests + cy.wait("@upload"); + cy.wait("@upload"); + + // assert after both requests happened + cy.wrap(seen) + .should("have.length", 2) + .then(() => { + const contentTypes = seen.filter(Boolean).sort(); + expect(contentTypes).to.deep.equal( + ["image/jpeg", "text/html"].sort(), + ); + }); + }); + }); +}); diff --git a/cypress/unit/emitter.cy.js b/cypress/unit/emitter.cy.js new file mode 100644 index 000000000..59d3dc5f2 --- /dev/null +++ b/cypress/unit/emitter.cy.js @@ -0,0 +1,137 @@ +import { Dropzone } from "../../src/dropzone.js"; + +describe("Emitter", function () { + let emitter = null; + + beforeEach(function () { + emitter = new Dropzone.prototype.Emitter(); + }); + + it(".on() should return the object itself", function () { + expect(emitter.on("test", function () {})).to.equal(emitter); + }); + + it(".on() should properly register listeners", function () { + expect(emitter._callbacks === undefined).to.be.true; + + const callback = function () {}; + const callback2 = function () {}; + + emitter.on("test", callback); + emitter.on("test", callback2); + emitter.on("test2", callback); + + expect(emitter._callbacks.test.length).to.equal(2); + expect(emitter._callbacks.test[0]).to.equal(callback); + expect(emitter._callbacks.test[1]).to.equal(callback2); + expect(emitter._callbacks.test2.length).to.equal(1); + expect(emitter._callbacks.test2[0]).to.equal(callback); + }); + + it(".emit() should return the object itself", function () { + expect(emitter.emit("test")).to.equal(emitter); + }); + + it(".emit() should properly invoke all registered callbacks with arguments", function () { + let callCount1 = 0; + let callCount12 = 0; + let callCount2 = 0; + + const callback1 = function (var1, var2) { + callCount1++; + expect(var1).to.equal("callback1 var1"); + expect(var2).to.equal("callback1 var2"); + }; + + const callback12 = function (var1, var2) { + callCount12++; + expect(var1).to.equal("callback1 var1"); + expect(var2).to.equal("callback1 var2"); + }; + + const callback2 = function (var1, var2) { + callCount2++; + expect(var1).to.equal("callback2 var1"); + expect(var2).to.equal("callback2 var2"); + }; + + emitter.on("test1", callback1); + emitter.on("test1", callback12); + emitter.on("test2", callback2); + + expect(callCount1).to.equal(0); + expect(callCount12).to.equal(0); + expect(callCount2).to.equal(0); + + emitter.emit("test1", "callback1 var1", "callback1 var2"); + + expect(callCount1).to.equal(1); + expect(callCount12).to.equal(1); + expect(callCount2).to.equal(0); + + emitter.emit("test2", "callback2 var1", "callback2 var2"); + + expect(callCount1).to.equal(1); + expect(callCount12).to.equal(1); + expect(callCount2).to.equal(1); + + emitter.emit("test1", "callback1 var1", "callback1 var2"); + + expect(callCount1).to.equal(2); + expect(callCount12).to.equal(2); + expect(callCount2).to.equal(1); + }); + + describe(".off()", function () { + const callback1 = function () {}; + const callback2 = function () {}; + const callback3 = function () {}; + const callback4 = function () {}; + + beforeEach(function () { + emitter._callbacks = { + test1: [callback1, callback2], + test2: [callback3], + test3: [callback1, callback4], + test4: [], + }; + }); + + it("should work without any listeners", function () { + emitter._callbacks = undefined; + const emt = emitter.off(); + expect(emitter._callbacks).to.deep.equal({}); + expect(emt).to.equal(emitter); + }); + + it("should properly remove all event listeners", function () { + const emt = emitter.off(); + expect(emitter._callbacks).to.deep.equal({}); + expect(emt).to.equal(emitter); + }); + + it("should properly remove all event listeners for specific event", function () { + emitter.off("test1"); + expect(emitter._callbacks["test1"] === undefined).to.be.true; + expect(emitter._callbacks["test2"].length).to.equal(1); + expect(emitter._callbacks["test3"].length).to.equal(2); + + const emt = emitter.off("test2"); + expect(emitter._callbacks["test2"] === undefined).to.be.true; + expect(emt).to.equal(emitter); + }); + + it("should properly remove specific event listener", function () { + emitter.off("test1", callback1); + expect(emitter._callbacks["test1"].length).to.equal(1); + expect(emitter._callbacks["test1"][0]).to.equal(callback2); + + expect(emitter._callbacks["test3"].length).to.equal(2); + + const emt = emitter.off("test3", callback4); + expect(emitter._callbacks["test3"].length).to.equal(1); + expect(emitter._callbacks["test3"][0]).to.equal(callback1); + expect(emt).to.equal(emitter); + }); + }); +}); diff --git a/test/unit-tests/static-functions.js b/cypress/unit/static-functions.cy.js similarity index 57% rename from test/unit-tests/static-functions.js rename to cypress/unit/static-functions.cy.js index 8bea5d75c..1dd7c7293 100644 --- a/test/unit-tests/static-functions.js +++ b/cypress/unit/static-functions.cy.js @@ -3,30 +3,30 @@ import { Dropzone } from "../../src/dropzone.js"; describe("Static functions", function () { describe("Dropzone.isBrowserSupported()", function () { it("should be supported browser", () => { - Dropzone.isBrowserSupported().should.be.true; + expect(Dropzone.isBrowserSupported()).to.be.true; }); }); describe("Dropzone.createElement()", function () { let element = Dropzone.createElement( - '
Hallo
' + '
Hallo
', ); it("should properly create an element from a string", () => - element.tagName.should.equal("DIV")); + expect(element.tagName).to.equal("DIV")); it("should properly add the correct class", () => - element.classList.contains("test").should.be.ok); + expect(element.classList.contains("test")).to.be.ok); it("should properly create child elements", () => - element.querySelector("span").tagName.should.equal("SPAN")); + expect(element.querySelector("span").tagName).to.equal("SPAN")); it("should always return only one element", function () { element = Dropzone.createElement("
"); - return element.tagName.should.equal("DIV"); + expect(element.tagName).to.equal("DIV"); }); }); describe("Dropzone.elementInside()", function () { let element = Dropzone.createElement( - '
' + '
', ); document.body.appendChild(element); @@ -36,16 +36,16 @@ describe("Static functions", function () { after(() => document.body.removeChild(element)); it("should return yes if elements are the same", () => - Dropzone.elementInside(element, element).should.be.ok); + expect(Dropzone.elementInside(element, element)).to.be.ok); it("should return yes if element is direct child", () => - Dropzone.elementInside(child1, element).should.be.ok); + expect(Dropzone.elementInside(child1, element)).to.be.ok); it("should return yes if element is some child", function () { - Dropzone.elementInside(child2, element).should.be.ok; - return Dropzone.elementInside(child2, document.body).should.be.ok; + expect(Dropzone.elementInside(child2, element)).to.be.ok; + expect(Dropzone.elementInside(child2, document.body)).to.be.ok; }); it("should return no unless element is some child", function () { - Dropzone.elementInside(element, child1).should.not.be.ok; - return Dropzone.elementInside(document.body, child1).should.not.be.ok; + expect(Dropzone.elementInside(element, child1)).to.not.be.ok; + expect(Dropzone.elementInside(document.body, child1)).to.not.be.ok; }); }); @@ -62,7 +62,7 @@ describe("Static functions", function () { it("should take options set in Dropzone.options from camelized id", function () { element.id = "test-element"; - return Dropzone.optionsForElement(element).should.equal(testOptions); + expect(Dropzone.optionsForElement(element)).to.equal(testOptions); }); it("should return undefined if no options set", function () { @@ -77,9 +77,9 @@ describe("Static functions", function () { it("should ignore input fields with the name='id'", function () { element = Dropzone.createElement( - '
' + '
', ); - return Dropzone.optionsForElement(element).should.equal(testOptions); + expect(Dropzone.optionsForElement(element)).to.equal(testOptions); }); }); @@ -98,7 +98,7 @@ describe("Static functions", function () { it("should throw an exception if no dropzone attached", () => expect(() => Dropzone.forElement(document.createElement("div"))).to.throw( - "No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone." + "No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.", )); it("should accept css selectors", () => @@ -132,7 +132,7 @@ describe("Static functions", function () { }); it("should find elements with a .dropzone class", () => - element1.dropzone.should.be.ok); + expect(element1.dropzone).to.be.ok); it("should not create dropzones with disabled options", () => expect(element2.dropzone).to.not.be.ok); @@ -141,131 +141,180 @@ describe("Static functions", function () { describe("Dropzone.isValidFile()", function () { it("should return true if called without acceptedFiles", () => - Dropzone.isValidFile({ type: "some/type" }, null).should.be.ok); + expect(Dropzone.isValidFile({ type: "some/type" }, null)).to.be.ok); it("should properly validate if called with concrete mime types", function () { let acceptedMimeTypes = "text/html,image/jpeg,application/json"; - Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes) - .should.be.ok; - return Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes) - .should.not.be.ok; + expect(Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes)).to + .be.ok; + expect(Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes)).to + .be.ok; + expect( + Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes), + ).to.be.ok; + expect(Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes)).to + .not.be.ok; }); it("should properly validate if called with base mime types", function () { let acceptedMimeTypes = "text/*,image/*,application/*"; - Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes) - .should.be.ok; - Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes).should.be - .ok; - return Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes) - .should.not.be.ok; + expect(Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes)).to + .be.ok; + expect(Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes)).to + .be.ok; + expect( + Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes), + ).to.be.ok; + expect(Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes)).to + .be.ok; + expect(Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes)).to + .not.be.ok; }); it("should properly validate if called with mixed mime types", function () { let acceptedMimeTypes = "text/*,image/jpeg,application/*"; - Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be - .ok; - Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes).should.not + expect(Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes)).to .be.ok; - Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes) - .should.be.ok; - return Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes) - .should.not.be.ok; + expect(Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes)).to + .be.ok; + expect(Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes)).to + .not.be.ok; + expect( + Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes), + ).to.be.ok; + expect(Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes)).to + .not.be.ok; }); it("should properly validate even with spaces in between", function () { let acceptedMimeTypes = "text/html , image/jpeg, application/json"; - Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be - .ok; - return Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes) - .should.be.ok; + expect(Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes)).to + .be.ok; + expect(Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes)).to + .be.ok; }); it("should properly validate extensions", function () { let acceptedMimeTypes = "text/html , image/jpeg, .pdf ,.png"; - Dropzone.isValidFile( - { name: "somxsfsd", type: "text/html" }, - acceptedMimeTypes - ).should.be.ok; - Dropzone.isValidFile( - { name: "somesdfsdf", type: "image/jpeg" }, - acceptedMimeTypes - ).should.be.ok; - Dropzone.isValidFile( - { name: "somesdfadfadf", type: "application/json" }, - acceptedMimeTypes - ).should.not.be.ok; - Dropzone.isValidFile( - { name: "some-file file.pdf", type: "random/type" }, - acceptedMimeTypes - ).should.be.ok; + expect( + Dropzone.isValidFile( + { name: "somxsfsd", type: "text/html" }, + acceptedMimeTypes, + ), + ).to.be.ok; + + expect( + Dropzone.isValidFile( + { name: "somesdfsdf", type: "image/jpeg" }, + acceptedMimeTypes, + ), + ).to.be.ok; + + expect( + Dropzone.isValidFile( + { name: "somesdfadfadf", type: "application/json" }, + acceptedMimeTypes, + ), + ).to.not.be.ok; + + expect( + Dropzone.isValidFile( + { name: "some-file file.pdf", type: "random/type" }, + acceptedMimeTypes, + ), + ).to.be.ok; + // .pdf has to be in the end - Dropzone.isValidFile( - { name: "some-file.pdf file.gif", type: "random/type" }, - acceptedMimeTypes - ).should.not.be.ok; - return Dropzone.isValidFile( - { name: "some-file file.png", type: "random/type" }, - acceptedMimeTypes - ).should.be.ok; + expect( + Dropzone.isValidFile( + { name: "some-file.pdf file.gif", type: "random/type" }, + acceptedMimeTypes, + ), + ).to.not.be.ok; + + expect( + Dropzone.isValidFile( + { name: "some-file file.png", type: "random/type" }, + acceptedMimeTypes, + ), + ).to.be.ok; }); }); describe("Dropzone.confirm", function () { - beforeEach(() => sinon.stub(window, "confirm")); - afterEach(() => window.confirm.restore()); - it("should forward to window.confirm and call the callbacks accordingly", function () { - let rejected; - let accepted = (rejected = false); - window.confirm.returns(true); - Dropzone.confirm( - "test question", - () => (accepted = true), - () => (rejected = true) - ); - window.confirm.args[0][0].should.equal("test question"); - accepted.should.equal(true); - rejected.should.equal(false); - - accepted = rejected = false; - window.confirm.returns(false); - Dropzone.confirm( - "test question 2", - () => (accepted = true), - () => (rejected = true) - ); - window.confirm.args[1][0].should.equal("test question 2"); - accepted.should.equal(false); - return rejected.should.equal(true); + let originalConfirm; + let confirmStub; + + beforeEach(function () { + originalConfirm = window.confirm; + + confirmStub = Cypress.sinon.stub(); + + Object.defineProperty(window, "confirm", { + configurable: true, + value: confirmStub, }); + }); - it("should not error if rejected is not provided", function () { - let rejected; - let accepted = (rejected = false); - window.confirm.returns(false); - Dropzone.confirm("test question", () => (accepted = true)); - window.confirm.args[0][0].should.equal("test question"); - // Nothing should have changed since there is no rejected function. - accepted.should.equal(false); - return rejected.should.equal(false); + afterEach(function () { + Object.defineProperty(window, "confirm", { + configurable: true, + value: originalConfirm, }); }); + it("should forward to window.confirm and call the callbacks accordingly", function () { + let accepted = false; + let rejected = false; + + confirmStub.returns(true); + + Dropzone.confirm( + "test question", + () => (accepted = true), + () => (rejected = true) + ); + + expect(confirmStub.args[0][0]).to.equal("test question"); + expect(accepted).to.equal(true); + expect(rejected).to.equal(false); + + accepted = false; + rejected = false; + + confirmStub.returns(false); + + Dropzone.confirm( + "test question 2", + () => (accepted = true), + () => (rejected = true) + ); + + expect(confirmStub.args[1][0]).to.equal("test question 2"); + expect(accepted).to.equal(false); + expect(rejected).to.equal(true); + }); + + it("should not error if rejected is not provided", function () { + let accepted = false; + let rejected = false; + + confirmStub.returns(false); + + Dropzone.confirm("test question", () => (accepted = true)); + + expect(confirmStub.args[0][0]).to.equal("test question"); + expect(accepted).to.equal(false); + expect(rejected).to.equal(false); + }); +}); + + describe("Dropzone.getElement() / getElements()", function () { let tmpElements = []; @@ -273,10 +322,10 @@ describe("Static functions", function () { tmpElements = []; tmpElements.push(Dropzone.createElement('
')); tmpElements.push( - Dropzone.createElement('
') + Dropzone.createElement('
'), ); tmpElements.push( - Dropzone.createElement('
') + Dropzone.createElement('
'), ); return tmpElements.forEach((el) => document.body.appendChild(el)); }); @@ -286,25 +335,25 @@ describe("Static functions", function () { describe(".getElement()", function () { it("should accept a string", function () { let el = Dropzone.getElement(".tmptest"); - el.should.equal(tmpElements[0]); + expect(el).to.equal(tmpElements[0]); el = Dropzone.getElement("#tmptest1"); - return el.should.equal(tmpElements[1]); + expect(el).to.equal(tmpElements[1]); }); it("should accept a node", function () { let el = Dropzone.getElement(tmpElements[2]); - return el.should.equal(tmpElements[2]); + expect(el).to.equal(tmpElements[2]); }); it("should fail if invalid selector", function () { let errorMessage = "Invalid `clickable` option provided. Please provide a CSS selector or a plain HTML element."; expect(() => Dropzone.getElement("lblasdlfsfl", "clickable")).to.throw( - errorMessage + errorMessage, ); expect(() => - Dropzone.getElement({ lblasdlfsfl: "lblasdlfsfl" }, "clickable") + Dropzone.getElement({ lblasdlfsfl: "lblasdlfsfl" }, "clickable"), ).to.throw(errorMessage); return expect(() => - Dropzone.getElement(["lblasdlfsfl"], "clickable") + Dropzone.getElement(["lblasdlfsfl"], "clickable"), ).to.throw(errorMessage); }); }); @@ -312,32 +361,32 @@ describe("Static functions", function () { describe(".getElements()", function () { it("should accept a list of strings", function () { let els = Dropzone.getElements([".tmptest", "#tmptest1"]); - return els.should.eql([tmpElements[0], tmpElements[1]]); + expect(els).to.deep.equal([tmpElements[0], tmpElements[1]]); }); it("should accept a list of nodes", function () { let els = Dropzone.getElements([tmpElements[0], tmpElements[2]]); - return els.should.eql([tmpElements[0], tmpElements[2]]); + expect(els).to.deep.equal([tmpElements[0], tmpElements[2]]); }); it("should accept a mixed list", function () { let els = Dropzone.getElements(["#tmptest1", tmpElements[2]]); - return els.should.eql([tmpElements[1], tmpElements[2]]); + expect(els).to.deep.equal([tmpElements[1], tmpElements[2]]); }); it("should accept a string selector", function () { let els = Dropzone.getElements(".random"); - return els.should.eql([tmpElements[1], tmpElements[2]]); + expect(els).to.deep.equal([tmpElements[1], tmpElements[2]]); }); it("should accept a single node", function () { let els = Dropzone.getElements(tmpElements[1]); - return els.should.eql([tmpElements[1]]); + expect(els).to.deep.equal([tmpElements[1]]); }); it("should fail if invalid selector", function () { let errorMessage = "Invalid `clickable` option provided. Please provide a CSS selector, a plain HTML element or a list of those."; expect(() => Dropzone.getElements("lblasdlfsfl", "clickable")).to.throw( - errorMessage + errorMessage, ); return expect(() => - Dropzone.getElements(["lblasdlfsfl"], "clickable") + Dropzone.getElements(["lblasdlfsfl"], "clickable"), ).to.throw(errorMessage); }); }); diff --git a/package.json b/package.json index 9099d3dbf..7373fbe7a 100644 --- a/package.json +++ b/package.json @@ -25,10 +25,6 @@ "standalone": { "source": "tool/dropzone-global.js", "outputFormat": "global" - }, - "built-test": { - "source": "test/unit-tests.js", - "distDir": "test/built/" } }, "maintainers": [ @@ -42,8 +38,7 @@ "build": "parcel build && yarn run css && cp types/dropzone.d.ts dist", "css": "yarn sass src/:dist/ --style compressed", "watch-css": "yarn sass src/:dist/ --watch --style compressed", - "test": "karma start test/karma.conf.js", - "test:e2e": "cypress run", + "test": "cypress run", "start-test-server": "yarn node test/test-server.js" }, "bugs": { @@ -64,20 +59,10 @@ "@parcel/core": "^2.16.3", "@parcel/transformer-inline-string": "^2.16.3", "@parcel/transformer-sass": "^2.16.3", - "chai": "^4.5.0", "cypress": "^15.9.0", "express": "^4.21.2", - "karma": "^6.4.4", - "karma-chrome-launcher": "^3.2.0", - "karma-mocha": "^2.0.1", - "karma-sinon-chai": "^2.0.2", - "karma-spec-reporter": "^0.0.36", - "mocha": "^11.7.5", - "mocha-headless-chrome": "^5.1.0", "parcel": "^2.16.3", - "sass": "^1.79.3", - "sinon": "^18.0.1", - "sinon-chai": "^3.7.0" + "sass": "^1.79.3" }, "packageManager": "yarn@4.5.3" } diff --git a/src/options.js b/src/options.js index 874961a0b..488c10f31 100644 --- a/src/options.js +++ b/src/options.js @@ -1,5 +1,5 @@ import Dropzone from "./dropzone"; -import defaultPreviewTemplate from "bundle-text:./preview-template.html"; +import defaultPreviewTemplate from "./preview-template.js"; let defaultOptions = { /** diff --git a/src/preview-template.html b/src/preview-template.js similarity index 98% rename from src/preview-template.html rename to src/preview-template.js index 021bd0b4e..50d794e68 100644 --- a/src/preview-template.html +++ b/src/preview-template.js @@ -1,3 +1,4 @@ +export default `
@@ -34,4 +35,4 @@ />
-
+`; diff --git a/test/built/.gitignore b/test/built/.gitignore deleted file mode 100644 index c96a04f00..000000000 --- a/test/built/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/test/karma.conf.js b/test/karma.conf.js deleted file mode 100644 index 350e8c5be..000000000 --- a/test/karma.conf.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = function (config) { - config.set({ - frameworks: ["mocha", "sinon-chai"], - files: ["built/unit-tests.js"], - reporters: ["spec"], - specReporter: { - maxLogLines: 5, // limit number of lines logged per test - suppressErrorSummary: false, // do not print error summary - suppressFailed: false, // do not print information about failed tests - suppressPassed: false, // do not print information about passed tests - suppressSkipped: false, // do not print information about skipped tests - showSpecTiming: true, // print the time elapsed for each spec - failFast: false, // test would finish with error when a first fail occurs. - }, - logLevel: config.LOG_INFO, - browsers: ["ChromeHeadless"], - autoWatch: false, - singleRun: true, // Karma captures browsers, runs the tests and exits - concurrency: Infinity, - plugins: ["karma-mocha", "karma-spec-reporter", "karma-chrome-launcher", "karma-sinon-chai"], - }); -}; diff --git a/test/unit-tests.js b/test/unit-tests.js deleted file mode 100644 index 07719cb19..000000000 --- a/test/unit-tests.js +++ /dev/null @@ -1,4 +0,0 @@ -import "./unit-tests/all"; -import "./unit-tests/amazon-s3"; -import "./unit-tests/emitter"; -import "./unit-tests/static-functions"; diff --git a/test/unit-tests/amazon-s3.js b/test/unit-tests/amazon-s3.js deleted file mode 100644 index 90cb648ff..000000000 --- a/test/unit-tests/amazon-s3.js +++ /dev/null @@ -1,80 +0,0 @@ -import { Dropzone } from "../../src/dropzone.js"; -import { sleep } from "./utils"; - -describe("Amazon S3 Support", function () { - let getMockFile = ( - type = "text/html", - filename = "test file name", - contents = ["file contents"] - ) => { - let file = new File(contents, filename, { type: type }); - file.status = Dropzone.ADDED; - file.accepted = true; - file.upload = { - filename: filename, - }; - return file; - }; - - let xhr = null; - let dropzone = null; - beforeEach(() => (xhr = sinon.useFakeXMLHttpRequest())); - - afterEach(function () { - if (dropzone != null) { - dropzone.destroy(); - } - }); - describe("constructor()", () => { - it("should throw an exception if binaryBody and uploadMultiple", () => { - let element = document.createElement("div"); - expect( - () => - (dropzone = new Dropzone(element, { - url: "/", - binaryBody: true, - uploadMultiple: true, - })) - ).to.throw("You cannot set both: binaryBody and uploadMultiple."); - }); - }); - - describe("upload", () => { - let element = null; - let dropzone = null; - let requests = null; - beforeEach(function () { - requests = []; - xhr.onCreate = (xhr) => requests.push(xhr); - - element = Dropzone.createElement("
"); - document.body.appendChild(element); - return (dropzone = new Dropzone(element, { - url: "url", - binaryBody: true, - uploadprogress() {}, - })); - }); - afterEach(function () { - document.body.removeChild(element); - dropzone.destroy(); - return xhr.restore(); - }); - it("should add proper Content-Type", async () => { - dropzone.addFile(getMockFile()); - dropzone.addFile(getMockFile("image/jpeg", "some-file.jpg", [[1, 2, 3]])); - await sleep(10); - - console.log(requests[0].requestHeaders); - console.log(requests[1].requestHeaders); - - expect(requests[0].requestHeaders["Content-Type"]).eq( - "text/html;charset=utf-8" - ); - - expect(requests[1].requestHeaders["Content-Type"]).eq( - "image/jpeg;charset=utf-8" - ); - }); - }); -}); diff --git a/test/unit-tests/emitter.js b/test/unit-tests/emitter.js deleted file mode 100644 index ed91d2121..000000000 --- a/test/unit-tests/emitter.js +++ /dev/null @@ -1,124 +0,0 @@ -import { Dropzone } from "../../src/dropzone.js"; - -describe("Emitter", function () { - let emitter = null; - beforeEach(() => (emitter = new Dropzone.prototype.Emitter())); - - it(".on() should return the object itself", () => - emitter.on("test", function () {}).should.equal(emitter)); - - it(".on() should properly register listeners", function () { - (emitter._callbacks === undefined).should.be.true; - let callback = function () {}; - let callback2 = function () {}; - emitter.on("test", callback); - emitter.on("test", callback2); - emitter.on("test2", callback); - emitter._callbacks.test.length.should.equal(2); - emitter._callbacks.test[0].should.equal(callback); - emitter._callbacks.test[1].should.equal(callback2); - emitter._callbacks.test2.length.should.equal(1); - return emitter._callbacks.test2[0].should.equal(callback); - }); - - it(".emit() should return the object itself", () => - emitter.emit("test").should.equal(emitter)); - - it(".emit() should properly invoke all registered callbacks with arguments", function () { - let callCount1 = 0; - let callCount12 = 0; - let callCount2 = 0; - let callback1 = function (var1, var2) { - callCount1++; - var1.should.equal("callback1 var1"); - return var2.should.equal("callback1 var2"); - }; - let callback12 = function (var1, var2) { - callCount12++; - var1.should.equal("callback1 var1"); - return var2.should.equal("callback1 var2"); - }; - let callback2 = function (var1, var2) { - callCount2++; - var1.should.equal("callback2 var1"); - return var2.should.equal("callback2 var2"); - }; - - emitter.on("test1", callback1); - emitter.on("test1", callback12); - emitter.on("test2", callback2); - - callCount1.should.equal(0); - callCount12.should.equal(0); - callCount2.should.equal(0); - - emitter.emit("test1", "callback1 var1", "callback1 var2"); - - callCount1.should.equal(1); - callCount12.should.equal(1); - callCount2.should.equal(0); - - emitter.emit("test2", "callback2 var1", "callback2 var2"); - - callCount1.should.equal(1); - callCount12.should.equal(1); - callCount2.should.equal(1); - - emitter.emit("test1", "callback1 var1", "callback1 var2"); - - callCount1.should.equal(2); - callCount12.should.equal(2); - return callCount2.should.equal(1); - }); - - return describe(".off()", function () { - let callback1 = function () {}; - let callback2 = function () {}; - let callback3 = function () {}; - let callback4 = function () {}; - - beforeEach( - () => - (emitter._callbacks = { - test1: [callback1, callback2], - test2: [callback3], - test3: [callback1, callback4], - test4: [], - }) - ); - - it("should work without any listeners", function () { - emitter._callbacks = undefined; - let emt = emitter.off(); - emitter._callbacks.should.eql({}); - return emt.should.equal(emitter); - }); - - it("should properly remove all event listeners", function () { - let emt = emitter.off(); - emitter._callbacks.should.eql({}); - return emt.should.equal(emitter); - }); - - it("should properly remove all event listeners for specific event", function () { - emitter.off("test1"); - (emitter._callbacks["test1"] === undefined).should.be.true; - emitter._callbacks["test2"].length.should.equal(1); - emitter._callbacks["test3"].length.should.equal(2); - let emt = emitter.off("test2"); - (emitter._callbacks["test2"] === undefined).should.be.true; - return emt.should.equal(emitter); - }); - - it("should properly remove specific event listener", function () { - emitter.off("test1", callback1); - emitter._callbacks["test1"].length.should.equal(1); - emitter._callbacks["test1"][0].should.equal(callback2); - emitter._callbacks["test3"].length.should.equal(2); - let emt = emitter.off("test3", callback4); - emitter._callbacks["test3"].length.should.equal(1); - emitter._callbacks["test3"][0].should.equal(callback1); - return emt.should.equal(emitter); - }); - }); -}); diff --git a/test/unit-tests/utils.js b/test/unit-tests/utils.js deleted file mode 100644 index 5c4461fe5..000000000 --- a/test/unit-tests/utils.js +++ /dev/null @@ -1,7 +0,0 @@ -export async function sleep(delay) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, delay); - }); -} diff --git a/yarn.lock b/yarn.lock index 01779d7ba..b3f6260a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,31 +5,6 @@ __metadata: version: 8 cacheKey: 10c0 -"@babel/code-frame@npm:^7.0.0": - version: 7.28.6 - resolution: "@babel/code-frame@npm:7.28.6" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.28.5" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/ed5d57f99455e3b1c23e75ebb8430c6b9800b4ecd0121b4348b97cecb65406a47778d6db61f0d538a4958bb01b4b277e90348a68d39bd3beff1d7c940ed6dd66 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" - checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 - languageName: node - linkType: hard - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 - languageName: node - linkType: hard - "@cypress/request@npm:^3.0.10": version: 3.0.10 resolution: "@cypress/request@npm:3.0.10" @@ -74,20 +49,10 @@ __metadata: "@parcel/transformer-inline-string": "npm:^2.16.3" "@parcel/transformer-sass": "npm:^2.16.3" "@swc/helpers": "npm:^0.5.18" - chai: "npm:^4.5.0" cypress: "npm:^15.9.0" express: "npm:^4.21.2" - karma: "npm:^6.4.4" - karma-chrome-launcher: "npm:^3.2.0" - karma-mocha: "npm:^2.0.1" - karma-sinon-chai: "npm:^2.0.2" - karma-spec-reporter: "npm:^0.0.36" - mocha: "npm:^11.7.5" - mocha-headless-chrome: "npm:^5.1.0" parcel: "npm:^2.16.3" sass: "npm:^1.79.3" - sinon: "npm:^18.0.1" - sinon-chai: "npm:^3.7.0" languageName: unknown linkType: soft @@ -1222,75 +1187,6 @@ __metadata: languageName: node linkType: hard -"@puppeteer/browsers@npm:2.11.1": - version: 2.11.1 - resolution: "@puppeteer/browsers@npm:2.11.1" - dependencies: - debug: "npm:^4.4.3" - extract-zip: "npm:^2.0.1" - progress: "npm:^2.0.3" - proxy-agent: "npm:^6.5.0" - semver: "npm:^7.7.3" - tar-fs: "npm:^3.1.1" - yargs: "npm:^17.7.2" - bin: - browsers: lib/cjs/main-cli.js - checksum: 10c0/e8a92c5a600deda0aa1e3d437f1e35cb1cc0c24a218e01f33af6d5d106a3807e660fd09f67e31dd5c48a1efe9d207c405fc7f52d4172084dc99bb37adfb9341f - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^3.0.0, @sinonjs/commons@npm:^3.0.1": - version: 3.0.1 - resolution: "@sinonjs/commons@npm:3.0.1" - dependencies: - type-detect: "npm:4.0.8" - checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:11.2.2": - version: 11.2.2 - resolution: "@sinonjs/fake-timers@npm:11.2.2" - dependencies: - "@sinonjs/commons": "npm:^3.0.0" - checksum: 10c0/a4218efa6fdafda622d02d4c0a6ab7df3641cb038bb0b14f0a3ee56f50c95aab4f1ab2d7798ce928b40c6fc1839465a558c9393a77e4dca879e1b2f8d60d8136 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^13.0.1": - version: 13.0.5 - resolution: "@sinonjs/fake-timers@npm:13.0.5" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - checksum: 10c0/a707476efd523d2138ef6bba916c83c4a377a8372ef04fad87499458af9f01afc58f4f245c5fd062793d6d70587309330c6f96947b5bd5697961c18004dc3e26 - languageName: node - linkType: hard - -"@sinonjs/samsam@npm:^8.0.0": - version: 8.0.2 - resolution: "@sinonjs/samsam@npm:8.0.2" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - lodash.get: "npm:^4.4.2" - type-detect: "npm:^4.1.0" - checksum: 10c0/31d74c415040161f2963a202d7f866bedbb5a9b522a74b08a17086c15a75c3ef2893eecebb0c65a7b1603ef4ebdf83fa73cbe384b4cd679944918ed833200443 - languageName: node - linkType: hard - -"@sinonjs/text-encoding@npm:^0.7.3": - version: 0.7.3 - resolution: "@sinonjs/text-encoding@npm:0.7.3" - checksum: 10c0/b112d1e97af7f99fbdc63c7dbcd35d6a60764dfec85cfcfff532e55cce8ecd8453f9fa2139e70aea47142c940fd90cd201d19f370b9a0141700d8a6de3116815 - languageName: node - linkType: hard - -"@socket.io/component-emitter@npm:~3.1.0": - version: 3.1.2 - resolution: "@socket.io/component-emitter@npm:3.1.2" - checksum: 10c0/c4242bad66f67e6f7b712733d25b43cbb9e19a595c8701c3ad99cbeb5901555f78b095e24852f862fffb43e96f1d8552e62def885ca82ae1bb05da3668fd87d7 - languageName: node - linkType: hard - "@swc/core-darwin-arm64@npm:1.11.29": version: 1.11.29 resolution: "@swc/core-darwin-arm64@npm:1.11.29" @@ -1441,23 +1337,7 @@ __metadata: languageName: node linkType: hard -"@tootallnate/quickjs-emscripten@npm:^0.23.0": - version: 0.23.0 - resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" - checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49 - languageName: node - linkType: hard - -"@types/cors@npm:^2.8.12": - version: 2.8.18 - resolution: "@types/cors@npm:2.8.18" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/9dd1075de0e3a40c304826668960c797e67e597a734fb8e8ab404561f31ef2bd553ef5500eb86da7e91a344bee038a59931d2fbf182fbce09f13816f51fdd80e - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:>=10.0.0": +"@types/node@npm:*": version: 22.15.29 resolution: "@types/node@npm:22.15.29" dependencies: @@ -1503,7 +1383,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.8": +"accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -1560,15 +1440,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -1585,16 +1456,6 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac - languageName: node - linkType: hard - "arch@npm:^2.2.0": version: 2.2.0 resolution: "arch@npm:2.2.0" @@ -1602,25 +1463,6 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e - languageName: node - linkType: hard - -"args@npm:^5.0.1": - version: 5.0.3 - resolution: "args@npm:5.0.3" - dependencies: - camelcase: "npm:5.0.0" - chalk: "npm:2.4.2" - leven: "npm:2.1.0" - mri: "npm:1.1.4" - checksum: 10c0/213871ae97d6f5990dc4637f53e48feef8566b2fd6d5cc9cb46ef78dc1db835b2f90fd536c1414441eaa0b5cb8f2a5ab94b973400b5fea096ee20b9893d3b573 - languageName: node - linkType: hard - "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -1644,22 +1486,6 @@ __metadata: languageName: node linkType: hard -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b - languageName: node - linkType: hard - -"ast-types@npm:^0.13.4": - version: 0.13.4 - resolution: "ast-types@npm:0.13.4" - dependencies: - tslib: "npm:^2.0.1" - checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8 - languageName: node - linkType: hard - "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" @@ -1695,18 +1521,6 @@ __metadata: languageName: node linkType: hard -"b4a@npm:^1.6.4": - version: 1.7.3 - resolution: "b4a@npm:1.7.3" - peerDependencies: - react-native-b4a: "*" - peerDependenciesMeta: - react-native-b4a: - optional: true - checksum: 10c0/ac16d186e00fa0d16de1f1a4af413953bc762d50d5a0e382aaa744a13886600313b7293403ad77fc83f6b1489c3fc2610494d1026754a51d1b7cdac2115a7598 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1714,78 +1528,6 @@ __metadata: languageName: node linkType: hard -"bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": - version: 2.8.2 - resolution: "bare-events@npm:2.8.2" - peerDependencies: - bare-abort-controller: "*" - peerDependenciesMeta: - bare-abort-controller: - optional: true - checksum: 10c0/53fef240cf2cdcca62f78b6eead90ddb5a59b0929f414b13a63764c2b4f9de98ea8a578d033b04d64bb7b86dfbc402e937984e69950855cc3754c7b63da7db21 - languageName: node - linkType: hard - -"bare-fs@npm:^4.0.1": - version: 4.5.2 - resolution: "bare-fs@npm:4.5.2" - dependencies: - bare-events: "npm:^2.5.4" - bare-path: "npm:^3.0.0" - bare-stream: "npm:^2.6.4" - bare-url: "npm:^2.2.2" - fast-fifo: "npm:^1.3.2" - peerDependencies: - bare-buffer: "*" - peerDependenciesMeta: - bare-buffer: - optional: true - checksum: 10c0/b623c76d264017491667618055fdcebd5d3efe87768c06817bf29f912b77ce7f03f851eb7dc56810f5266f03927efafceded6b0911042d48dd3013b86c6bb79b - languageName: node - linkType: hard - -"bare-os@npm:^3.0.1": - version: 3.6.2 - resolution: "bare-os@npm:3.6.2" - checksum: 10c0/7d917bc202b7efbb6b78658403fac04ae4e91db98d38cbd24037f896a2b1b4f4571d8cd408d12bed6a4c406d6abaf8d03836eacbcc4c75a0b6974e268574fc5a - languageName: node - linkType: hard - -"bare-path@npm:^3.0.0": - version: 3.0.0 - resolution: "bare-path@npm:3.0.0" - dependencies: - bare-os: "npm:^3.0.1" - checksum: 10c0/56a3ca82a9f808f4976cb1188640ac206546ce0ddff582afafc7bd2a6a5b31c3bd16422653aec656eeada2830cfbaa433c6cbf6d6b4d9eba033d5e06d60d9a68 - languageName: node - linkType: hard - -"bare-stream@npm:^2.6.4": - version: 2.7.0 - resolution: "bare-stream@npm:2.7.0" - dependencies: - streamx: "npm:^2.21.0" - peerDependencies: - bare-buffer: "*" - bare-events: "*" - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - checksum: 10c0/3acd840b7b288dc066226c36446ff605fba2ecce98f1a0ce6aa611b81aabbcd204046a3209bce172373d17eaeaa5b7d35a85649c18ffcb9f2c783242854e99bd - languageName: node - linkType: hard - -"bare-url@npm:^2.2.2": - version: 2.3.2 - resolution: "bare-url@npm:2.3.2" - dependencies: - bare-path: "npm:^3.0.0" - checksum: 10c0/4fd0046314390a54404519d9db20e130ab3a341ef638d040f9603ae3fa0a1d84f6970357d21c8fc64e6163d1f61fd212cb1cfa4cb537dfead99fb06e3c030b15 - languageName: node - linkType: hard - "base-x@npm:^3.0.11": version: 3.0.11 resolution: "base-x@npm:3.0.11" @@ -1802,20 +1544,6 @@ __metadata: languageName: node linkType: hard -"base64id@npm:2.0.0, base64id@npm:~2.0.0": - version: 2.0.0 - resolution: "base64id@npm:2.0.0" - checksum: 10c0/6919efd237ed44b9988cbfc33eca6f173a10e810ce50292b271a1a421aac7748ef232a64d1e6032b08f19aae48dce6ee8f66c5ae2c9e5066c82b884861d4d453 - languageName: node - linkType: hard - -"basic-ftp@npm:^5.0.2": - version: 5.1.0 - resolution: "basic-ftp@npm:5.1.0" - checksum: 10c0/397d5ed490f4d3b8b2dcd7afdf8e9fcf714a7d1c394a6c66b31704baf49c9fc250f1742f6189136a76b983675edf3d986b7ed93d253dc6477e65a567cf1e04c0 - languageName: node - linkType: hard - "bcrypt-pbkdf@npm:^1.0.0": version: 1.0.2 resolution: "bcrypt-pbkdf@npm:1.0.2" @@ -1825,13 +1553,6 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 - languageName: node - linkType: hard - "blob-util@npm:^2.0.2": version: 2.0.2 resolution: "blob-util@npm:2.0.2" @@ -1866,36 +1587,6 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:^1.19.0": - version: 1.20.4 - resolution: "body-parser@npm:1.20.4" - dependencies: - bytes: "npm:~3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:~1.2.0" - http-errors: "npm:~2.0.1" - iconv-lite: "npm:~0.4.24" - on-finished: "npm:~2.4.1" - qs: "npm:~6.14.0" - raw-body: "npm:~2.5.3" - type-is: "npm:~1.6.18" - unpipe: "npm:~1.0.0" - checksum: 10c0/569c1e896297d1fcd8f34026c8d0ab70b90d45343c15c5d8dff5de2bad08125fc1e2f8c2f3f4c1ac6c0caaad115218202594d37dcb8d89d9b5dcae1c2b736aa9 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - "brace-expansion@npm:^2.0.1": version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" @@ -1905,7 +1596,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": +"braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -1914,13 +1605,6 @@ __metadata: languageName: node linkType: hard -"browser-stdout@npm:^1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: 10c0/c40e482fd82be872b6ea7b9f7591beafbf6f5ba522fe3dade98ba1573a1c29a11101564993e4eb44e5488be8f44510af072df9a9637c739217eb155ceb639205 - languageName: node - linkType: hard - "browserslist@npm:^4.24.5": version: 4.25.0 resolution: "browserslist@npm:4.25.0" @@ -1952,7 +1636,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2, bytes@npm:~3.1.2": +"bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e @@ -1996,7 +1680,7 @@ __metadata: languageName: node linkType: hard -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": +"call-bound@npm:^1.0.2": version: 1.0.4 resolution: "call-bound@npm:1.0.4" dependencies: @@ -2006,27 +1690,6 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"camelcase@npm:5.0.0": - version: 5.0.0 - resolution: "camelcase@npm:5.0.0" - checksum: 10c0/515f1ce911d65949708d9e179f1a40af71eb7de668230a0c85961a35590f7da39af79cfb48d834883dbcc7995bdb7dd6bae8027b101e37a10d95337ec8732800 - languageName: node - linkType: hard - -"camelcase@npm:^6.0.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001718": version: 1.0.30001764 resolution: "caniuse-lite@npm:1.0.30001764" @@ -2041,32 +1704,6 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.5.0": - version: 4.5.0 - resolution: "chai@npm:4.5.0" - dependencies: - assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" - pathval: "npm:^1.1.1" - type-detect: "npm:^4.1.0" - checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d - languageName: node - linkType: hard - -"chalk@npm:2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - "chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -2077,35 +1714,7 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: "npm:^2.0.2" - checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841 - languageName: node - linkType: hard - -"chokidar@npm:^3.5.1": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 - languageName: node - linkType: hard - -"chokidar@npm:^4.0.0, chokidar@npm:^4.0.1": +"chokidar@npm:^4.0.0": version: 4.0.3 resolution: "chokidar@npm:4.0.3" dependencies: @@ -2128,18 +1737,6 @@ __metadata: languageName: node linkType: hard -"chromium-bidi@npm:12.0.1": - version: 12.0.1 - resolution: "chromium-bidi@npm:12.0.1" - dependencies: - mitt: "npm:^3.0.1" - zod: "npm:^3.24.1" - peerDependencies: - devtools-protocol: "*" - checksum: 10c0/cc278125a6ad4d4010f4c093442c6da608d0b18be483efbfad67def029a73f0bd16a7deccd9bf848e26dbd47119e3415724abdd7da497a80f886127494fb40b9 - languageName: node - linkType: hard - "ci-info@npm:^4.1.0": version: 4.3.1 resolution: "ci-info@npm:4.3.1" @@ -2186,28 +1783,6 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - "clone@npm:^2.1.2": version: 2.1.2 resolution: "clone@npm:2.1.2" @@ -2215,15 +1790,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -2233,13 +1799,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -2291,25 +1850,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"connect@npm:^3.7.0": - version: 3.7.0 - resolution: "connect@npm:3.7.0" - dependencies: - debug: "npm:2.6.9" - finalhandler: "npm:1.1.2" - parseurl: "npm:~1.3.3" - utils-merge: "npm:1.0.1" - checksum: 10c0/f120c6116bb16a0a7d2703c0b4a0cd7ed787dc5ec91978097bf62aa967289020a9f41a9cd3c3276a7b92aaa36f382d2cd35fed7138fd466a55c8e9fdbed11ca8 - languageName: node - linkType: hard - "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -2340,13 +1880,6 @@ __metadata: languageName: node linkType: hard -"cookie@npm:~0.7.2": - version: 0.7.2 - resolution: "cookie@npm:0.7.2" - checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 - languageName: node - linkType: hard - "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -2354,33 +1887,6 @@ __metadata: languageName: node linkType: hard -"cors@npm:~2.8.5": - version: 2.8.5 - resolution: "cors@npm:2.8.5" - dependencies: - object-assign: "npm:^4" - vary: "npm:^1" - checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 - languageName: node - linkType: hard - -"cosmiconfig@npm:^9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" - dependencies: - env-paths: "npm:^2.2.1" - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.2.0" - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/1c1703be4f02a250b1d6ca3267e408ce16abfe8364193891afc94c2d5c060b69611fdc8d97af74b7e6d5d1aac0ab2fb94d6b079573146bc2d756c2484ce5f0ee - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -2392,13 +1898,6 @@ __metadata: languageName: node linkType: hard -"custom-event@npm:~1.0.0": - version: 1.0.1 - resolution: "custom-event@npm:1.0.1" - checksum: 10c0/86cd8497328b1e17dcda894c8df34a73b7a99f915123940d39b33c709482b2d3a2e689cd5e79e4775eb4167227689f57a2ae2f99a3f0bc9c54c0ac1b06853bd5 - languageName: node - linkType: hard - "cypress@npm:^15.9.0": version: 15.9.0 resolution: "cypress@npm:15.9.0" @@ -2460,20 +1959,6 @@ __metadata: languageName: node linkType: hard -"data-uri-to-buffer@npm:^6.0.2": - version: 6.0.2 - resolution: "data-uri-to-buffer@npm:6.0.2" - checksum: 10c0/f76922bf895b3d7d443059ff278c9cc5efc89d70b8b80cd9de0aa79b3adc6d7a17948eefb8692e30398c43635f70ece1673d6085cc9eba2878dbc6c6da5292ac - languageName: node - linkType: hard - -"date-format@npm:^4.0.14": - version: 4.0.14 - resolution: "date-format@npm:4.0.14" - checksum: 10c0/1c67a4d77c677bb880328c81d81f5b9ed7fbf672bdaff74e5a0f7314b21188f3a829b06acf120c70cc1df876a7724e3e5c23d511e86d64656a3035a76ac3930b - languageName: node - linkType: hard - "dayjs@npm:^1.10.4": version: 1.11.13 resolution: "dayjs@npm:1.11.13" @@ -2490,7 +1975,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.4, debug@npm:^4.3.5": +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.4": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -2511,75 +1996,24 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.4.3": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 languageName: node linkType: hard -"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c languageName: node linkType: hard -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: 10c0/e06da03fc05333e8cd2778c1487da67ffbea5b84e03ca80449519b8fa61f888714bbc6f459ea963d5641b4aa98832130eb5cd193d90ae9f0a27eee14be8e278d - languageName: node - linkType: hard - -"deep-eql@npm:^4.1.3": - version: 4.1.4 - resolution: "deep-eql@npm:4.1.4" - dependencies: - type-detect: "npm:^4.0.0" - checksum: 10c0/264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 - languageName: node - linkType: hard - -"degenerator@npm:^5.0.0": - version: 5.0.1 - resolution: "degenerator@npm:5.0.1" - dependencies: - ast-types: "npm:^0.13.4" - escodegen: "npm:^2.1.0" - esprima: "npm:^4.0.1" - checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:~2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"destroy@npm:1.2.0, destroy@npm:~1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 languageName: node linkType: hard @@ -2599,46 +2033,6 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1534754": - version: 0.0.1534754 - resolution: "devtools-protocol@npm:0.0.1534754" - checksum: 10c0/2ee96f10c9833f7e6ad0f9f66e42242129547e96c8cfe816ce508c222f4ccf4431a4b787cd6ee8174c9b2c8cc9a3c7f3b3b0a1fff96dd3cc5a16eb314027c9f7 - languageName: node - linkType: hard - -"di@npm:^0.0.1": - version: 0.0.1 - resolution: "di@npm:0.0.1" - checksum: 10c0/fbca4cc93e8c493d50f82df3a9ecaa5d8b2935674aabddeb8f68db3ab03c942c201f9c3d920de094407392ee6f488eac16b96f500c0ea6b408634864b7b939d1 - languageName: node - linkType: hard - -"diff@npm:^5.2.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 - languageName: node - linkType: hard - -"diff@npm:^7.0.0": - version: 7.0.0 - resolution: "diff@npm:7.0.0" - checksum: 10c0/251fd15f85ffdf814cfc35a728d526b8d2ad3de338dcbd011ac6e57c461417090766b28995f8ff733135b5fbc3699c392db1d5e27711ac4e00244768cd1d577b - languageName: node - linkType: hard - -"dom-serialize@npm:^2.2.1": - version: 2.2.1 - resolution: "dom-serialize@npm:2.2.1" - dependencies: - custom-event: "npm:~1.0.0" - ent: "npm:~2.2.0" - extend: "npm:^3.0.0" - void-elements: "npm:^2.0.0" - checksum: 10c0/ceb6e62b73c658986ca4c9b8b2fae358d8ae914eb06712d137da595a327c3bbca45a762f412a6d181f892ce5e3cffb855c2db2b64c53ad0534b2a0ad8e65b05e - languageName: node - linkType: hard - "dotenv-expand@npm:^11.0.7": version: 11.0.7 resolution: "dotenv-expand@npm:11.0.7" @@ -2743,30 +2137,6 @@ __metadata: languageName: node linkType: hard -"engine.io-parser@npm:~5.2.1": - version: 5.2.3 - resolution: "engine.io-parser@npm:5.2.3" - checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536 - languageName: node - linkType: hard - -"engine.io@npm:~6.6.0": - version: 6.6.4 - resolution: "engine.io@npm:6.6.4" - dependencies: - "@types/cors": "npm:^2.8.12" - "@types/node": "npm:>=10.0.0" - accepts: "npm:~1.3.4" - base64id: "npm:2.0.0" - cookie: "npm:~0.7.2" - cors: "npm:~2.8.5" - debug: "npm:~4.3.1" - engine.io-parser: "npm:~5.2.1" - ws: "npm:~8.17.1" - checksum: 10c0/845761163f8ea7962c049df653b75dafb6b3693ad6f59809d4474751d7b0392cbf3dc2730b8a902ff93677a91fd28711d34ab29efd348a8a4b49c6b0724021ab - languageName: node - linkType: hard - "enquirer@npm:^2.3.6": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -2777,19 +2147,7 @@ __metadata: languageName: node linkType: hard -"ent@npm:~2.2.0": - version: 2.2.2 - resolution: "ent@npm:2.2.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - punycode: "npm:^1.4.1" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/83673cc952bb1ca01473460eb4f1289448d887ef2bfcdd142bfe83cd20a794a4393b6bca543922bf1eb913d1ae0ab69ca2d2f1f6a5e9f3de6e68464b3a3b9096 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": +"env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 @@ -2803,15 +2161,6 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": - version: 1.3.4 - resolution: "error-ex@npm:1.3.4" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 - languageName: node - linkType: hard - "es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -2847,7 +2196,7 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": +"escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 @@ -2868,55 +2217,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"escodegen@npm:^2.1.0": - version: 2.1.0 - resolution: "escodegen@npm:2.1.0" - dependencies: - esprima: "npm:^4.0.1" - estraverse: "npm:^5.2.0" - esutils: "npm:^2.0.2" - source-map: "npm:~0.6.1" - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 - languageName: node - linkType: hard - -"esprima@npm:^4.0.1": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - "etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" @@ -2931,22 +2231,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - -"events-universal@npm:^1.0.0": - version: 1.0.1 - resolution: "events-universal@npm:1.0.1" - dependencies: - bare-events: "npm:^2.7.0" - checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 - languageName: node - linkType: hard - "execa@npm:4.1.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -3019,14 +2303,14 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.0, extend@npm:~3.0.2": +"extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 languageName: node linkType: hard -"extract-zip@npm:2.0.1, extract-zip@npm:^2.0.1": +"extract-zip@npm:2.0.1": version: 2.0.1 resolution: "extract-zip@npm:2.0.1" dependencies: @@ -3057,13 +2341,6 @@ __metadata: languageName: node linkType: hard -"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": - version: 1.3.2 - resolution: "fast-fifo@npm:1.3.2" - checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c - languageName: node - linkType: hard - "fd-slicer@npm:~1.1.0": version: 1.1.0 resolution: "fd-slicer@npm:1.1.0" @@ -3103,21 +2380,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.1.2": - version: 1.1.2 - resolution: "finalhandler@npm:1.1.2" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:~2.3.0" - parseurl: "npm:~1.3.3" - statuses: "npm:~1.5.0" - unpipe: "npm:~1.0.0" - checksum: 10c0/6a96e1f5caab085628c11d9fdceb82ba608d5e426c6913d4d918409baa271037a47f28fbba73279e8ad614f0b8fa71ea791d265e408d760793829edd8c2f4584 - languageName: node - linkType: hard - "finalhandler@npm:1.3.1": version: 1.3.1 resolution: "finalhandler@npm:1.3.1" @@ -3133,42 +2395,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe - languageName: node - linkType: hard - -"flatted@npm:^3.2.7": - version: 3.3.3 - resolution: "flatted@npm:3.3.3" - checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f - languageName: node - linkType: hard - "foreground-child@npm:^3.1.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" @@ -3213,17 +2439,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^4.0.0" - universalify: "npm:^0.1.0" - checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 - languageName: node - linkType: hard - "fs-extra@npm:^9.1.0": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" @@ -3245,32 +2460,6 @@ __metadata: languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -3278,20 +2467,6 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df - languageName: node - linkType: hard - "get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" @@ -3336,17 +2511,6 @@ __metadata: languageName: node linkType: hard -"get-uri@npm:^6.0.1": - version: 6.0.5 - resolution: "get-uri@npm:6.0.5" - dependencies: - basic-ftp: "npm:^5.0.2" - data-uri-to-buffer: "npm:^6.0.2" - debug: "npm:^4.3.4" - checksum: 10c0/c7ff5d5d55de53d23ecce7c5108cc3ed0db1174db43c9aa15506d640283d36ee0956fd8ba1fc50b06a718466cc85794ae9d8860193f91318afe846e3e7010f3a - languageName: node - linkType: hard - "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -3356,15 +2520,6 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - "glob@npm:^10.2.2": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -3381,36 +2536,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.4.5": - version: 10.5.0 - resolution: "glob@npm:10.5.0" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.7": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - "global-dirs@npm:^3.0.0": version: 3.0.1 resolution: "global-dirs@npm:3.0.1" @@ -3443,13 +2568,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -3492,15 +2610,6 @@ __metadata: languageName: node linkType: hard -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.2.0 resolution: "http-cache-semantics@npm:4.2.0" @@ -3521,20 +2630,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:~2.0.1": - version: 2.0.1 - resolution: "http-errors@npm:2.0.1" - dependencies: - depd: "npm:~2.0.0" - inherits: "npm:~2.0.4" - setprototypeof: "npm:~1.2.0" - statuses: "npm:~2.0.2" - toidentifier: "npm:~1.0.1" - checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": +"http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -3544,17 +2640,6 @@ __metadata: languageName: node linkType: hard -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 - languageName: node - linkType: hard - "http-signature@npm:~1.4.0": version: 1.4.0 resolution: "http-signature@npm:1.4.0" @@ -3566,7 +2651,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": +"https-proxy-agent@npm:^7.0.1": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -3583,7 +2668,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:~0.4.24": +"iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -3615,16 +2700,6 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.3.0": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec - languageName: node - linkType: hard - "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -3639,17 +2714,7 @@ __metadata: languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:~2.0.4": +"inherits@npm:2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -3680,22 +2745,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -3710,7 +2759,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -3736,32 +2785,13 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 languageName: node linkType: hard -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: 10c0/e5c9814cdaa627a9ad0a0964ded0e0491bfd9ace405c49a5d63c88b30a162f1512c069d5b80997893c4d0181eadc3fed02b4ab4b81059aba5620bfcdfdeb9c53 - languageName: node - linkType: hard - -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -3783,13 +2813,6 @@ __metadata: languageName: node linkType: hard -"isbinaryfile@npm:^4.0.8": - version: 4.0.10 - resolution: "isbinaryfile@npm:4.0.10" - checksum: 10c0/0703d8cfeb69ed79e6d173120f327450011a066755150a6bbf97ffecec1069a5f2092777868315b21359098c84b54984871cad1abce877ad9141fb2caf3dcabf - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -3824,24 +2847,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.1 - resolution: "js-yaml@npm:4.1.1" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 - languageName: node - linkType: hard - "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -3856,13 +2861,6 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 - languageName: node - linkType: hard - "json-schema@npm:0.4.0": version: 0.4.0 resolution: "json-schema@npm:0.4.0" @@ -3886,18 +2884,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.6" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -3923,94 +2909,6 @@ __metadata: languageName: node linkType: hard -"just-extend@npm:^6.2.0": - version: 6.2.0 - resolution: "just-extend@npm:6.2.0" - checksum: 10c0/d41cbdb6d85b986d4deaf2144d81d4f7266cd408fc95189d046d63f610c2dc486b141aeb6ef319c2d76fe904d45a6bb31f19b098ff0427c35688e0c383fc0511 - languageName: node - linkType: hard - -"karma-chrome-launcher@npm:^3.2.0": - version: 3.2.0 - resolution: "karma-chrome-launcher@npm:3.2.0" - dependencies: - which: "npm:^1.2.1" - checksum: 10c0/0cec1ae7d922110dc29cee36389d597157c82f019c8917259f9fa93d1f5ee8e19141c2eb74bfe30797cdb3adbc51a6b65fd18a9ebc1527c725c4acf62cd46d04 - languageName: node - linkType: hard - -"karma-mocha@npm:^2.0.1": - version: 2.0.1 - resolution: "karma-mocha@npm:2.0.1" - dependencies: - minimist: "npm:^1.2.3" - checksum: 10c0/99ef62d863f6bf8cb11df0f4a9d47615369a0ce8a937d9a0cd7fb83fdbb0ef7420c7ea396de514be48500fac1563a00ab964b7d1adc4ee3f5a875ebf07eb012d - languageName: node - linkType: hard - -"karma-sinon-chai@npm:^2.0.2": - version: 2.0.2 - resolution: "karma-sinon-chai@npm:2.0.2" - peerDependencies: - chai: ">=3.5.0" - sinon: ">=2.1.0" - sinon-chai: ">=2.9.0" - checksum: 10c0/ae65c25a2ab7ed6ac7ddb414754617137d8c80386ef8f1fe56cf0f4a98d73ad261382a2bb99f0fdccb10892df6c52bf51667a875872d68c58510756e7f265327 - languageName: node - linkType: hard - -"karma-spec-reporter@npm:^0.0.36": - version: 0.0.36 - resolution: "karma-spec-reporter@npm:0.0.36" - dependencies: - colors: "npm:1.4.0" - peerDependencies: - karma: ">=0.9" - checksum: 10c0/ae2e9cb5e2af74f0d4d8faa752c7c7204c296566906ea0d1a0eb98e76a02224b3aa60fe58c2b7cb40df4161ecd8a89feb0bd3ced5fffcae4fd5a40b72d48db9d - languageName: node - linkType: hard - -"karma@npm:^6.4.4": - version: 6.4.4 - resolution: "karma@npm:6.4.4" - dependencies: - "@colors/colors": "npm:1.5.0" - body-parser: "npm:^1.19.0" - braces: "npm:^3.0.2" - chokidar: "npm:^3.5.1" - connect: "npm:^3.7.0" - di: "npm:^0.0.1" - dom-serialize: "npm:^2.2.1" - glob: "npm:^7.1.7" - graceful-fs: "npm:^4.2.6" - http-proxy: "npm:^1.18.1" - isbinaryfile: "npm:^4.0.8" - lodash: "npm:^4.17.21" - log4js: "npm:^6.4.1" - mime: "npm:^2.5.2" - minimatch: "npm:^3.0.4" - mkdirp: "npm:^0.5.5" - qjobs: "npm:^1.2.0" - range-parser: "npm:^1.2.1" - rimraf: "npm:^3.0.2" - socket.io: "npm:^4.7.2" - source-map: "npm:^0.6.1" - tmp: "npm:^0.2.1" - ua-parser-js: "npm:^0.7.30" - yargs: "npm:^16.1.1" - bin: - karma: bin/karma - checksum: 10c0/1658c4b7396c0edf6f048289182e075b561902e02992e1a3eb72f56f67090ff0c7ad7c91ab099e88a790c60f9500c5a6f974d75f1769e3ea2dfccda52876ec0b - languageName: node - linkType: hard - -"leven@npm:2.1.0": - version: 2.1.0 - resolution: "leven@npm:2.1.0" - checksum: 10c0/e685243900aad7e854212001c9b7fe6d0806081e184d5077a561a91d07425852e8b7d1edf76b948f4be520b64e0015960be3a5f3e9acb0bec75a0e4134b422df - languageName: node - linkType: hard - "lightningcss-darwin-arm64@npm:1.30.1": version: 1.30.1 resolution: "lightningcss-darwin-arm64@npm:1.30.1" @@ -4121,13 +3019,6 @@ __metadata: languageName: node linkType: hard -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d - languageName: node - linkType: hard - "listr2@npm:^3.8.3": version: 3.14.0 resolution: "listr2@npm:3.14.0" @@ -4184,22 +3075,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - -"lodash.get@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.get@npm:4.4.2" - checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e - languageName: node - linkType: hard - "lodash.once@npm:^4.1.1": version: 4.1.1 resolution: "lodash.once@npm:4.1.1" @@ -4214,7 +3089,7 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:^4.0.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -4236,28 +3111,6 @@ __metadata: languageName: node linkType: hard -"log4js@npm:^6.4.1": - version: 6.9.1 - resolution: "log4js@npm:6.9.1" - dependencies: - date-format: "npm:^4.0.14" - debug: "npm:^4.3.4" - flatted: "npm:^3.2.7" - rfdc: "npm:^1.3.0" - streamroller: "npm:^3.1.5" - checksum: 10c0/05846e48f72d662800c8189bd178c42b4aa2f0c574cfc90a1942cf90b76f621c44019e26796c8fd88da1b6f0fe8272cba607cbaad6ae6ede50a7a096b58197ea - languageName: node - linkType: hard - -"loupe@npm:^2.3.6": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 - languageName: node - linkType: hard - "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -4265,13 +3118,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.14.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed - languageName: node - linkType: hard - "make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" @@ -4361,15 +3207,6 @@ __metadata: languageName: node linkType: hard -"mime@npm:^2.5.2": - version: 2.6.0 - resolution: "mime@npm:2.6.0" - bin: - mime: cli.js - checksum: 10c0/a7f2589900d9c16e3bdf7672d16a6274df903da958c1643c9c45771f0478f3846dcb1097f31eb9178452570271361e2149310931ec705c037210fc69639c8e6c - languageName: node - linkType: hard - "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -4377,16 +3214,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -4395,7 +3223,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:^1.2.8": +"minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -4487,75 +3315,6 @@ __metadata: languageName: node linkType: hard -"mitt@npm:^3.0.1": - version: 3.0.1 - resolution: "mitt@npm:3.0.1" - checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.5": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - -"mocha-headless-chrome@npm:^5.1.0": - version: 5.1.0 - resolution: "mocha-headless-chrome@npm:5.1.0" - dependencies: - args: "npm:^5.0.1" - puppeteer: "npm:^24.3.0" - bin: - mocha-headless-chrome: bin/start - checksum: 10c0/4f882f6b026364c27a06a361328cf6f2aace11e9d759099d613a0fe9e83c5ee70610cc154aa6848c9191bb5cfcb1cb80ca21ff0aa06ff3189bff4632de7aa1d0 - languageName: node - linkType: hard - -"mocha@npm:^11.7.5": - version: 11.7.5 - resolution: "mocha@npm:11.7.5" - dependencies: - browser-stdout: "npm:^1.3.1" - chokidar: "npm:^4.0.1" - debug: "npm:^4.3.5" - diff: "npm:^7.0.0" - escape-string-regexp: "npm:^4.0.0" - find-up: "npm:^5.0.0" - glob: "npm:^10.4.5" - he: "npm:^1.2.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - log-symbols: "npm:^4.1.0" - minimatch: "npm:^9.0.5" - ms: "npm:^2.1.3" - picocolors: "npm:^1.1.1" - serialize-javascript: "npm:^6.0.2" - strip-json-comments: "npm:^3.1.1" - supports-color: "npm:^8.1.1" - workerpool: "npm:^9.2.0" - yargs: "npm:^17.7.2" - yargs-parser: "npm:^21.1.1" - yargs-unparser: "npm:^2.0.0" - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 10c0/e6150cba85345aaabbc5b2e7341b1e6706b878f5a9782960cad57fd4cc458730a76d08c5f1a3e05d3ebb49cad93b455764bb00727bd148dcaf0c6dd4fa665b3d - languageName: node - linkType: hard - -"mri@npm:1.1.4": - version: 1.1.4 - resolution: "mri@npm:1.1.4" - checksum: 10c0/eb577c2ef60385aa287afdac777e536996f4fd3144250c201097e7ec121568139d482c92cb9a512f90e428d6dc3e9ba8e9de89bc204424cb96f187a4bdc465c1 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -4627,26 +3386,6 @@ __metadata: languageName: node linkType: hard -"netmask@npm:^2.0.2": - version: 2.0.2 - resolution: "netmask@npm:2.0.2" - checksum: 10c0/cafd28388e698e1138ace947929f842944d0f1c0b87d3fa2601a61b38dc89397d33c0ce2c8e7b99e968584b91d15f6810b91bef3f3826adf71b1833b61d4bf4f - languageName: node - linkType: hard - -"nise@npm:^6.0.0": - version: 6.1.1 - resolution: "nise@npm:6.1.1" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - "@sinonjs/fake-timers": "npm:^13.0.1" - "@sinonjs/text-encoding": "npm:^0.7.3" - just-extend: "npm:^6.2.0" - path-to-regexp: "npm:^8.1.0" - checksum: 10c0/09471adb738dc3be2981cc7815c90879ed6a5a3e162202ca66e12f9a5a0956bea718d0ec2f0c07acc26e3f958481b8fb30c30da76c13620e922f3b9dcd249c50 - languageName: node - linkType: hard - "node-addon-api@npm:^6.1.0": version: 6.1.0 resolution: "node-addon-api@npm:6.1.0" @@ -4729,13 +3468,6 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - "npm-run-path@npm:^4.0.0": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -4752,13 +3484,6 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - "object-inspect@npm:^1.13.3": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -4766,7 +3491,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:~2.4.1": +"on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -4775,16 +3500,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/c904f9e518b11941eb60279a3cbfaf1289bd0001f600a950255b1dede9fe3df8cd74f38483550b3bb9485165166acb5db500c3b4c4337aec2815c88c96fcc2ea - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -4816,24 +3532,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -4844,35 +3542,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"pac-proxy-agent@npm:^7.1.0": - version: 7.2.0 - resolution: "pac-proxy-agent@npm:7.2.0" - dependencies: - "@tootallnate/quickjs-emscripten": "npm:^0.23.0" - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - get-uri: "npm:^6.0.1" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.6" - pac-resolver: "npm:^7.0.1" - socks-proxy-agent: "npm:^8.0.5" - checksum: 10c0/0265c17c9401c2ea735697931a6553a0c6d8b20c4d7d4e3b3a0506080ba69a8d5ad656e2a6be875411212e2b6ed7a4d9526dd3997e08581fdfb1cbcad454c296 - languageName: node - linkType: hard - -"pac-resolver@npm:^7.0.1": - version: 7.0.1 - resolution: "pac-resolver@npm:7.0.1" - dependencies: - degenerator: "npm:^5.0.0" - netmask: "npm:^2.0.2" - checksum: 10c0/5f3edd1dd10fded31e7d1f95776442c3ee51aa098c28b74ede4927d9677ebe7cebb2636750c24e945f5b84445e41ae39093d3a1014a994e5ceb9f0b1b88ebff5 + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c languageName: node linkType: hard @@ -4908,27 +3580,6 @@ __metadata: languageName: node linkType: hard -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 - languageName: node - linkType: hard - "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -4936,20 +3587,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - "path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -4974,20 +3611,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:^8.1.0": - version: 8.2.0 - resolution: "path-to-regexp@npm:8.2.0" - checksum: 10c0/ef7d0a887b603c0a142fad16ccebdcdc42910f0b14830517c724466ad676107476bba2fe9fffd28fd4c141391ccd42ea426f32bb44c2c82ecaefe10c37b90f5a - languageName: node - linkType: hard - -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc - languageName: node - linkType: hard - "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -5009,7 +3632,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be @@ -5058,13 +3681,6 @@ __metadata: languageName: node linkType: hard -"progress@npm:^2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -5085,22 +3701,6 @@ __metadata: languageName: node linkType: hard -"proxy-agent@npm:^6.5.0": - version: 6.5.0 - resolution: "proxy-agent@npm:6.5.0" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - http-proxy-agent: "npm:^7.0.1" - https-proxy-agent: "npm:^7.0.6" - lru-cache: "npm:^7.14.1" - pac-proxy-agent: "npm:^7.1.0" - proxy-from-env: "npm:^1.1.0" - socks-proxy-agent: "npm:^8.0.5" - checksum: 10c0/7fd4e6f36bf17098a686d4aee3b8394abfc0b0537c2174ce96b0a4223198b9fafb16576c90108a3fcfc2af0168bd7747152bfa1f58e8fee91d3780e79aab7fd8 - languageName: node - linkType: hard - "proxy-from-env@npm:1.0.0": version: 1.0.0 resolution: "proxy-from-env@npm:1.0.0" @@ -5108,13 +3708,6 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - "pump@npm:^3.0.0": version: 3.0.2 resolution: "pump@npm:3.0.2" @@ -5125,51 +3718,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.4.1": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - -"puppeteer-core@npm:24.35.0": - version: 24.35.0 - resolution: "puppeteer-core@npm:24.35.0" - dependencies: - "@puppeteer/browsers": "npm:2.11.1" - chromium-bidi: "npm:12.0.1" - debug: "npm:^4.4.3" - devtools-protocol: "npm:0.0.1534754" - typed-query-selector: "npm:^2.12.0" - webdriver-bidi-protocol: "npm:0.3.10" - ws: "npm:^8.19.0" - checksum: 10c0/38a45a1e8bc1f688e0d6a98dd630d5e60485657510fc572077889e48dd82d22f354786dabfb8d7afde107602a7a7e35d046ac95dbfe93b880574d2e523b8a8d6 - languageName: node - linkType: hard - -"puppeteer@npm:^24.3.0": - version: 24.35.0 - resolution: "puppeteer@npm:24.35.0" - dependencies: - "@puppeteer/browsers": "npm:2.11.1" - chromium-bidi: "npm:12.0.1" - cosmiconfig: "npm:^9.0.0" - devtools-protocol: "npm:0.0.1534754" - puppeteer-core: "npm:24.35.0" - typed-query-selector: "npm:^2.12.0" - bin: - puppeteer: lib/cjs/puppeteer/node/cli.js - checksum: 10c0/2a7f3a5175bae9b52b4a071c99436bd3b8697faa6eb3fab8589950ab6b7a0d6b176c7573d256e2781a5f824cd03dd9561043f4371f1dfc8a7e6e8c9d280b5730 - languageName: node - linkType: hard - -"qjobs@npm:^1.2.0": - version: 1.2.0 - resolution: "qjobs@npm:1.2.0" - checksum: 10c0/772207772b856a3b1ec673b11a6cda074f1b82821644f2d042504b438ea3ea1fe918555547491e717e8694ec105379fe5139fc5ddd7937b21f7712bb648ed01d - languageName: node - linkType: hard - "qs@npm:6.13.0": version: 6.13.0 resolution: "qs@npm:6.13.0" @@ -5179,7 +3727,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:~6.14.0, qs@npm:~6.14.1": +"qs@npm:~6.14.1": version: 6.14.1 resolution: "qs@npm:6.14.1" dependencies: @@ -5188,16 +3736,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": +"range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 @@ -5216,18 +3755,6 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:~2.5.3": - version: 2.5.3 - resolution: "raw-body@npm:2.5.3" - dependencies: - bytes: "npm:~3.1.2" - http-errors: "npm:~2.0.1" - iconv-lite: "npm:~0.4.24" - unpipe: "npm:~1.0.0" - checksum: 10c0/449844344fc90547fb994383a494b83300e4f22199f146a79f68d78a199a8f2a923ea9fd29c3be979bfd50291a3884733619ffc15ba02a32e703b612f8d3f74a - languageName: node - linkType: hard - "react-refresh@npm:^0.16.0": version: 0.16.0 resolution: "react-refresh@npm:0.16.0" @@ -5242,15 +3769,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.1": version: 0.14.1 resolution: "regenerator-runtime@npm:0.14.1" @@ -5267,27 +3785,6 @@ __metadata: languageName: node linkType: hard -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -5312,17 +3809,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 - languageName: node - linkType: hard - "rxjs@npm:^7.5.1": version: 7.8.2 resolution: "rxjs@npm:7.8.2" @@ -5332,24 +3818,13 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.2": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 languageName: node linkType: hard -"safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -5383,15 +3858,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.7.3": - version: 7.7.3 - resolution: "semver@npm:7.7.3" - bin: - semver: bin/semver.js - checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e - languageName: node - linkType: hard - "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -5413,15 +3879,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 - languageName: node - linkType: hard - "serve-static@npm:1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" @@ -5434,7 +3891,7 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": +"setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc @@ -5519,30 +3976,6 @@ __metadata: languageName: node linkType: hard -"sinon-chai@npm:^3.7.0": - version: 3.7.0 - resolution: "sinon-chai@npm:3.7.0" - peerDependencies: - chai: ^4.0.0 - sinon: ">=4.0.0" - checksum: 10c0/9bbb0494be89c313f5287c2a0c9890104e3070ad6bf06c359b0c3cd776ea6273f7846ee1ab01fa2e0328e741f8717348669ee232e83b94b193676a56f48d2c63 - languageName: node - linkType: hard - -"sinon@npm:^18.0.1": - version: 18.0.1 - resolution: "sinon@npm:18.0.1" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - "@sinonjs/fake-timers": "npm:11.2.2" - "@sinonjs/samsam": "npm:^8.0.0" - diff: "npm:^5.2.0" - nise: "npm:^6.0.0" - supports-color: "npm:^7" - checksum: 10c0/c4554b8d9654d42fc4baefecd3b5ac42bcce73ad926d58521233d9c355dc2c1a0d73c55e5b2c929b6814e528cd9b54bc61096b9288579f9b284edd6e3d2da3df - languageName: node - linkType: hard - "slice-ansi@npm:^3.0.0": version: 3.0.0 resolution: "slice-ansi@npm:3.0.0" @@ -5572,42 +4005,7 @@ __metadata: languageName: node linkType: hard -"socket.io-adapter@npm:~2.5.2": - version: 2.5.5 - resolution: "socket.io-adapter@npm:2.5.5" - dependencies: - debug: "npm:~4.3.4" - ws: "npm:~8.17.1" - checksum: 10c0/04a5a2a9c4399d1b6597c2afc4492ab1e73430cc124ab02b09e948eabf341180b3866e2b61b5084cb899beb68a4db7c328c29bda5efb9207671b5cb0bc6de44e - languageName: node - linkType: hard - -"socket.io-parser@npm:~4.2.4": - version: 4.2.4 - resolution: "socket.io-parser@npm:4.2.4" - dependencies: - "@socket.io/component-emitter": "npm:~3.1.0" - debug: "npm:~4.3.1" - checksum: 10c0/9383b30358fde4a801ea4ec5e6860915c0389a091321f1c1f41506618b5cf7cd685d0a31c587467a0c4ee99ef98c2b99fb87911f9dfb329716c43b587f29ca48 - languageName: node - linkType: hard - -"socket.io@npm:^4.7.2": - version: 4.8.1 - resolution: "socket.io@npm:4.8.1" - dependencies: - accepts: "npm:~1.3.4" - base64id: "npm:~2.0.0" - cors: "npm:~2.8.5" - debug: "npm:~4.3.2" - engine.io: "npm:~6.6.0" - socket.io-adapter: "npm:~2.5.2" - socket.io-parser: "npm:~4.2.4" - checksum: 10c0/acf931a2bb235be96433b71da3d8addc63eeeaa8acabd33dc8d64e12287390a45f1e9f389a73cf7dc336961cd491679741b7a016048325c596835abbcc017ca9 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.5": +"socks-proxy-agent@npm:^8.0.3": version: 8.0.5 resolution: "socks-proxy-agent@npm:8.0.5" dependencies: @@ -5635,13 +4033,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.1, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -5686,43 +4077,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:~1.5.0": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 - languageName: node - linkType: hard - -"statuses@npm:~2.0.2": - version: 2.0.2 - resolution: "statuses@npm:2.0.2" - checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f - languageName: node - linkType: hard - -"streamroller@npm:^3.1.5": - version: 3.1.5 - resolution: "streamroller@npm:3.1.5" - dependencies: - date-format: "npm:^4.0.14" - debug: "npm:^4.3.4" - fs-extra: "npm:^8.1.0" - checksum: 10c0/0bdeec34ad37487d959ba908f17067c938f544db88b5bb1669497a67a6b676413229ce5a6145c2812d06959ebeb8842e751076647d4b323ca06be612963b9099 - languageName: node - linkType: hard - -"streamx@npm:^2.15.0, streamx@npm:^2.21.0": - version: 2.23.0 - resolution: "streamx@npm:2.23.0" - dependencies: - events-universal: "npm:^1.0.0" - fast-fifo: "npm:^1.3.2" - text-decoder: "npm:^1.1.0" - checksum: 10c0/15708ce37818d588632fe1104e8febde573e33e8c0868bf583fce0703f3faf8d2a063c278e30df2270206811b69997f64eb78792099933a1fe757e786fbcbd44 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -5769,23 +4124,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-color@npm:^7, supports-color@npm:^7.1.0": +"supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: @@ -5813,34 +4152,6 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^3.1.1": - version: 3.1.1 - resolution: "tar-fs@npm:3.1.1" - dependencies: - bare-fs: "npm:^4.0.1" - bare-path: "npm:^3.0.0" - pump: "npm:^3.0.0" - tar-stream: "npm:^3.1.5" - dependenciesMeta: - bare-fs: - optional: true - bare-path: - optional: true - checksum: 10c0/0c677d711c4aa41f94e1a712aa647022ba1910ff84430739e5d9e95a615e3ea1b7112dc93164fc8ce30dc715befcf9cfdc64da27d4e7958d73c59bda06aa0d8e - languageName: node - linkType: hard - -"tar-stream@npm:^3.1.5": - version: 3.1.7 - resolution: "tar-stream@npm:3.1.7" - dependencies: - b4a: "npm:^1.6.4" - fast-fifo: "npm:^1.2.0" - streamx: "npm:^2.15.0" - checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 - languageName: node - linkType: hard - "tar@npm:7.5.3": version: 7.5.3 resolution: "tar@npm:7.5.3" @@ -5861,15 +4172,6 @@ __metadata: languageName: node linkType: hard -"text-decoder@npm:^1.1.0": - version: 1.2.3 - resolution: "text-decoder@npm:1.2.3" - dependencies: - b4a: "npm:^1.6.4" - checksum: 10c0/569d776b9250158681c83656ef2c3e0a5d5c660c27ca69f87eedef921749a4fbf02095e5f9a0f862a25cf35258379b06e31dee9c125c9f72e273b7ca1a6d1977 - languageName: node - linkType: hard - "throttleit@npm:^1.0.0": version: 1.0.1 resolution: "throttleit@npm:1.0.1" @@ -5912,13 +4214,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.1": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 - languageName: node - linkType: hard - "tmp@npm:~0.2.4": version: 0.2.5 resolution: "tmp@npm:0.2.5" @@ -5935,7 +4230,7 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": +"toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 @@ -5960,7 +4255,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.8.0": +"tslib@npm:^2.1.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -5983,20 +4278,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd - languageName: node - linkType: hard - -"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": - version: 4.1.0 - resolution: "type-detect@npm:4.1.0" - checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a - languageName: node - linkType: hard - "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -6028,22 +4309,6 @@ __metadata: languageName: node linkType: hard -"typed-query-selector@npm:^2.12.0": - version: 2.12.0 - resolution: "typed-query-selector@npm:2.12.0" - checksum: 10c0/069509887ecfff824a470f5f93d300cc9223cb059a36c47ac685f2812c4c9470340e07615893765e4264cef1678507532fa78f642fd52f276b589f7f5d791f79 - languageName: node - linkType: hard - -"ua-parser-js@npm:^0.7.30": - version: 0.7.40 - resolution: "ua-parser-js@npm:0.7.40" - bin: - ua-parser-js: script/cli.js - checksum: 10c0/d114f0b71b5b0106dcc0cb7cc26a44690073e886fa1444f8c03131d4f57b3f6645f9fb7b308b0aaaa5a2774461f9e8fe1a2a1c3ff69aa531316fcf14cd44dbe3 - languageName: node - linkType: hard - "undici-types@npm:~6.21.0": version: 6.21.0 resolution: "undici-types@npm:6.21.0" @@ -6069,13 +4334,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 - languageName: node - linkType: hard - "universalify@npm:^2.0.0": version: 2.0.1 resolution: "universalify@npm:2.0.1" @@ -6134,7 +4392,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f @@ -6152,13 +4410,6 @@ __metadata: languageName: node linkType: hard -"void-elements@npm:^2.0.0": - version: 2.0.1 - resolution: "void-elements@npm:2.0.1" - checksum: 10c0/23b4f35bbeabcaa5c87a9f638ae80862a9313dccbaa8973b0eada81dbe97488ae11baf4d8aa2846bc397d31456afdfd8d791bb44c542f83735e6d04af6996f4d - languageName: node - linkType: hard - "weak-lru-cache@npm:^1.2.2": version: 1.2.2 resolution: "weak-lru-cache@npm:1.2.2" @@ -6166,24 +4417,6 @@ __metadata: languageName: node linkType: hard -"webdriver-bidi-protocol@npm:0.3.10": - version: 0.3.10 - resolution: "webdriver-bidi-protocol@npm:0.3.10" - checksum: 10c0/fc66ba53b31c78a73ff7841303948894b77263051c146fed4331596b95f67a2e96dfaeb895483002bb152317d9cfbd215d9a66ef114f66dc17de2c32ac5ef33c - languageName: node - linkType: hard - -"which@npm:^1.2.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -6206,13 +4439,6 @@ __metadata: languageName: node linkType: hard -"workerpool@npm:^9.2.0": - version: 9.3.4 - resolution: "workerpool@npm:9.3.4" - checksum: 10c0/b09d80c81c6e50dab1bc6cc3a4180d4222068f17ada9b04fb7053bf98fdbe3dbd6bdd04ad1420363f5391cbf57d622ecd2680469ad0137aef990f510ab807a09 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -6253,43 +4479,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.19.0": - version: 8.19.0 - resolution: "ws@npm:8.19.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/4741d9b9bc3f9c791880882414f96e36b8b254e34d4b503279d6400d9a4b87a033834856dbdd94ee4b637944df17ea8afc4bce0ff4a1560d2166be8855da5b04 - languageName: node - linkType: hard - -"ws@npm:~8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -6304,62 +4493,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yargs-unparser@npm:^2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: "npm:^6.0.0" - decamelize: "npm:^4.0.0" - flat: "npm:^5.0.2" - is-plain-obj: "npm:^2.1.0" - checksum: 10c0/a5a7d6dc157efa95122e16780c019f40ed91d4af6d2bac066db8194ed0ec5c330abb115daa5a79ff07a9b80b8ea80c925baacf354c4c12edd878c0529927ff03 - languageName: node - linkType: hard - -"yargs@npm:^16.1.1": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 - languageName: node - linkType: hard - -"yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0" @@ -6369,17 +4502,3 @@ __metadata: checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 languageName: node linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard - -"zod@npm:^3.24.1": - version: 3.25.76 - resolution: "zod@npm:3.25.76" - checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c - languageName: node - linkType: hard