diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f042fd1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + branches: + - master + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + build-and-test: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v4 + with: + node-version: 20.x + - name: Build SDK + run: | + npm install + npm run build + - name: Install test-app dependencies + run: npm install + working-directory: test-app + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + working-directory: test-app + - name: Run Playwright tests + run: npx playwright test + working-directory: test-app + env: + CI: true diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml deleted file mode 100644 index 102ba51..0000000 --- a/.github/workflows/nodejs.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Node CI - -on: - push: - pull_request: - branches: - - master - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [20.x] - - steps: - - uses: actions/checkout@v1 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Build and Test - run: | - npm install - npm run build - npm run test - env: - CI: true - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 diff --git a/.github/workflows/npmpublish.yml b/.github/workflows/publish-npm.yml similarity index 51% rename from .github/workflows/npmpublish.yml rename to .github/workflows/publish-npm.yml index 44a47a4..68c47d7 100644 --- a/.github/workflows/npmpublish.yml +++ b/.github/workflows/publish-npm.yml @@ -6,42 +6,22 @@ on: jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [20.x] - - steps: - - uses: actions/checkout@v1 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Build and Test - run: | - npm install - npm run build - npm run test - env: - CI: true - publish: - needs: build runs-on: ubuntu-latest + permissions: + contents: read + id-token: write steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 20.x registry-url: https://registry.npmjs.org/ - name: NPM Publish run: | npm install npm run build - npm config set //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN # print the NPM user name for validation npm whoami VERSION=$(node -p "require('./package.json').version" ) @@ -52,7 +32,7 @@ jobs: NPM_TAG="beta" fi echo "Publishing $VERSION with $NPM_TAG tag." - npm publish --tag $NPM_TAG --access public + npm publish --tag $NPM_TAG --provenance --access public env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} CI: true \ No newline at end of file diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..eaaa043 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,19 @@ +name: release-please + +on: + push: + branches: + - master + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@v4 + with: + config-file: release-please-config.json + manifest-file: .release-please-manifest.json diff --git a/.github/workflows/sync-release-as.yml b/.github/workflows/sync-release-as.yml new file mode 100644 index 0000000..9915004 --- /dev/null +++ b/.github/workflows/sync-release-as.yml @@ -0,0 +1,63 @@ +name: Sync Release-As from release PR title + +on: + pull_request: + types: [edited] + +permissions: + contents: write + +jobs: + sync: + if: >- + github.event.pull_request.base.ref == 'master' && + startsWith(github.event.pull_request.head.ref, 'release-please--') && + github.event.changes.title != null + runs-on: ubuntu-latest + steps: + - name: Extract versions from old and new title + id: parse + env: + NEW_TITLE: ${{ github.event.pull_request.title }} + OLD_TITLE: ${{ github.event.changes.title.from }} + run: | + # Anchored on pull-request-title-pattern "release: ${version}" from release-please-config.json. + extract() { + echo "$1" | grep -oE '^release:[[:space:]]+v?[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?' \ + | sed -E 's/^release:[[:space:]]+v?//' + } + NEW_VERSION=$(extract "$NEW_TITLE") + OLD_VERSION=$(extract "$OLD_TITLE") + echo "old=$OLD_VERSION" + echo "new=$NEW_VERSION" + if [ -z "$NEW_VERSION" ]; then + echo "::notice::No semver in new title; nothing to do." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + if [ "$NEW_VERSION" = "$OLD_VERSION" ]; then + echo "::notice::Version unchanged ($NEW_VERSION); not pushing." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT" + + - name: Check out master + if: steps.parse.outputs.skip != 'true' + uses: actions/checkout@v6 + with: + ref: master + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + fetch-depth: 1 + + - name: Push empty Release-As commit + if: steps.parse.outputs.skip != 'true' + env: + VERSION: ${{ steps.parse.outputs.version }} + run: | + git config user.name "release-as-bot" + git config user.email "release-as-bot@users.noreply.github.com" + git commit --allow-empty -m "chore: pin next release + + Release-As: ${VERSION}" + git push origin master diff --git a/.gitignore b/.gitignore index 9361b82..736009f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ -node_modules/* -samples/sample-app/node_modules/* +node_modules .env .vscode .DS_Store diff --git a/.mocharc.json b/.mocharc.json deleted file mode 100644 index b06f6a6..0000000 --- a/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "coverage": true, - "require": ["./babel-register.js"], - "exit": true, - "timeout": "40000" -} diff --git a/.nycrc.json b/.nycrc.json deleted file mode 100644 index 55fa7d5..0000000 --- a/.nycrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "reporter": ["lcov", "text"], - "exclude": ["babel-register.js", "test"], - "include": ["src"] -} \ No newline at end of file diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..448d10a --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "5.4.0" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2027861 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Image Kit + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 213d7d4..ccdd5bb 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ # ImageKit.io JavaScript SDK -![Node CI](https://github.com/imagekit-developer/imagekit-javascript/workflows/Node%20CI/badge.svg) +![CI](https://github.com/imagekit-developer/imagekit-javascript/workflows/CI/badge.svg) [![npm version](https://img.shields.io/npm/v/@imagekit/javascript)](https://www.npmjs.com/package/@imagekit/javascript) -[![codecov](https://codecov.io/gh/imagekit-developer/imagekit-javascript/branch/master/graph/badge.svg)](https://codecov.io/gh/imagekit-developer/imagekit-javascript) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Twitter Follow](https://img.shields.io/twitter/follow/imagekitio?label=Follow&style=social)](https://twitter.com/ImagekitIo) This lightweight, dependency-free JavaScript SDK is designed specifically for browser use. It provides utility functions to generate image and video `src` URLs using [ImageKit transformations](https://imagekit.io/docs/transformations) and to upload files to the ImageKit media library. diff --git a/babel-register.js b/babel-register.js deleted file mode 100644 index 6b72a65..0000000 --- a/babel-register.js +++ /dev/null @@ -1 +0,0 @@ -require("@babel/register")({ extensions: ['.js', '.jsx', '.ts', '.tsx'] }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 854fa89..4f18c3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,36 +7,20 @@ "": { "name": "@imagekit/javascript", "version": "5.4.0", - "license": "MIT", + "license": "Apache-2.0", "devDependencies": { - "@babel/cli": "^7.10.5", "@babel/core": "^7.10.5", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-transform-optional-chaining": "^7.25.9", "@babel/preset-env": "^7.10.4", "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.14.5", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^8.4.0", - "@rollup/plugin-typescript": "^8.2.1", "@types/node": "^15.6.1", - "babel-plugin-transform-class-properties": "^6.24.1", - "chai": "^4.2.0", - "codecov": "^3.8.3", - "formdata-node": "2.1.0", - "mocha": "^7.0.1", - "nyc": "^15.1.0", - "regenerator-runtime": "^0.13.9", "rollup": "^2.22.0", "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-terser": "^6.1.0", - "sinon": "^8.1.1", - "ts-node": "^10.0.0", - "typescript": "^4.3.2", - "web-file-polyfill": "^1.0.1" + "typescript": "^4.3.2" } }, "node_modules/@ampproject/remapping": { @@ -52,35 +36,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/cli": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.0.tgz", - "integrity": "sha512-bZfxn8DRxwiVzDO5CEeV+7IqXeCkzI4yYnrQbpwjT76CUyossQc6RYE7n+xfm0/2k40lPaCpW0FhxYs7EBAetw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "commander": "^6.2.0", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.6.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -491,41 +446,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -583,18 +503,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", @@ -1548,34 +1456,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz", - "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", - "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, "node_modules/@babel/template": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", @@ -1621,99 +1501,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -1762,13 +1549,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -1825,29 +1605,6 @@ "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@rollup/plugin-typescript": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz", - "integrity": "sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "tslib": { - "optional": true - } - } - }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -1865,84 +1622,6 @@ "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/commons/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/formatio": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz", - "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^4.2.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.2.tgz", - "integrity": "sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -1964,477 +1643,99 @@ "@types/node": "*" } }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "dependencies": { - "acorn": "^8.11.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "dev": true, "dependencies": { - "debug": "4" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, - "engines": { - "node": ">= 6.0.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "node": ">=6" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">=0.6.10" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", - "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "is-string": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", - "dev": true - }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", - "dev": true - }, - "node_modules/babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-traverse/node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-traverse/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "node_modules/caniuse-lite": { + "version": "1.0.30001711", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001711.tgz", + "integrity": "sha512-OpFA8GsKtoV3lCcsI3U5XBAV+oVrMu96OS8XafKqnhOaEAW2mveD1Mx81Sx/02chERwhDakuXs28zbyEc4QMKg==", "dev": true, "funding": [ { @@ -2443,3718 +1744,164 @@ }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } + ] }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001711", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001711.tgz", - "integrity": "sha512-OpFA8GsKtoV3lCcsI3U5XBAV+oVrMu96OS8XafKqnhOaEAW2mveD1Mx81Sx/02chERwhDakuXs28zbyEc4QMKg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/codecov": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", - "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", - "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", - "dev": true, - "dependencies": { - "argv": "0.0.2", - "ignore-walk": "3.0.4", - "js-yaml": "3.14.1", - "teeny-request": "7.1.1", - "urlgrey": "1.0.0" - }, - "bin": { - "codecov": "bin/codecov" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, "node_modules/core-js-compat": { "version": "3.41.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", - "dev": true, - "dependencies": { - "browserslist": "^4.24.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.132", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz", - "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/formdata-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-2.1.0.tgz", - "integrity": "sha512-CnnnN2OICKs+qyybHU2bAobkj8OSeRJD/mSqkzbMHtTVDF0WMhbi/VtuKCQF4LHCqSKqENFzrs3rwKNW2dm2lQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "7.7.7", - "mime-types": "2.1.25", - "nanoid": "2.1.8" - }, - "engines": { - "node": ">= 10.2.x" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-cleanup": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", - "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.25.7", - "perf-regexes": "^1.0.1", - "skip-regex": "^1.0.2" - }, - "engines": { - "node": "^10.14.2 || >=12.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true - }, - "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "dev": true, - "dependencies": { - "mime-db": "1.42.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/mocha/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.8.tgz", - "integrity": "sha512-g1z+n5s26w0TGKh7gjn7HCqurNKMZWzH08elXzh/gM/csQHd/UqDV6uxMghQYg9IvqRPm1QpeMk50YMofHvEjQ==", - "dev": true - }, - "node_modules/nise": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.1.tgz", - "integrity": "sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/nyc/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/nyc/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/perf-regexes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", - "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", - "dev": true, - "engines": { - "node": ">=6.14" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regenerator-transform/node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/regenerator-transform/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-cleanup": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", - "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", - "dev": true, - "dependencies": { - "js-cleanup": "^1.2.0", - "rollup-pluginutils": "^2.8.2" - }, - "engines": { - "node": "^10.14.2 || >=12.0.0" - }, - "peerDependencies": { - "rollup": ">=2.0" - } - }, - "node_modules/rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.12.0" - } - }, - "node_modules/rollup-plugin-commonjs/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" + "browserslist": "^4.24.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==", + "dev": true }, - "node_modules/serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "node_modules/electron-to-chromium": { + "version": "1.5.132", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz", + "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==", "dev": true }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6163,42 +1910,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, - "node_modules/sinon": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.1.1.tgz", - "integrity": "sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew==", - "deprecated": "16.1.1", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/formatio": "^4.0.1", - "@sinonjs/samsam": "^4.2.2", - "diff": "^4.0.2", - "lolex": "^5.1.2", - "nise": "^3.0.1", - "supports-color": "^7.1.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">= 10.13.0" } }, - "node_modules/sinon/node_modules/supports-color": { + "node_modules/jest-worker/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -6210,252 +1942,239 @@ "node": ">=8" } }, - "node_modules/skip-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", - "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", + "node_modules/js-cleanup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", + "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", "dev": true, + "dependencies": { + "magic-string": "^0.25.7", + "perf-regexes": "^1.0.1", + "skip-regex": "^1.0.2" + }, "engines": { - "node": ">=4.2" + "node": "^10.14.2 || >=12.0.0" } }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { "node": ">=6" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "yallist": "^3.0.2" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "node_modules/perf-regexes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", + "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=6.14" } }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "safe-buffer": "^5.1.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "@babel/runtime": "^7.8.4" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/regenerator-transform/node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/regenerator-transform/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "jsesc": "~3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "dev": true - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6463,203 +2182,146 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/teeny-request": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", - "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "node_modules/rollup-plugin-cleanup": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", + "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", "dev": true, "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" + "js-cleanup": "^1.2.0", + "rollup-pluginutils": "^2.8.2" }, "engines": { - "node": ">=6.0.0" + "node": "^10.14.2 || >=12.0.0" + }, + "peerDependencies": { + "rollup": ">=2.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/rollup-plugin-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", + "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@babel/code-frame": "^7.8.3", + "jest-worker": "^26.0.0", + "serialize-javascript": "^3.0.0", + "terser": "^4.7.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "rollup": "^2.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "estree-walker": "^0.6.1" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "@swc/wasm": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ] }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=0.3.1" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "node_modules/serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/skip-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", + "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4.2" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, "engines": { "node": ">= 0.4" }, @@ -6667,34 +2329,28 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, - "engines": { - "node": ">= 0.4" + "bin": { + "terser": "bin/terser" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/typescript": { "version": "4.9.5", @@ -6709,24 +2365,6 @@ "node": ">=4.2.0" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -6797,361 +2435,11 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/urlgrey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", - "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", - "dev": true, - "dependencies": { - "fast-url-parser": "^1.1.3" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/web-blob": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/web-blob/-/web-blob-2.1.3.tgz", - "integrity": "sha512-7ARypAQxyyqT7ZCHydKavBGCzvvhicGuUMFqg6Xua6H0HIqGgEH1VsMVr1P1Nx+D/maqrUNyOzHkTjBQH/bZOQ==", - "dev": true, - "dependencies": { - "web-streams-polyfill": "2.1.1" - } - }, - "node_modules/web-file-polyfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/web-file-polyfill/-/web-file-polyfill-1.0.4.tgz", - "integrity": "sha512-AnwI+/bksR0DCY2zobfqDSMi529yzWCxUIuMc8jbC5qJNWGOnBgiWY0+KD5soiw40+IsNXi0Zl5W/dm12438NA==", - "dev": true, - "dependencies": { - "web-blob": "2.1.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-2.1.1.tgz", - "integrity": "sha512-dlNpL2aab3g8CKfGz6rl8FNmGaRWLLn2g/DtSc9IjB30mEdE6XxzPfPSig5BwGSzI+oLxHyETrQGKjrVVhbLCg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } } } } diff --git a/package.json b/package.json index ec0a2c2..84b1bd0 100644 --- a/package.json +++ b/package.json @@ -11,41 +11,24 @@ "dist" ], "devDependencies": { - "@babel/cli": "^7.10.5", "@babel/core": "^7.10.5", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-transform-optional-chaining": "^7.25.9", "@babel/preset-env": "^7.10.4", "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.14.5", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^8.4.0", - "@rollup/plugin-typescript": "^8.2.1", "@types/node": "^15.6.1", - "babel-plugin-transform-class-properties": "^6.24.1", - "chai": "^4.2.0", - "codecov": "^3.8.3", - "formdata-node": "2.1.0", - "mocha": "^7.0.1", - "nyc": "^15.1.0", - "regenerator-runtime": "^0.13.9", "rollup": "^2.22.0", "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-terser": "^6.1.0", - "sinon": "^8.1.1", - "ts-node": "^10.0.0", - "typescript": "^4.3.2", - "web-file-polyfill": "^1.0.1" + "typescript": "^4.3.2" }, "scripts": { "dev": "rollup -c -w", "export-types": "tsc", "build": "rm -rf dist*;rollup -c && yarn export-types", - "test": "NODE_ENV=test nyc ./node_modules/mocha/bin/mocha --require ./test/setup.js \"test/**/*.js\"", - "startSampleApp": "yarn build && cd samples/sample-app/ && yarn install && node index.js" + "test": "npm run build && cd test-app && npm install && npx playwright install chromium && npx playwright test" }, "publishConfig": { "access": "public" @@ -66,7 +49,7 @@ "overlay" ], "author": "ImageKit Developer", - "license": "MIT", + "license": "Apache-2.0", "bugs": { "url": "https://github.com/imagekit-developer/imagekit-javascript/issues" }, diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..e7fbce4 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "node", + "package-name": "@imagekit/javascript" + } + }, + "include-v-in-tag": true, + "include-component-in-tag": false, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { "type": "feat", "section": "Features" }, + { "type": "fix", "section": "Bug Fixes" }, + { "type": "perf", "section": "Performance Improvements" }, + { "type": "revert", "section": "Reverts" }, + { "type": "chore", "section": "Chores" }, + { "type": "docs", "section": "Documentation" }, + { "type": "style", "section": "Styles" }, + { "type": "refactor", "section": "Refactors" }, + { "type": "test", "section": "Tests", "hidden": true }, + { "type": "build", "section": "Build System" }, + { "type": "ci", "section": "Continuous Integration", "hidden": true } + ] +} diff --git a/samples/sample-app/index.js b/samples/sample-app/index.js deleted file mode 100644 index 6f83b2f..0000000 --- a/samples/sample-app/index.js +++ /dev/null @@ -1,36 +0,0 @@ -const path = require('path'); -const open = require('open'); -const dotenv = require('dotenv').config({path: path.join(__dirname, ".env")}); -const server = require('./server/server.js'); - -if (dotenv.error) { - throw new Error(dotenv.error); -} - -const {PRIVATE_KEY, PUBLIC_KEY, URL_ENDPOINT, SERVER_PORT} = dotenv.parsed; - -if (!PRIVATE_KEY || !PUBLIC_KEY || !URL_ENDPOINT || !SERVER_PORT) { - throw new Error("Missing values in the '.env' file.") -} - - -server - .startServer(SERVER_PORT, PUBLIC_KEY, PRIVATE_KEY, URL_ENDPOINT) - .then(() => { - try { - return open(`http://localhost:${SERVER_PORT}`, {wait: true}); - } catch (err){ - console.error(JSON.stringify(err, null, 2)) - } - }) - .then(() => { - console.log("Exiting app."); - process.exit(0); - }) - .catch(err => { - console.log("Error:", JSON.stringify(err, null, 2)); - process.exit(1); - }); - - - diff --git a/samples/sample-app/package.json b/samples/sample-app/package.json deleted file mode 100644 index 3554eae..0000000 --- a/samples/sample-app/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "imagekit-javascript-sample", - "version": "1.0.0", - "description": "Sample app for javascript SDK of ImageKit", - "main": "index.js", - "license": "MIT", - "dependencies": { - "cors": "^2.8.5", - "crypto": "^1.0.1", - "dotenv": "^8.2.0", - "express": "^4.17.1", - "imagekit": "^3.0.3", - "open": "^7.0.2", - "pug": "^3.0.1", - "uuid": "^3.4.0" - } -} diff --git a/samples/sample-app/sample.env b/samples/sample-app/sample.env deleted file mode 100644 index 8276f77..0000000 --- a/samples/sample-app/sample.env +++ /dev/null @@ -1,4 +0,0 @@ -PRIVATE_KEY = your_private_key -PUBLIC_KEY = your_public_key -URL_ENDPOINT = your_url_endpoint -SERVER_PORT = 3000 \ No newline at end of file diff --git a/samples/sample-app/server/server.js b/samples/sample-app/server/server.js deleted file mode 100644 index 6558660..0000000 --- a/samples/sample-app/server/server.js +++ /dev/null @@ -1,64 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const cors = require('cors'); -const ImageKit = require('imagekit'); -const uuid = require('uuid'); -const path = require('path'); - -const pugTemplatePath = path.join(__dirname, "../views/index.pug"); - -const app = express(); -app.use(express.static('static')) -app.use(cors()); -app.set('view engine', 'pug'); - -const startServer = (port = 3000, PUBLIC_KEY, PRIVATE_KEY, URL_ENDPOINT) => { - return new Promise((resolve, reject) => { - try { - const imagekit = new ImageKit({ - publicKey: PUBLIC_KEY, - privateKey: PRIVATE_KEY, - urlEndpoint: URL_ENDPOINT - }); - - router.get("/auth", (req, res) => { - try { - const token = req.query.token || uuid.v4(); - const expiration = req.query.expire || parseInt(Date.now()/1000)+ (60 * 10); // Default expiration in 10 mins - - const signatureObj = imagekit.getAuthenticationParameters(token, expiration); - - res.status(200).send(signatureObj); - - } catch (err) { - console.error("Error while responding to auth request:", JSON.stringify(err, undefined, 2)); - res.status(500).send("Internal Server Error"); - } - }); - - router.get("/", (req, res) => { - try { - res.render(pugTemplatePath, {publicKey: PUBLIC_KEY, urlEndpoint: URL_ENDPOINT, authenticationEndpoint: `http://localhost:3000/auth`}); - } catch (err) { - console.error("Error while responding to static page request:", JSON.stringify(err, undefined, 2)); - res.status(500).send("Internal Server Error"); - } - }); - - app.use("/",router); - - app.listen(port, () => { - console.info(`Auth server running on port ${port}.`); - resolve(); - }); - } catch (err) { - console.error(JSON.stringify(err, undefined, 2)); - reject("Error starting auth server.") - } - - }); -} - -module.exports = { - startServer -} \ No newline at end of file diff --git a/samples/sample-app/views/index.pug b/samples/sample-app/views/index.pug deleted file mode 100644 index 4c53a49..0000000 --- a/samples/sample-app/views/index.pug +++ /dev/null @@ -1,145 +0,0 @@ -html - body - img(id="my-image") - h3 Imagekit Demo - form(action='#' onSubmit='upload(event)') - input(type='file' id='file1') - input(type="submit") - div(id='info') - div(id='status') - - div(id='images' style='display: none') - - div(id='orig_image') - h4 Original Image - p - img(src="") - div(id='trans_image') - h4 Sample transformation with height: 300, width: 400: - p - img(src="") - - // Copy paste manually from dist - script(type='text/javascript' src="./imagekit.min.js") - script. - try { - window.controller = new AbortController(); - var imagekit = new ImageKit({ - publicKey: "!{publicKey}", - urlEndpoint: "!{urlEndpoint}", - }); - - - window.imagekit = imagekit; - - var url = imagekit.url({ - src: "https://ik.imagekit.io/demo/default-image.jpg", - transformation: [{ - height: 100 - }] - }) - - var img = document.getElementById("my-image"); - console.log(url); - img.src = url; - - - function upload(e) { - e.preventDefault(); - var file = document.getElementById("file1"); - var fileSize = file.files[0].size; - var AUTH_INVALID_RESPONSE = "Invalid response from authenticationEndpoint. The SDK expects a JSON response with three fields i.e. signature, token and expire." - var statusEl = document.getElementById("status"); - statusEl.innerHTML = "Uploading..."; - - - // Use this if you want to track upload progress - var customXHR = new XMLHttpRequest(); - customXHR.upload.addEventListener('progress', function (e) { - console.log("On progress event handler from customXHR"); - if (e.loaded <= fileSize) { - var percent = Math.round(e.loaded / fileSize * 100); - console.log(`Uploaded ${percent}%`); - } - - if(e.loaded == e.total){ - console.log("Upload done"); - } - }); - - // Generating security parameters using authenticationEndpoint - const securityParametersRequest = new XMLHttpRequest(); - securityParametersRequest.timeout = 60000; - var urlObj = new URL("!{authenticationEndpoint}"); - securityParametersRequest.open('GET', urlObj.toString()); - securityParametersRequest.ontimeout = function (e) { - console.log(e.message); - return statusEl.innerHTML = "Timeout generating security parameters. "+ e.message - }; - securityParametersRequest.onerror = function (e) { - console.log(e.message) - return statusEl.innerHTML = "Request to authenticationEndpoint failed due to network error."+ e.message - } - securityParametersRequest.onload = () => { - if(securityParametersRequest.status === 200) { - var securityParametersObj = JSON.parse(securityParametersRequest.response) - - if(!securityParametersObj || !securityParametersObj.token || !securityParametersObj.signature || !securityParametersObj.expire) { - return statusEl.innerHTML = AUTH_INVALID_RESPONSE; - } - - // Uploading image - imagekit.upload({ - xhr: customXHR, // Use this if you want to track upload progress - file : file.files[0], - fileName : file.files[0].name || "test_image.jpg", - tags : ["test_tag_1"], - token: securityParametersObj.token, - signature: securityParametersObj.signature, - expire: securityParametersObj.expire, - signal: window.controller.signal, - onProgress: function(e) { - console.log("On progress event handler from SDK"); - console.log(e.loaded); - }, - //- extensions: [ - //- { - //- name: "aws-auto-tagging", - //- minConfidence: 80, - //- maxTags: 10 - //- } - //- ], - }, function(err, result) { - debugger; - if (err) { - statusEl.innerHTML = "Error uploading image. "+ err.message; - console.log(err) - } else { - statusEl.innerHTML = "File Uploaded"; - var sampleTransformations = [{ HEIGHT: 300, WIDTH: 400}]; - srcUrl = result.url; - transformedURL = imagekit.url({ - src: srcUrl, - transformation : sampleTransformations - }); - - var orig_img = document.querySelector("#orig_image > p > img"); - var trans_img = document.querySelector("#trans_image > p > img"); - - orig_img.setAttribute("src", srcUrl); - trans_img.setAttribute("src", transformedURL); - - var el = document.getElementById('images') - el.setAttribute("style", ""); - } - }); - } else { - return statusEl.innerHTML = AUTH_INVALID_RESPONSE; - } - } - - securityParametersRequest.send(); - } - } catch(ex) { - console.log(ex); - } diff --git a/samples/sample-app/yarn.lock b/samples/sample-app/yarn.lock deleted file mode 100644 index cb28aec..0000000 --- a/samples/sample-app/yarn.lock +++ /dev/null @@ -1,997 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/parser@^7.6.0", "@babel/parser@^7.9.6": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" - integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== - -"@babel/types@^7.6.1", "@babel/types@^7.9.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" - integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" - -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -ajv@^6.12.3: - version "6.12.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-never@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" - integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== - -babel-walk@3.0.0-canary-5: - version "3.0.0-canary-5" - resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" - integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== - dependencies: - "@babel/types" "^7.9.6" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -character-parser@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= - dependencies: - is-regex "^1.0.3" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -constantinople@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" - integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== - dependencies: - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.1" - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -crypto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -doctypes@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= - -dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -hamming-distance@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hamming-distance/-/hamming-distance-1.0.0.tgz#39bfa46c61f39e87421e4035a1be4f725dd7b931" - integrity sha1-Ob+kbGHznodCHkA1ob5Pcl3XuTE= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -imagekit@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/imagekit/-/imagekit-3.1.0.tgz#da8c467709feedfbdcb69aadeb0ff8a5e94ad78f" - integrity sha512-DEAywt66fmGwRpgdq9CdW2/eiDBcKodPTnWVmVryJ8JWb7n8z9zAYLDpra/yY7BUgxaGQV2aOm/Cy6ioz9IAFQ== - dependencies: - hamming-distance "^1.0.0" - lodash "^4.17.15" - request "^2.88.0" - uuid "^3.3.3" - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== - -is-expression@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" - integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== - dependencies: - acorn "^7.1.1" - object-assign "^4.1.1" - -is-promise@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - -is-regex@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -js-stringify@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jstransformer@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" - integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= - dependencies: - is-promise "^2.0.0" - promise "^7.0.1" - -lodash@^4.17.15: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -open@^7.0.2: - version "7.2.1" - resolved "https://registry.yarnpkg.com/open/-/open-7.2.1.tgz#07b0ade11a43f2a8ce718480bdf3d7563a095195" - integrity sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -promise@^7.0.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.1" - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pug-attrs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" - integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== - dependencies: - constantinople "^4.0.1" - js-stringify "^1.0.2" - pug-runtime "^3.0.0" - -pug-code-gen@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" - integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== - dependencies: - constantinople "^4.0.1" - doctypes "^1.1.0" - js-stringify "^1.0.2" - pug-attrs "^3.0.0" - pug-error "^2.0.0" - pug-runtime "^3.0.0" - void-elements "^3.1.0" - with "^7.0.0" - -pug-error@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" - integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== - -pug-filters@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" - integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== - dependencies: - constantinople "^4.0.1" - jstransformer "1.0.0" - pug-error "^2.0.0" - pug-walk "^2.0.0" - resolve "^1.15.1" - -pug-lexer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" - integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== - dependencies: - character-parser "^2.2.0" - is-expression "^4.0.0" - pug-error "^2.0.0" - -pug-linker@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" - integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== - dependencies: - pug-error "^2.0.0" - pug-walk "^2.0.0" - -pug-load@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" - integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== - dependencies: - object-assign "^4.1.1" - pug-walk "^2.0.0" - -pug-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" - integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== - dependencies: - pug-error "^2.0.0" - token-stream "1.0.0" - -pug-runtime@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" - integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== - -pug-strip-comments@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" - integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== - dependencies: - pug-error "^2.0.0" - -pug-walk@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" - integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== - -pug@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.1.tgz#9b287554043e6d18852673a382b0350595bdc067" - integrity sha512-9v1o2yXMfSKJy2PykKyWUhpgx9Pf9D/UlPgIs2pTTxR6DQZ0oivy4I9f8PlWXRY4sjIhDU4TMJ7hQmYnNJc2bw== - dependencies: - pug-code-gen "^3.0.2" - pug-filters "^4.0.0" - pug-lexer "^5.0.0" - pug-linker "^4.0.0" - pug-load "^3.0.0" - pug-parser "^6.0.0" - pug-runtime "^3.0.0" - pug-strip-comments "^2.0.0" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -resolve@^1.15.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -token-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" - integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== - dependencies: - punycode "^2.1.0" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -void-elements@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= - -with@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" - integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== - dependencies: - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" - assert-never "^1.2.1" - babel-walk "3.0.0-canary-5" \ No newline at end of file diff --git a/src/url.ts b/src/url.ts index 460853c..3a74faa 100644 --- a/src/url.ts +++ b/src/url.ts @@ -291,7 +291,7 @@ export const buildTransformationString = function (transformation: Transformatio } else if (key === "raw") { parsedTransformStep.push(transformation[i][key] as string); } else { - if (transformKey === "di") { + if (transformKey === "di" || transformKey === "ff") { value = removeTrailingSlash(removeLeadingSlash(value as string || "")); value = value.replace(/\//g, "@@"); } diff --git a/src/utils/transformation.ts b/src/utils/transformation.ts index 324fef0..7a6c7c4 100644 --- a/src/utils/transformation.ts +++ b/src/utils/transformation.ts @@ -28,11 +28,14 @@ export default { } export const safeBtoa = function (str: string): string { - if (typeof window !== "undefined") { - /* istanbul ignore next */ - return btoa(str); - } else { - // Node fallback - return Buffer.from(str, "utf8").toString("base64"); + // Prefer Buffer when available (Node.js / SSR): handles UTF-8 natively. + if (typeof (globalThis as any).Buffer !== "undefined") { + return (globalThis as any).Buffer.from(str, "utf8").toString("base64"); } -} \ No newline at end of file + + // Browser: btoa() throws on characters with code points > 0xFF, so convert + // the string to UTF-8 bytes first, then base64-encode them (per MDN). + const bytes = new TextEncoder().encode(str); + const binary = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join(""); + return btoa(binary); +}; \ No newline at end of file diff --git a/test-app/.gitignore b/test-app/.gitignore new file mode 100644 index 0000000..48abb2a --- /dev/null +++ b/test-app/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +test-results/ +playwright-report/ +.playwright/ diff --git a/test-app/index.html b/test-app/index.html new file mode 100644 index 0000000..a2b4cd0 --- /dev/null +++ b/test-app/index.html @@ -0,0 +1,80 @@ + + + + + + ImageKit JavaScript SDK - URL Generation Test App + + +
+

ImageKit JavaScript SDK

+

URL generation playground. The SDK is loaded as the built ESM bundle and runs entirely in the browser.

+ +
+

+ +
+

+ +
+

+ + + +

Generated URL

+ + +
+ preview +
+
+ + + + diff --git a/test-app/package-lock.json b/test-app/package-lock.json new file mode 100644 index 0000000..e65c62d --- /dev/null +++ b/test-app/package-lock.json @@ -0,0 +1,78 @@ +{ + "name": "imagekit-javascript-test-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "imagekit-javascript-test-app", + "version": "1.0.0", + "devDependencies": { + "@playwright/test": "^1.48.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/test-app/package.json b/test-app/package.json new file mode 100644 index 0000000..6bb2377 --- /dev/null +++ b/test-app/package.json @@ -0,0 +1,14 @@ +{ + "name": "imagekit-javascript-test-app", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Browser test app for the ImageKit JavaScript SDK. Loads the built SDK bundle in a real browser so Playwright can cover URL-generation edge cases (e.g. Unicode base64) that the Node-based unit tests cannot.", + "scripts": { + "serve": "node server.mjs", + "test": "playwright test" + }, + "devDependencies": { + "@playwright/test": "^1.48.0" + } +} diff --git a/test-app/playwright.config.ts b/test-app/playwright.config.ts new file mode 100644 index 0000000..b2ee711 --- /dev/null +++ b/test-app/playwright.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + testDir: "./tests", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + reporter: "list", + use: { + baseURL: "http://localhost:4321", + trace: "on-first-retry", + }, + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], + webServer: { + command: "npm run serve", + url: "http://localhost:4321", + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/test-app/server.mjs b/test-app/server.mjs new file mode 100644 index 0000000..035fee4 --- /dev/null +++ b/test-app/server.mjs @@ -0,0 +1,45 @@ +// Minimal zero-dependency static file server. +// Serves the repository root so the test app at /test-app/index.html can import +// the built SDK bundle from /dist/imagekit.esm.js. Used by Playwright's webServer. +import { createServer } from "node:http"; +import { readFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, join, normalize, extname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, ".."); +const PORT = Number(process.env.PORT) || 4321; + +const MIME = { + ".html": "text/html; charset=utf-8", + ".js": "text/javascript; charset=utf-8", + ".mjs": "text/javascript; charset=utf-8", + ".css": "text/css; charset=utf-8", + ".json": "application/json; charset=utf-8", + ".map": "application/json; charset=utf-8", + ".svg": "image/svg+xml", +}; + +const server = createServer(async (req, res) => { + try { + let pathname = decodeURIComponent(new URL(req.url, `http://localhost`).pathname); + if (pathname === "/") pathname = "/test-app/index.html"; + + // Resolve and prevent path traversal outside ROOT. + const filePath = normalize(join(ROOT, pathname)); + if (!filePath.startsWith(ROOT)) { + res.writeHead(403).end("Forbidden"); + return; + } + + const data = await readFile(filePath); + res.writeHead(200, { "content-type": MIME[extname(filePath)] || "application/octet-stream" }); + res.end(data); + } catch { + res.writeHead(404).end("Not found"); + } +}); + +server.listen(PORT, () => { + console.log(`Static server running at http://localhost:${PORT}`); +}); diff --git a/test/url-generation/basic.js b/test-app/tests/basic.spec.ts similarity index 57% rename from test/url-generation/basic.js rename to test-app/tests/basic.spec.ts index cef7d20..661acea 100644 --- a/test/url-generation/basic.js +++ b/test-app/tests/basic.spec.ts @@ -1,70 +1,81 @@ -const chai = require("chai"); -const expect = chai.expect; -import { buildSrc } from "../../src/index"; +import { test, expect } from "./fixtures"; -describe("URL generation", function () { - it('should return an empty string when src is not provided', function () { - const url = buildSrc({ +async function buildSrc(page: import("@playwright/test").Page, opts: any): Promise { + return page.evaluate((o) => (window as any).buildSrc(o), opts); +} + +test.describe("URL generation", () => { + test('should return an empty string when src is not provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query" }); - expect(url).equal(""); + expect(url).toBe(""); }); - it('should return an empty string when src is /', function () { - const url = buildSrc({ + test('should return an empty string when src is /', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/" }); - expect(url).equal("https://ik.imagekit.io/test_url_endpoint/"); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/"); }); - it('should return an empty string when src is invalid', function () { - const url = buildSrc({ + test('should return an empty string when src is invalid', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "https://" }); - expect(url).equal(""); + expect(url).toBe(""); }); - it('should generate a valid URL when src is provided without transformation', function () { - const url = buildSrc({ + test('should generate a valid URL when src is provided without transformation', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg" }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg`); + }); + + test('should encode a src path containing Hindi (non-ASCII) characters', async ({ page }) => { + const url = await buildSrc(page, { + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sdk-testing-files/हिन्दी.png" + }); + + expect(url).toBe(`https://ik.imagekit.io/demo/sdk-testing-files/%E0%A4%B9%E0%A4%BF%E0%A4%A8%E0%A5%8D%E0%A4%A6%E0%A5%80.png`); }); - it('should generate a valid URL when a src is provided without transformation', function () { - const url = buildSrc({ + test('should generate a valid URL when a src is provided without transformation', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg" }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg`); }); - it('should generate a valid URL when undefined transformation parameters are provided with path', function () { - const url = buildSrc({ + test('should generate a valid URL when undefined transformation parameters are provided with path', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", src: "/test_path_alt.jpg", transformation: undefined, transformationPosition: "query" }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg`); }); - it("By default transformationPosition should be query", function () { - const url = buildSrc({ + test("By default transformationPosition should be query", async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", src: "/test_path.jpg", transformation: [ @@ -77,11 +88,11 @@ describe("URL generation", function () { } ] }); - expect(url).equal("https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rt-90"); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rt-90"); }); - it('should generate the URL without sdk version', function () { - const url = buildSrc({ + test('should generate the URL without sdk version', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", src: "/test_path.jpg", transformation: [ @@ -93,11 +104,11 @@ describe("URL generation", function () { transformationPosition: "path" }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:h-300,w-400/test_path.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/tr:h-300,w-400/test_path.jpg`); }); - it('should generate the correct URL with a valid src and transformation', function () { - const url = buildSrc({ + test('should generate the correct URL with a valid src and transformation', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -110,11 +121,11 @@ describe("URL generation", function () { }); // Now transformed URL goes into query since transformationPosition is "query". - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); }); - it('should generate the correct URL when the provided path contains multiple leading slashes', function () { - const url = buildSrc({ + test('should generate the correct URL when the provided path contains multiple leading slashes', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "///test_path.jpg", @@ -126,11 +137,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); }); - it('should generate the correct URL when the urlEndpoint is overridden', function () { - const url = buildSrc({ + test('should generate the correct URL when the urlEndpoint is overridden', async ({ page }) => { + const url = await buildSrc(page, { // We do not override urlEndpoint here urlEndpoint: "https://ik.imagekit.io/test_url_endpoint_alt", transformationPosition: "query", @@ -143,11 +154,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint_alt/test_path.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint_alt/test_path.jpg?tr=h-300,w-400`); }); - it('should generate the correct URL with transformationPosition as query parameter when src is provided', function () { - const url = buildSrc({ + test('should generate the correct URL with transformationPosition as query parameter when src is provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", src: "/test_path.jpg", transformationPosition: "query", @@ -159,11 +170,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400`); }); - it('should generate the correct URL with a valid src parameter and transformation', function () { - const url = buildSrc({ + test('should generate the correct URL with a valid src parameter and transformation', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg", @@ -175,11 +186,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?tr=h-300,w-400`); }); - it('should generate the correct URL with transformationPosition as query parameter when src is provided', function () { - const url = buildSrc({ + test('should generate the correct URL with transformationPosition as query parameter when absolute src is provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", src: "https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg", transformationPosition: "query", @@ -191,11 +202,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?tr=h-300,w-400`); }); - it('should merge query parameters correctly in the generated URL', function () { - const url = buildSrc({ + test('should merge query parameters correctly in the generated URL', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?t1=v1", @@ -208,11 +219,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?t1=v1&t2=v2&t3=v3&tr=h-300,w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path_alt.jpg?t1=v1&t2=v2&t3=v3&tr=h-300,w-400`); }); - it('should generate the correct URL with chained transformations', function () { - const url = buildSrc({ + test('should generate the correct URL with chained transformations', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -227,11 +238,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rt-90`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rt-90`); }); - it('should generate the correct URL with chained transformations including a new undocumented transformation parameter', function () { - const url = buildSrc({ + test('should generate the correct URL with chained transformations including a new undocumented transformation parameter', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -246,11 +257,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rndm_trnsf-abcd`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400:rndm_trnsf-abcd`); }); - it('should generate the correct URL when overlay image transformation is provided', function () { - const url = buildSrc({ + test('should generate the correct URL when overlay image transformation is provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -263,11 +274,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,l-image,i-overlay.jpg,w-100,b-10_CDDC39,l-end`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,l-image,i-overlay.jpg,w-100,b-10_CDDC39,l-end`); }); - it('should generate the correct URL when overlay image transformation contains a slash in the overlay path', function () { - const url = buildSrc({ + test('should generate the correct URL when overlay image transformation contains a slash in the overlay path', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -280,11 +291,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,l-image,i-/path/to/overlay.jpg,w-100,b-10_CDDC39,l-end`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,l-image,i-/path/to/overlay.jpg,w-100,b-10_CDDC39,l-end`); }); - it('should generate the correct URL when border transformation is applied', function () { - const url = buildSrc({ + test('should generate the correct URL when border transformation is applied', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -297,11 +308,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,b-20_FF0000`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,b-20_FF0000`); }); - it('should generate the correct URL when transformation has empty key and value', function () { - const url = buildSrc({ + test('should generate the correct URL when transformation has empty key and value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -312,11 +323,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg`); }); - it('should generate the correct URL when an undefined transform is provided', function () { - const url = buildSrc({ + test('should generate the correct URL when an undefined transform is provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -327,11 +338,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=undefined-transform-true`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=undefined-transform-true`); }); - it('should generate the correct URL when transformation key has an empty value', function () { - const url = buildSrc({ + test('should generate the correct URL when transformation key has an empty value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -342,11 +353,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=di-`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=di-`); }); - it('should generate the correct URL when transformation key has \'-\' as its value', function () { - const url = buildSrc({ + test('should generate the correct URL when transformation key has \'-\' as its value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -357,11 +368,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=e-contrast`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=e-contrast`); }); - it('should skip transformation parameters that are undefined or null', function () { - const url = buildSrc({ + test('should skip transformation parameters that are undefined or null', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -374,11 +385,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg`); }); - it('should skip transformation parameters that are false', function () { - const url = buildSrc({ + test('should skip transformation parameters that are false', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -390,11 +401,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg`); }); - it('should include only the key when transformation value is an empty string', function () { - const url = buildSrc({ + test('should include only the key when transformation value is an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -406,11 +417,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,e-shadow`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,e-shadow`); }); - it('should include both key and value when transformation parameter value is provided', function () { - const url = buildSrc({ + test('should include both key and value when transformation parameter value is provided', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -422,11 +433,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,e-shadow-bl-15_st-40_x-10_y-N5`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,e-shadow-bl-15_st-40_x-10_y-N5`); }); - it('should generate the correct URL when trim transformation is set to true as a boolean', function () { - const url = buildSrc({ + test('should generate the correct URL when trim transformation is set to true as a boolean', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -438,11 +449,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,t-true`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,t-true`); }); - it('should generate the correct URL when trim transformation is set to true as a string', function () { - const url = buildSrc({ + test('should generate the correct URL when trim transformation is set to true as a string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -454,11 +465,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,t-true`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=di-test_path.jpg,t-true`); }); - it('should generate the correct URL for AI background removal when set to true', function () { - const url = buildSrc({ + test('should generate the correct URL for AI background removal when set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -469,11 +480,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-bgremove`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-bgremove`); }); - it('should generate the correct URL for AI background removal when \'true\' is provided as a string', function () { - const url = buildSrc({ + test('should generate the correct URL for AI background removal when \'true\' is provided as a string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -484,11 +495,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-bgremove`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-bgremove`); }); - it('should not apply AI background removal when value is not true', function () { - const url = buildSrc({ + test('should not apply AI background removal when value is not true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -499,11 +510,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg`); }); - it('should generate the correct URL for external AI background removal when set to true', function () { - const url = buildSrc({ + test('should generate the correct URL for external AI background removal when set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -514,11 +525,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-removedotbg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-removedotbg`); }); - it('should generate the correct URL for external AI background removal when \'true\' is provided as a string', function () { - const url = buildSrc({ + test('should generate the correct URL for external AI background removal when \'true\' is provided as a string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -529,11 +540,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-removedotbg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-removedotbg`); }); - it('should not apply external AI background removal when value is not true', function () { - const url = buildSrc({ + test('should not apply external AI background removal when value is not true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -544,11 +555,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg`); }); - it('should generate the correct URL when gradient transformation is provided as a string', function () { - const url = buildSrc({ + test('should generate the correct URL when gradient transformation is provided as a string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -559,11 +570,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient-ld-top_from-green_to-00FF0010_sp-1`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient-ld-top_from-green_to-00FF0010_sp-1`); }); - it('should generate the correct URL when gradient transformation is provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL when gradient transformation is provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -574,11 +585,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient`); }); - it('should generate the correct URL when gradient transformation is set to true', function () { - const url = buildSrc({ + test('should generate the correct URL when gradient transformation is set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -589,11 +600,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-gradient`); }); - it('should generate the correct URL when AI drop shadow transformation is set to true', function () { - const url = buildSrc({ + test('should generate the correct URL when AI drop shadow transformation is set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -604,11 +615,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow`); }); - it('should generate the correct URL when AI drop shadow transformation is provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL when AI drop shadow transformation is provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -619,11 +630,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow`); }); - it('should generate the correct URL when AI drop shadow transformation is provided with a specific string value', function () { - const url = buildSrc({ + test('should generate the correct URL when AI drop shadow transformation is provided with a specific string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -634,11 +645,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow-az-45`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-dropshadow-az-45`); }); - it('should generate the correct URL when shadow transformation is set to true', function () { - const url = buildSrc({ + test('should generate the correct URL when shadow transformation is set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -649,11 +660,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow`); }); - it('should generate the correct URL when shadow transformation is provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL when shadow transformation is provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -664,11 +675,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow`); }); - it('should generate the correct URL when shadow transformation is provided with a specific string value', function () { - const url = buildSrc({ + test('should generate the correct URL when shadow transformation is provided with a specific string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -679,11 +690,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow-bl-15_st-40_x-10_y-N5`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-shadow-bl-15_st-40_x-10_y-N5`); }); - it('should generate the correct URL when sharpen transformation is set to true', function () { - const url = buildSrc({ + test('should generate the correct URL when sharpen transformation is set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -694,11 +705,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen`); }); - it('should generate the correct URL when sharpen transformation is provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL when sharpen transformation is provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -709,11 +720,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen`); }); - it('should generate the correct URL when sharpen transformation is provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL when sharpen transformation is provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -724,11 +735,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen-10`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-sharpen-10`); }); - it('should generate the correct URL when unsharpMask transformation is set to true', function () { - const url = buildSrc({ + test('should generate the correct URL when unsharpMask transformation is set to true', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -739,11 +750,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm`); }); - it('should generate the correct URL when unsharpMask transformation is provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL when unsharpMask transformation is provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -754,11 +765,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm`); }); - it('should generate the correct URL when unsharpMask transformation is provided with a string value', function () { - const url = buildSrc({ + test('should generate the correct URL when unsharpMask transformation is provided with a string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -769,11 +780,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm-2-2-0.8-0.024`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=e-usm-2-2-0.8-0.024`); }); - it('should generate the correct URL for trim transformation when set to true (boolean)', function () { - const url = buildSrc({ + test('should generate the correct URL for trim transformation when set to true (boolean)', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -784,11 +795,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-true`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-true`); }); - it('should generate the correct URL for trim transformation when provided as an empty string', function () { - const url = buildSrc({ + test('should generate the correct URL for trim transformation when provided as an empty string', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -799,11 +810,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-true`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-true`); }); - it('should generate the correct URL for trim transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for trim transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -814,12 +825,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-5`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=t-5`); }); // Width parameter tests - it('should generate the correct URL for width transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for width transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -830,11 +841,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-400`); }); - it('should generate the correct URL for width transformation when provided with a string value', function () { - const url = buildSrc({ + test('should generate the correct URL for width transformation when provided with a string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -845,11 +856,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-400`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-400`); }); - it('should generate the correct URL for width transformation when provided with an arithmetic expression', function () { - const url = buildSrc({ + test('should generate the correct URL for width transformation when provided with an arithmetic expression', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -860,12 +871,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-iw_div_2`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=w-iw_div_2`); }); // Height parameter tests - it('should generate the correct URL for height transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for height transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -876,11 +887,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-300`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-300`); }); - it('should generate the correct URL for height transformation when provided with a string value', function () { - const url = buildSrc({ + test('should generate the correct URL for height transformation when provided with a string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -891,11 +902,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-300`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-300`); }); - it('should generate the correct URL for height transformation when provided with an arithmetic expression', function () { - const url = buildSrc({ + test('should generate the correct URL for height transformation when provided with an arithmetic expression', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -906,12 +917,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-ih_mul_0.5`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=h-ih_mul_0.5`); }); // AspectRatio parameter tests - it('should generate the correct URL for aspectRatio transformation when provided with a string value in colon format', function () { - const url = buildSrc({ + test('should generate the correct URL for aspectRatio transformation when provided with a string value in colon format', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -922,11 +933,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-4:3`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-4:3`); }); - it('should generate the correct URL for aspectRatio transformation when provided with an alternate underscore format', function () { - const url = buildSrc({ + test('should generate the correct URL for aspectRatio transformation when provided with an alternate underscore format', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -937,11 +948,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-4_3`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-4_3`); }); - it('should generate the correct URL for aspectRatio transformation when provided with an arithmetic expression', function () { - const url = buildSrc({ + test('should generate the correct URL for aspectRatio transformation when provided with an arithmetic expression', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -952,12 +963,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-iar_div_2`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=ar-iar_div_2`); }); // Background parameter tests - it('should generate the correct URL for background transformation when provided with a solid color', function () { - const url = buildSrc({ + test('should generate the correct URL for background transformation when provided with a solid color', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -968,11 +979,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-FF0000`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-FF0000`); }); - it('should generate the correct URL for background transformation when provided with the blurred option', function () { - const url = buildSrc({ + test('should generate the correct URL for background transformation when provided with the blurred option', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -983,11 +994,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-blurred`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-blurred`); }); - it('should generate the correct URL for background transformation when provided with the genfill option', function () { - const url = buildSrc({ + test('should generate the correct URL for background transformation when provided with the genfill option', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -998,12 +1009,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-genfill`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=bg-genfill`); }); // Crop parameter tests - it('should generate the correct URL for crop transformation when provided with force value', function () { - const url = buildSrc({ + test('should generate the correct URL for crop transformation when provided with force value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1014,11 +1025,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=c-force`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=c-force`); }); - it('should generate the correct URL for crop transformation when provided with at_max value', function () { - const url = buildSrc({ + test('should generate the correct URL for crop transformation when provided with at_max value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1029,12 +1040,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=c-at_max`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=c-at_max`); }); // CropMode parameter tests - it('should generate the correct URL for cropMode transformation when provided with pad_resize', function () { - const url = buildSrc({ + test('should generate the correct URL for cropMode transformation when provided with pad_resize', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1045,11 +1056,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=cm-pad_resize`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=cm-pad_resize`); }); - it('should generate the correct URL for cropMode transformation when provided with extract value', function () { - const url = buildSrc({ + test('should generate the correct URL for cropMode transformation when provided with extract value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1060,12 +1071,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=cm-extract`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=cm-extract`); }); // Focus parameter tests - it('should generate the correct URL for focus transformation when provided with a string value', function () { - const url = buildSrc({ + test('should generate the correct URL for focus transformation when provided with a string value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1076,11 +1087,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=fo-center`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=fo-center`); }); - it('should generate the correct URL for focus transformation when face detection is specified', function () { - const url = buildSrc({ + test('should generate the correct URL for focus transformation when face detection is specified', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1091,12 +1102,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=fo-face`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=fo-face`); }); // Quality parameter test - it('should generate the correct URL for quality transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for quality transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1107,12 +1118,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=q-80`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=q-80`); }); // Coordinate parameters tests - it('should generate the correct URL for x coordinate transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for x coordinate transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1123,11 +1134,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=x-10`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=x-10`); }); - it('should generate the correct URL for y coordinate transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for y coordinate transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1138,11 +1149,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=y-20`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=y-20`); }); - it('should generate the correct URL for xCenter transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for xCenter transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1153,11 +1164,11 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=xc-30`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=xc-30`); }); - it('should generate the correct URL for yCenter transformation when provided with a number value', function () { - const url = buildSrc({ + test('should generate the correct URL for yCenter transformation when provided with a number value', async ({ page }) => { + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path1.jpg", @@ -1168,12 +1179,12 @@ describe("URL generation", function () { ] }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=yc-40`); + expect(url).toBe(`https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=yc-40`); }); - it('Including deprecated properties', function () { + test('Including deprecated properties', async ({ page }) => { // This is just testing how the SDK constructs the URL, not actual valid transformations. - const url = buildSrc({ + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -1212,14 +1223,14 @@ describe("URL generation", function () { ] }); - expect(url).equal( + expect(url).toBe( `https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,e-sharpen-10,e-usm-2-2-0.8-0.024,e-contrast,e-grayscale,e-shadow-bl-15_st-40_x-10_y-N5,e-gradient-from-red_to-white,orig-true,h-200,w-300,l-image,i-logo.png,l-end` ); }); - it('should generate the correct URL with many transformations, including video and AI transforms', function () { + test('should generate the correct URL with many transformations, including video and AI transforms', async ({ page }) => { // Example test with comprehensive transformations - const url = buildSrc({ + const url = await buildSrc(page, { urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", transformationPosition: "query", src: "/test_path.jpg", @@ -1285,7 +1296,7 @@ describe("URL generation", function () { ] }); - expect(url).equal( + expect(url).toBe( `https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,fl-h,o-0.8,z-2,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-bgremove,e-contrast,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end,cr-FF0000_50_00FF00,e-colorize-co-red_in-35,e-distort-p-50_50_150_50_150_150_50_150` ); }); diff --git a/test-app/tests/buildTransformationString.spec.ts b/test-app/tests/buildTransformationString.spec.ts new file mode 100644 index 0000000..fdcc177 --- /dev/null +++ b/test-app/tests/buildTransformationString.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from "./fixtures"; + +test.describe("buildTransformationString", () => { + test("should return an empty string when no transformations are provided", async ({ page }) => { + const result = await page.evaluate(() => (window as any).buildTransformationString([{}])); + expect(result).toBe(""); + }); + + test("should generate a transformation string for width only", async ({ page }) => { + const result = await page.evaluate(() => (window as any).buildTransformationString([{ width: 300 }])); + expect(result).toBe("w-300"); + }); + + test("should generate a transformation string for multiple transformations", async ({ page }) => { + const result = await page.evaluate(() => + (window as any).buildTransformationString([ + { + overlay: { + type: "text", + text: "Hello", + }, + }, + ]), + ); + expect(result).toBe("l-text,i-Hello,l-end"); + }); +}); diff --git a/test-app/tests/fixtures.ts b/test-app/tests/fixtures.ts new file mode 100644 index 0000000..659ce07 --- /dev/null +++ b/test-app/tests/fixtures.ts @@ -0,0 +1,24 @@ +import { test as base, expect } from "@playwright/test"; + +/** + * Shared fixture for browser-based SDK tests. + * + * Each test runs the real built SDK bundle inside Chromium. The SDK functions + * are exposed on `window` by /test-app/index.html, so tests call them via + * `page.evaluate` and assert on the returned values. + */ +export const test = base.extend({ + page: async ({ page }, use) => { + await page.goto("/test-app/index.html"); + await page.waitForFunction( + () => + typeof (window as any).buildSrc === "function" && + typeof (window as any).buildTransformationString === "function" && + typeof (window as any).getResponsiveImageAttributes === "function", + ); + await use(page); + }, +}); + +export { expect }; + diff --git a/test-app/tests/overlay.spec.ts b/test-app/tests/overlay.spec.ts new file mode 100644 index 0000000..c3b5850 --- /dev/null +++ b/test-app/tests/overlay.spec.ts @@ -0,0 +1,459 @@ +import { test, expect } from "./fixtures"; + +async function buildSrc(page: import("@playwright/test").Page, opts: any): Promise { + return page.evaluate((o) => (window as any).buildSrc(o), opts); +} + +test.describe("Overlay Transformation Test Cases", () => { + test("Ignore invalid values if text is missing", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "text" } }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Ignore if type is missing", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: {} }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Ignore invalid values if input (image)", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "image" } }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Ignore invalid values if input (video)", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "video" } }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Ignore invalid values if input (subtitle)", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "subtitle" } }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Ignore invalid values if color is missing (solidColor)", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "solidColor" } }], + }); + expect(url).toBe("https://ik.imagekit.io/test_url_endpoint/base-image.jpg"); + }); + + test("Text overlay generates correct URL with encoded overlay text", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "text", text: "Minimal Text" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Minimal%20Text,l-end/base-image.jpg", + ); + }); + + test("Image overlay generates correct URL with input logo.png", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "image", input: "logo.png" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-logo.png,l-end/base-image.jpg", + ); + }); + + test("Video overlay generates correct URL with input play-pause-loop.mp4", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-video.mp4", + transformation: [{ overlay: { type: "video", input: "play-pause-loop.mp4" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-video,i-play-pause-loop.mp4,l-end/base-video.mp4", + ); + }); + + test("Subtitle overlay generates correct URL with input subtitle.srt", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-video.mp4", + transformation: [{ overlay: { type: "subtitle", input: "subtitle.srt" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-subtitles,i-subtitle.srt,l-end/base-video.mp4", + ); + }); + + test("Solid color overlay generates correct URL with background color FF0000", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "solidColor", color: "FF0000" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-ik_canvas,bg-FF0000,l-end/base-image.jpg", + ); + }); + + test("Combined overlay transformations generate correct URL including nested overlays", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [ + { + overlay: { + type: "text", + text: "Every thing", + position: { x: "10", y: "20", focus: "center" }, + timing: { start: 5, duration: "10", end: 15 }, + transformation: [ + { + width: "bw_mul_0.5", + fontSize: 20, + fontFamily: "Arial", + fontColor: "0000ff", + innerAlignment: "left", + padding: 5, + alpha: 7, + typography: "b", + background: "red", + radius: 10, + rotation: "N45", + flip: "h", + lineHeight: 20, + }, + ], + }, + }, + { + overlay: { + type: "image", + input: "logo.png", + position: { x: "10", y: "20", focus: "center" }, + timing: { start: 5, duration: "10", end: 15 }, + transformation: [ + { + width: "bw_mul_0.5", + height: "bh_mul_0.5", + rotation: "N45", + flip: "h", + overlay: { type: "text", text: "Nested text overlay" }, + }, + ], + }, + }, + { + overlay: { + type: "video", + input: "play-pause-loop.mp4", + position: { x: "10", y: "20", focus: "center" }, + timing: { start: 5, duration: "10", end: 15 }, + transformations: [ + { width: "bw_mul_0.5", height: "bh_mul_0.5", rotation: "N45", flip: "h" }, + ], + }, + }, + { + overlay: { + type: "subtitle", + input: "subtitle.srt", + position: { x: "10", y: "20", focus: "center" }, + timing: { start: 5, duration: "10", end: 15 }, + transformations: [ + { width: "bw_mul_0.5", height: "bh_mul_0.5", rotation: "N45", flip: "h" }, + ], + }, + }, + { + overlay: { + type: "solidColor", + color: "FF0000", + position: { x: "10", y: "20", focus: "center" }, + timing: { start: 5, duration: "10", end: 15 }, + transformation: [ + { width: "bw_mul_0.5", height: "bh_mul_0.5", rotation: "N45", flip: "h" }, + ], + }, + }, + ], + }); + + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Every%20thing,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,fs-20,ff-Arial,co-0000ff,ia-left,pa-5,al-7,tg-b,bg-red,r-10,rt-N45,fl-h,lh-20,l-end:l-image,i-logo.png,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,h-bh_mul_0.5,rt-N45,fl-h,l-text,i-Nested%20text%20overlay,l-end,l-end:l-video,i-play-pause-loop.mp4,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,l-end:l-subtitles,i-subtitle.srt,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,l-end:l-image,i-ik_canvas,bg-FF0000,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,h-bh_mul_0.5,rt-N45,fl-h,l-end/base-image.jpg", + ); + }); +}); + +test.describe("Overlay encoding test cases", () => { + test("Nested simple path, should use i instead of ie, handle slash properly", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/medium_cafe_B1iTdD0C.jpg", + transformation: [{ overlay: { type: "image", input: "/customer_logo/nykaa.png" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-image,i-customer_logo@@nykaa.png,l-end/medium_cafe_B1iTdD0C.jpg", + ); + }); + + test("Nested non-simple path, should use ie instead of i", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/medium_cafe_B1iTdD0C.jpg", + transformation: [{ overlay: { type: "image", input: "/customer_logo/Ñykaa.png" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-image,ie-Y3VzdG9tZXJfbG9nby9OzIN5a2FhLnBuZw%3D%3D,l-end/medium_cafe_B1iTdD0C.jpg", + ); + }); + + test("Simple text overlay, should use i instead of ie", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/medium_cafe_B1iTdD0C.jpg", + transformation: [{ overlay: { type: "text", text: "Manu" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-text,i-Manu,l-end/medium_cafe_B1iTdD0C.jpg", + ); + }); + + test("Simple text overlay with spaces and other safe characters, should use i instead of ie", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/medium_cafe_B1iTdD0C.jpg", + transformation: [{ overlay: { type: "text", text: "alnum123-._ " } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-text,i-alnum123-._%20,l-end/medium_cafe_B1iTdD0C.jpg", + ); + }); + + test("Non simple text overlay, should use ie instead of i", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/medium_cafe_B1iTdD0C.jpg", + transformation: [{ overlay: { type: "text", text: "Let's use ©, ®, ™, etc" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-text,ie-TGV0J3MgdXNlIMKpLCDCriwg4oSiLCBldGM%3D,l-end/medium_cafe_B1iTdD0C.jpg", + ); + }); + + test("Text overlay with explicit plain encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.jpg", + transformation: [{ overlay: { type: "text", text: "HelloWorld", encoding: "plain" } }], + }); + expect(url).toBe("https://ik.imagekit.io/demo/tr:l-text,i-HelloWorld,l-end/sample.jpg"); + }); + + test("Text overlay with explicit base64 encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.jpg", + transformation: [{ overlay: { type: "text", text: "HelloWorld", encoding: "base64" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-text,ie-SGVsbG9Xb3JsZA%3D%3D,l-end/sample.jpg", + ); + }); + + test("Image overlay with explicit plain encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.jpg", + transformation: [{ overlay: { type: "image", input: "/customer/logo.png", encoding: "plain" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-image,i-customer@@logo.png,l-end/sample.jpg", + ); + }); + + test("Image overlay with explicit base64 encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.jpg", + transformation: [{ overlay: { type: "image", input: "/customer/logo.png", encoding: "base64" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-image,ie-Y3VzdG9tZXIvbG9nby5wbmc%3D,l-end/sample.jpg", + ); + }); + + test("Video overlay with explicit base64 encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.mp4", + transformation: [{ overlay: { type: "video", input: "/path/to/video.mp4", encoding: "base64" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-video,ie-cGF0aC90by92aWRlby5tcDQ%3D,l-end/sample.mp4", + ); + }); + + test("Subtitle overlay with explicit plain encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.mp4", + transformation: [{ overlay: { type: "subtitle", input: "/sub.srt", encoding: "plain" } }], + }); + expect(url).toBe("https://ik.imagekit.io/demo/tr:l-subtitles,i-sub.srt,l-end/sample.mp4"); + }); + + test("Subtitle overlay with explicit base64 encoding", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.mp4", + transformation: [{ overlay: { type: "subtitle", input: "sub.srt", encoding: "base64" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/tr:l-subtitles,ie-c3ViLnNydA%3D%3D,l-end/sample.mp4", + ); + }); + + test("Avoid double encoding when transformation string is in query params", async ({ page }) => { + const url = await buildSrc(page, { + urlEndpoint: "https://ik.imagekit.io/demo", + src: "/sample.jpg", + transformation: [{ overlay: { type: "text", text: "Minimal Text" } }], + transformationPosition: "query", + }); + expect(url).toBe("https://ik.imagekit.io/demo/sample.jpg?tr=l-text,i-Minimal%20Text,l-end"); + }); + + test.describe("Layer Mode Tests", () => { + test("should generate correct URL with multiply layer mode", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "image", input: "overlay-image.jpg", layerMode: "multiply" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-multiply,l-end/base-image.jpg", + ); + }); + + test("should generate correct URL with cutter layer mode", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "image", input: "overlay-image.jpg", layerMode: "cutter" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-cutter,l-end/base-image.jpg", + ); + }); + + test("should generate correct URL with cutout layer mode", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [{ overlay: { type: "image", input: "overlay-image.jpg", layerMode: "cutout" } }], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-cutout,l-end/base-image.jpg", + ); + }); + + test("should generate correct URL with displace layer mode", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [ + { overlay: { type: "image", input: "overlay-image.jpg", layerMode: "displace", position: { x: 10, y: 10 } } }, + ], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-displace,lx-10,ly-10,l-end/base-image.jpg", + ); + }); + + test("should generate correct URL with xCenter, yCenter and anchorPoint", async ({ page }) => { + const url = await buildSrc(page, { + transformationPosition: "path", + urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", + src: "/base-image.jpg", + transformation: [ + { overlay: { type: "image", input: "overlay-image.jpg", position: { xCenter: 100, yCenter: 50, anchorPoint: "top_left" } } }, + ], + }); + expect(url).toBe( + "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lxc-100,lyc-50,lap-top_left,l-end/base-image.jpg", + ); + }); + }); + + test("should encode Hindi (non-ASCII) text overlay and base path", async ({ page }) => { + const url = await buildSrc(page, { + urlEndpoint: "https://ik.imagekit.io/demo/", + src: "sdk-testing-files/हिन्दी.png", + transformation: [ + { + overlay: { + type: "text", + text: "हिन्दी", + transformation: [ + { + fontColor: "red", + fontSize: "32", + fontFamily: "sdk-testing-files/Poppins-Regular_Q15GrYWmL.ttf", + }, + ], + }, + }, + ], + }); + expect(url).toBe( + "https://ik.imagekit.io/demo/sdk-testing-files/%E0%A4%B9%E0%A4%BF%E0%A4%A8%E0%A5%8D%E0%A4%A6%E0%A5%80.png?tr=l-text,ie-4KS54KS%2F4KSo4KWN4KSm4KWA,co-red,fs-32,ff-sdk-testing-files@@Poppins-Regular_Q15GrYWmL.ttf,l-end", + ); + }); +}); diff --git a/test-app/tests/responsive.spec.ts b/test-app/tests/responsive.spec.ts new file mode 100644 index 0000000..061d9db --- /dev/null +++ b/test-app/tests/responsive.spec.ts @@ -0,0 +1,154 @@ +import { test, expect } from "./fixtures"; + +async function getResponsiveImageAttributes(page: import("@playwright/test").Page, opts: any) { + return page.evaluate((o) => (window as any).getResponsiveImageAttributes(o), opts); +} + +test.describe("getResponsiveImageAttributes", () => { + test("bare minimum input", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", + sizes: "100vw", + }); + }); + + test("sizes provided (100vw)", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + sizes: "100vw", + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", + sizes: "100vw", + }); + }); + + test("width only – DPR strategy", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + width: 400, + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 2x", + width: 400, + }); + }); + + test("custom breakpoints", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + deviceBreakpoints: [200, 400, 800], + imageBreakpoints: [100], + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-800,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-200,c-at_max 200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-400,c-at_max 400w, https://ik.imagekit.io/demo/sample.jpg?tr=w-800,c-at_max 800w", + sizes: "100vw", + }); + }); + + test("preserves caller transformations", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + width: 500, + transformation: [{ height: 300 }], + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-1080,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-1080,c-at_max 2x", + width: 500, + }); + }); + + test("both sizes and width passed", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + sizes: "50vw", + width: 600, + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", + sizes: "50vw", + width: 600, + }); + }); + + test("multiple transformations", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + width: 450, + transformation: [{ height: 300 }, { aiRemoveBackground: true }], + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-1080,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-1080,c-at_max 2x", + width: 450, + }); + }); + + test("sizes causes breakpoint pruning (33vw path)", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + sizes: "(min-width: 800px) 33vw, 100vw", + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-256,c-at_max 256w, https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", + sizes: "(min-width: 800px) 33vw, 100vw", + }); + }); + + test("Using queryParameters and transformationPosition", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + width: 450, + transformation: [{ height: 300 }, { aiRemoveBackground: true }], + queryParameters: { key: "value" }, + transformationPosition: "path", + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-1080,c-at_max/sample.jpg?key=value", + srcSet: + "https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-640,c-at_max/sample.jpg?key=value 1x, https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-1080,c-at_max/sample.jpg?key=value 2x", + width: 450, + }); + }); + + test("fallback when no usable vw tokens", async ({ page }) => { + const out = await getResponsiveImageAttributes(page, { + src: "sample.jpg", + urlEndpoint: "https://ik.imagekit.io/demo", + sizes: "100%", + }); + expect(out).toEqual({ + src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", + srcSet: + "https://ik.imagekit.io/demo/sample.jpg?tr=w-16,c-at_max 16w, https://ik.imagekit.io/demo/sample.jpg?tr=w-32,c-at_max 32w, https://ik.imagekit.io/demo/sample.jpg?tr=w-48,c-at_max 48w, https://ik.imagekit.io/demo/sample.jpg?tr=w-64,c-at_max 64w, https://ik.imagekit.io/demo/sample.jpg?tr=w-96,c-at_max 96w, https://ik.imagekit.io/demo/sample.jpg?tr=w-128,c-at_max 128w, https://ik.imagekit.io/demo/sample.jpg?tr=w-256,c-at_max 256w, https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", + sizes: "100%", + }); + }); +}); diff --git a/test-app/tests/upload.spec.ts b/test-app/tests/upload.spec.ts new file mode 100644 index 0000000..67ff9a5 --- /dev/null +++ b/test-app/tests/upload.spec.ts @@ -0,0 +1,1241 @@ +import { test, expect } from "./fixtures"; +import type { Page, Route } from "@playwright/test"; + +/** + * Upload tests run the real built SDK inside Chromium. Instead of sinon's fake + * XMLHttpRequest, the actual upload request is captured and answered with + * Playwright network interception (`page.route`). The multipart body is parsed + * back into its FormData fields so we can assert exactly what the SDK sent. + */ + +const UPLOAD_URL = "https://upload.imagekit.io/api/v1/files/upload"; + +const uploadSuccessResponseObj = { + fileId: "598821f949c0a938d57563bd", + name: "file1.jpg", + url: "https://ik.imagekit.io/your_imagekit_id/images/products/file1.jpg", + thumbnailUrl: + "https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/images/products/file1.jpg", + height: 300, + width: 200, + size: 83622, + filePath: "/images/products/file1.jpg", + tags: ["t-shirt", "round-neck", "sale2019"], + isPrivateFile: false, + customCoordinates: null, + fileType: "image", + AITags: [{ name: "Face", confidence: 99.95, source: "aws-auto-tagging" }], + extensionStatus: { "aws-auto-tagging": "success" }, +}; + +const securityParameters = { + signature: "test_signature", + expire: 123, + token: "test_token", + publicKey: "test_public_key", +}; + +/** Parse a multipart/form-data body into its text fields. */ +function parseMultipart( + buffer: Buffer | null, + contentType: string, +): Record { + const fields: Record = {}; + if (!buffer) return fields; + const boundaryMatch = /boundary=(.+)$/.exec(contentType); + if (!boundaryMatch) return fields; + const boundary = "--" + boundaryMatch[1]; + // latin1 keeps a 1:1 byte mapping so byte lengths stay accurate. + const raw = buffer.toString("latin1"); + for (const part of raw.split(boundary)) { + const headerEnd = part.indexOf("\r\n\r\n"); + if (headerEnd === -1) continue; + const header = part.slice(0, headerEnd); + const nameMatch = /name="([^"]*)"/.exec(header); + if (!nameMatch) continue; + fields[nameMatch[1]] = part.slice(headerEnd + 4).replace(/\r\n$/, ""); + } + return fields; +} + +type MockOptions = { + status?: number; + headers?: Record; + body?: string; + /** Reject the request at the network layer (triggers xhr.onerror). */ + networkError?: boolean; + /** Never answer the request (used for client-side abort tests). */ + hang?: boolean; +}; + +type Mock = { + fields: () => Record; + count: () => number; +}; + +/** Install a route that captures the upload payload and returns a mock response. */ +async function mockUpload(page: Page, options: MockOptions = {}): Promise { + let captured: Record = {}; + let count = 0; + await page.route(UPLOAD_URL, async (route: Route) => { + count++; + const request = route.request(); + captured = parseMultipart( + request.postDataBuffer(), + request.headers()["content-type"] || "", + ); + if (options.hang) return; // leave the request pending for abort tests + if (options.networkError) { + await route.abort("failed"); + return; + } + await route.fulfill({ + status: options.status ?? 200, + headers: { + "access-control-allow-origin": "*", + "content-type": "application/json", + ...(options.headers || {}), + }, + body: options.body ?? JSON.stringify(uploadSuccessResponseObj), + }); + }); + return { fields: () => captured, count: () => count }; +} + +type UploadResult = + | { ok: true; response: any } + | { + ok: false; + error: { + name: string; + message: string; + isAbort: boolean; + isInvalid: boolean; + isServer: boolean; + isNetwork: boolean; + isSyntax: boolean; + }; + }; + +/** Call the SDK `upload` in the browser and return a serializable result. */ +async function runUpload(page: Page, opts: any): Promise { + return page.evaluate(async (o) => { + const w = window as any; + try { + const response = await w.upload(o); + return { ok: true as const, response }; + } catch (e: any) { + return { + ok: false as const, + error: { + name: e?.name, + message: e?.message, + isAbort: e instanceof w.ImageKitAbortError, + isInvalid: e instanceof w.ImageKitInvalidRequestError, + isServer: e instanceof w.ImageKitServerError, + isNetwork: e instanceof w.ImageKitUploadNetworkError, + isSyntax: e instanceof SyntaxError, + }, + }; + } + }, opts); +} + +test.describe("File upload", () => { + test("Invalid options", async ({ page }) => { + const result = await runUpload(page, undefined); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Invalid options provided for upload"); + }); + + test("Missing fileName", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + file: "https://ik.imagekit.io/remote-url.jpg", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Missing fileName parameter for upload"); + }); + + test("Missing file", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Missing file parameter for upload"); + }); + + test("Missing token", async ({ page }) => { + const result = await runUpload(page, { + fileName: "test_file_name", + file: "test_file", + signature: "test_signature", + expire: 123, + publicKey: "test_public_key", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe( + "Missing token for upload. The SDK expects token, signature and expire for authentication.", + ); + }); + + test("Missing signature", async ({ page }) => { + const result = await runUpload(page, { + fileName: "test_file_name", + file: "test_file", + token: "test_token", + expire: 123, + publicKey: "test_public_key", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe( + "Missing signature for upload. The SDK expects token, signature and expire for authentication.", + ); + }); + + test("Missing expire", async ({ page }) => { + const result = await runUpload(page, { + fileName: "test_file_name", + file: "test_file", + token: "test_token", + signature: "test_signature", + publicKey: "test_public_key", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe( + "Missing expire for upload. The SDK expects token, signature and expire for authentication.", + ); + }); + + test("Missing public key", async ({ page }) => { + const result = await runUpload(page, { + fileName: "test_file_name", + file: "test_file", + token: "test_token", + signature: "test_signature", + expire: 123, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Missing public key for upload"); + }); + + test("Upload endpoint network error handling", async ({ page }) => { + await mockUpload(page, { networkError: true }); + const result = await runUpload(page, { + fileName: "test_file_name", + file: "test_file", + token: "test_token", + signature: "test_signature", + expire: 123, + publicKey: "test_public_key", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isNetwork).toBe(true); + expect(result.error.message).toBe( + "Request to ImageKit upload endpoint failed due to network error", + ); + }); + + test("Boolean handling", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + expect(mock.count()).toBe(1); + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Tag array handling", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: ["test_tag1", "test_tag2"], + useUniqueFileName: false, + isPrivateFile: true, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + expect(mock.count()).toBe(1); + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Missing useUniqueFileName", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: ["test_tag1", "test_tag2"], + isPrivateFile: true, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Missing isPrivateFile", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: ["test_tag1", "test_tag2"], + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With extensions parameter", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + webhookUrl: "https://your-domain/?appId=some-id", + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(f.webhookUrl).toBe("https://your-domain/?appId=some-id"); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Bare minimum request", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: undefined, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.tags).toBeUndefined(); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Bare minimum request: Blob", async ({ page }) => { + const mock = await mockUpload(page); + const result = await page.evaluate(async (sec) => { + const w = window as any; + const file = new Blob(["test_buffer"]); + try { + const response = await w.upload({ + ...sec, + fileName: "test_file_name", + file, + }); + return { ok: true as const, response }; + } catch (e: any) { + return { ok: false as const, message: e?.message }; + } + }, securityParameters); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + // Blob content is sent as the raw bytes of "test_buffer" (11 bytes). + expect(Buffer.byteLength(f.file, "latin1")).toBe("test_buffer".length); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.tags).toBeUndefined(); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Error during upload", async ({ page }) => { + await mockUpload(page, { + status: 401, + body: JSON.stringify({ + help: "For support kindly contact us at support@imagekit.io .", + message: "Your account cannot be authenticated.", + }), + }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Your account cannot be authenticated."); + }); + + test("Error during upload non 2xx with bad body", async ({ page }) => { + await mockUpload(page, { status: 500, body: "sdf" }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isServer).toBe(true); + expect(result.error.message).toBe( + "Server error occurred while uploading the file. This is rare and usually temporary.", + ); + }); + + test("Error during upload 2xx with bad body", async ({ page }) => { + await mockUpload(page, { status: 200, body: "sdf" }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isSyntax).toBe(true); + }); + + test("Upload via URL", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "https://ik.imagekit.io/remote-url.jpg", + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("https://ik.imagekit.io/remote-url.jpg"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.tags).toBeUndefined(); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Overriding public key", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "https://ik.imagekit.io/remote-url.jpg", + publicKey: "override_public_key", + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("https://ik.imagekit.io/remote-url.jpg"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.publicKey).toBe("override_public_key"); + expect(f.tags).toBeUndefined(); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.useUniqueFileName).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(f.extensions).toBeUndefined(); + expect(f.customMetadata).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With overwrite parameters", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + overwriteFile: false, + overwriteAITags: false, + overwriteTags: false, + overwriteCustomMetadata: false, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(f.overwriteFile).toBe("false"); + expect(f.overwriteAITags).toBe("false"); + expect(f.overwriteTags).toBe("false"); + expect(f.overwriteCustomMetadata).toBe("false"); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With customMetadata", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const customMetadata = { brand: "Nike", color: "red" }; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + overwriteFile: false, + overwriteAITags: false, + overwriteTags: false, + overwriteCustomMetadata: false, + customMetadata, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(f.overwriteFile).toBe("false"); + expect(f.overwriteAITags).toBe("false"); + expect(f.overwriteTags).toBe("false"); + expect(f.overwriteCustomMetadata).toBe("false"); + expect(f.customMetadata).toBe(JSON.stringify(customMetadata)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Array type fields", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const customMetadata = { brand: "Nike", color: "red" }; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: ["test_tag1", "test_tag2"], + customCoordinates: "10, 10, 100, 100", + responseFields: ["tags", "customCoordinates", "isPrivateFile", "metadata"], + useUniqueFileName: false, + isPrivateFile: true, + extensions, + overwriteFile: false, + overwriteAITags: false, + overwriteTags: false, + overwriteCustomMetadata: false, + customMetadata, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags,customCoordinates,isPrivateFile,metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(f.overwriteFile).toBe("false"); + expect(f.overwriteAITags).toBe("false"); + expect(f.overwriteTags).toBe("false"); + expect(f.overwriteCustomMetadata).toBe("false"); + expect(f.customMetadata).toBe(JSON.stringify(customMetadata)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("check custom XHR object is used", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const mock = await mockUpload(page); + const out = await page.evaluate(async (opts) => { + const w = window as any; + const xhr = new XMLHttpRequest(); + const fun = function () { + return "hello from function"; + }; + xhr.onprogress = fun as any; + try { + const response = await w.upload({ ...opts, xhr }); + return { + ok: true as const, + status: xhr.status, + onprogressPreserved: xhr.onprogress === (fun as any), + response, + }; + } catch (e: any) { + return { ok: false as const, message: e?.message }; + } + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + }); + expect(out.ok).toBe(true); + if (!out.ok) return; + // The provided xhr instance carried out the request and kept its handler. + expect(out.status).toBe(200); + expect(out.onprogressPreserved).toBe(true); + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(out.response).toEqual(uploadSuccessResponseObj); + }); + + test("Upload using promise - success", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Server 5xx error with proper json and message", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + await mockUpload(page, { + status: 500, + body: JSON.stringify({ + help: "For support kindly contact us at support@imagekit.io .", + message: "Something went wrong", + }), + }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isServer).toBe(true); + expect(result.error.message).toBe("Something went wrong"); + }); + + test("Custom xhr promise", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + const mock = await mockUpload(page); + const out = await page.evaluate(async (opts) => { + const w = window as any; + const xhr = new XMLHttpRequest(); + const fun = function () { + return "hello from function"; + }; + xhr.onprogress = fun as any; + try { + const response = await w.upload({ ...opts, xhr }); + return { + ok: true as const, + status: xhr.status, + onprogressPreserved: xhr.onprogress === (fun as any), + response, + }; + } catch (e: any) { + return { ok: false as const, message: e?.message }; + } + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + }); + expect(out.ok).toBe(true); + if (!out.ok) return; + expect(out.status).toBe(200); + expect(out.onprogressPreserved).toBe(true); + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.token).toBe("test_token"); + expect(f.expire).toBe("123"); + expect(f.signature).toBe("test_signature"); + expect(f.tags).toBe("test_tag1,test_tag2"); + expect(f.customCoordinates).toBe("10, 10, 100, 100"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.isPrivateFile).toBe("true"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.extensions).toBe(JSON.stringify(extensions)); + expect(out.response).toEqual(uploadSuccessResponseObj); + }); + + test("$ResponseMetadata assertions using promise", async ({ page }) => { + const extensions = [{ name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 }]; + await mockUpload(page, { + status: 200, + headers: { + "content-type": "application/json", + "x-request-id": "sdfsdfsdfdsf", + // Expose the custom header so the cross-origin XHR can read it back. + "access-control-expose-headers": "x-request-id", + }, + body: JSON.stringify(uploadSuccessResponseObj), + }); + const meta = await page.evaluate(async (opts) => { + const w = window as any; + const response = await w.upload(opts); + return { + statusCode: response.$ResponseMetadata.statusCode, + requestId: response.$ResponseMetadata.requestId, + headers: response.$ResponseMetadata.headers, + }; + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: "test_tag1,test_tag2", + customCoordinates: "10, 10, 100, 100", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + isPrivateFile: true, + extensions, + }); + expect(meta.statusCode).toBe(200); + expect(meta.requestId).toBe("sdfsdfsdfdsf"); + expect(meta.headers).toMatchObject({ + "content-type": "application/json", + "x-request-id": "sdfsdfsdfdsf", + }); + }); + + test("Undefined fields should not be sent", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + tags: undefined, + folder: undefined, + isPrivateFile: undefined, + customCoordinates: undefined, + responseFields: undefined, + extensions: undefined, + webhookUrl: undefined, + overwriteFile: undefined, + overwriteAITags: undefined, + overwriteTags: undefined, + overwriteCustomMetadata: undefined, + customMetadata: undefined, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.extensions).toBeUndefined(); + expect(f.tags).toBeUndefined(); + expect(f.folder).toBeUndefined(); + expect(f.isPrivateFile).toBeUndefined(); + expect(f.customCoordinates).toBeUndefined(); + expect(f.responseFields).toBeUndefined(); + expect(f.webhookUrl).toBeUndefined(); + expect(f.overwriteFile).toBeUndefined(); + expect(f.overwriteAITags).toBeUndefined(); + expect(f.overwriteTags).toBeUndefined(); + expect(f.overwriteCustomMetadata).toBeUndefined(); + expect(f.customMetadata).toBeUndefined(); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With pre and post transformation", async ({ page }) => { + const transformation = { + pre: "w-100", + post: [{ type: "transformation", value: "w-100" }], + }; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.transformation).toBe(JSON.stringify(transformation)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With pre transformation", async ({ page }) => { + const transformation = { pre: "w-100" }; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.transformation).toBe(JSON.stringify(transformation)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("With post transformation", async ({ page }) => { + const transformation = { post: [{ type: "transformation", value: "w-100" }] }; + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.transformation).toBe(JSON.stringify(transformation)); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("Server 5xx without message", async ({ page }) => { + await mockUpload(page, { status: 500, body: JSON.stringify({ help: "" }) }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isServer).toBe(true); + expect(result.error.message).toBe( + "Server error occurred while uploading the file. This is rare and usually temporary.", + ); + }); + + test("Should return error for an invalid pre transformation", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation: { pre: "" }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Invalid pre transformation parameter."); + }); + + test("Should return error for an invalid post transformation of type abs", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation: { post: [{ type: "abs", value: "" }] }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Invalid post transformation parameter."); + }); + + test("Should return error for an invalid post transformation of type transformation", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation: { post: [{ type: "transformation", value: "" }] }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Invalid post transformation parameter."); + }); + + test("Should return error for an invalid post transformation if it's not an array", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + transformation: { post: {} }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe("Invalid post transformation parameter."); + }); + + test("With checks option", async ({ page }) => { + const mock = await mockUpload(page); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + responseFields: "tags, customCoordinates, isPrivateFile, metadata", + useUniqueFileName: false, + checks: "'request.folder' : '/'", + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + + const f = mock.fields(); + expect(f.file).toBe("test_file"); + expect(f.fileName).toBe("test_file_name"); + expect(f.responseFields).toBe("tags, customCoordinates, isPrivateFile, metadata"); + expect(f.useUniqueFileName).toBe("false"); + expect(f.publicKey).toBe("test_public_key"); + expect(f.checks).toBe("'request.folder' : '/'"); + expect(result.response).toEqual(uploadSuccessResponseObj); + }); + + test("onProgress callback is triggered during upload", async ({ page }) => { + await mockUpload(page); + const out = await page.evaluate(async (opts) => { + const w = window as any; + const xhr = new XMLHttpRequest(); + let calls = 0; + const promise = w.upload({ ...opts, xhr, onProgress: () => { calls++; } }); + // The SDK wires xhr.upload.onprogress synchronously before sending, so a + // dispatched progress event must be forwarded to the callback. + xhr.upload.dispatchEvent( + new ProgressEvent("progress", { lengthComputable: true, loaded: 50, total: 100 }), + ); + const response = await promise; + return { calls, response }; + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(out.calls).toBeGreaterThanOrEqual(1); + expect(out.response).toEqual(uploadSuccessResponseObj); + }); + + test("Abort signal aborts the upload", async ({ page }) => { + await mockUpload(page, { hang: true }); + const out = await page.evaluate(async (opts) => { + const w = window as any; + const controller = new AbortController(); + const promise = w.upload({ ...opts, abortSignal: controller.signal }); + controller.abort(); + try { + await promise; + return { ok: true as const }; + } catch (e: any) { + return { + ok: false as const, + isAbort: e instanceof w.ImageKitAbortError, + reasonName: e?.reason?.name, + }; + } + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(out.ok).toBe(false); + if (out.ok) return; + expect(out.isAbort).toBe(true); + expect(out.reasonName).toBe("AbortError"); + }); + + test("Abort signal aborts the upload with reason", async ({ page }) => { + await mockUpload(page, { hang: true }); + const out = await page.evaluate(async (opts) => { + const w = window as any; + const controller = new AbortController(); + const promise = w.upload({ ...opts, abortSignal: controller.signal }); + controller.abort("abort reason"); + try { + await promise; + return { ok: true as const }; + } catch (e: any) { + return { + ok: false as const, + isAbort: e instanceof w.ImageKitAbortError, + reason: e?.reason, + }; + } + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(out.ok).toBe(false); + if (out.ok) return; + expect(out.isAbort).toBe(true); + expect(out.reason).toBe("abort reason"); + }); + + test("Already aborted signal should abort upload immediately", async ({ page }) => { + const out = await page.evaluate(async (opts) => { + const w = window as any; + const controller = new AbortController(); + controller.abort(); + try { + await w.upload({ ...opts, abortSignal: controller.signal }); + return { ok: true as const }; + } catch (e: any) { + return { + ok: false as const, + isAbort: e instanceof w.ImageKitAbortError, + reasonName: e?.reason?.name, + }; + } + }, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(out.ok).toBe(false); + if (out.ok) return; + expect(out.isAbort).toBe(true); + expect(out.reasonName).toBe("AbortError"); + }); + + test("Error during upload 4xx with invalid JSON response", async ({ page }) => { + await mockUpload(page, { status: 400, body: "sdf" }); + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isSyntax).toBe(true); + }); + + test("Should return error for an invalid transformation object in upload", async ({ page }) => { + const result = await runUpload(page, { + ...securityParameters, + fileName: "test_file_name", + file: "test_file", + transformation: 123, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.error.isInvalid).toBe(true); + expect(result.error.message).toBe( + "Invalid transformation parameter. Please include at least pre, post, or both.", + ); + }); +}); diff --git a/test/responsive.js b/test/responsive.js deleted file mode 100644 index 0f5397c..0000000 --- a/test/responsive.js +++ /dev/null @@ -1,159 +0,0 @@ -const { expect } = require('chai'); -const { getResponsiveImageAttributes } = require("../src/index"); - -describe('getResponsiveImageAttributes', () => { - it('bare minimum input', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - }); - // Expected object based on default deviceBreakpoints and imageBreakpoints: - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", - sizes: "100vw" - }); - }); - - it('sizes provided (100vw)', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - sizes: '100vw', - }); - // With a sizes value of "100vw", the function should use the same breakpoints as in the bare minimum case. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", - sizes: "100vw" - }); - }); - - it('width only – DPR strategy', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - width: 400, - }); - // When width is provided without sizes attribute, the DPR strategy should be used. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 2x", - width: 400 - }); - }); - - it('custom breakpoints', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - deviceBreakpoints: [200, 400, 800], - imageBreakpoints: [100], - }); - // For custom breakpoints, the breakpoints will be derived from the provided arrays. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-800,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-200,c-at_max 200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-400,c-at_max 400w, https://ik.imagekit.io/demo/sample.jpg?tr=w-800,c-at_max 800w", - sizes: "100vw" - }); - }); - - it('preserves caller transformations', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - width: 500, - transformation: [{ height: 300 }], - }); - // The provided transformation should be preserved in the output. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-1080,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=h-300:w-1080,c-at_max 2x", - width: 500 - }); - }); - - it('both sizes and width passed', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - sizes: '50vw', - width: 600, - }); - // Both sizes and width are provided, so the function should apply the sizes attribute while using width for DPR strategy. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", - sizes: "50vw", - width: 600 - }); - }); - - it('multiple transformations', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - width: 450, - transformation: [ - { height: 300 }, - { aiRemoveBackground: true } - ] - }); - // Multiple caller transformations should be combined appropriately. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-1080,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-640,c-at_max 1x, https://ik.imagekit.io/demo/sample.jpg?tr=h-300:e-bgremove:w-1080,c-at_max 2x", - width: 450 - }); - }); - - it('sizes causes breakpoint pruning (33vw path)', () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - sizes: '(min-width: 800px) 33vw, 100vw', - }); - // When specified with a sizes attribute that prunes breakpoints, the output should reflect the pruned values. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-256,c-at_max 256w, https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", - sizes: "(min-width: 800px) 33vw, 100vw" - }); - }); - - it("Using queryParameters and transformationPosition", () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - width: 450, - transformation: [ - { height: 300 }, - { aiRemoveBackground: true } - ], - queryParameters: { - key: "value" - }, - transformationPosition: "path" - }); - // The function should respect the transformation position and query parameters. - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-1080,c-at_max/sample.jpg?key=value", - srcSet: "https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-640,c-at_max/sample.jpg?key=value 1x, https://ik.imagekit.io/demo/tr:h-300:e-bgremove:w-1080,c-at_max/sample.jpg?key=value 2x", - width: 450 - }); - }) - - it("fallback when no usable vw tokens", () => { - const out = getResponsiveImageAttributes({ - src: 'sample.jpg', - urlEndpoint: 'https://ik.imagekit.io/demo', - sizes: "100%" - }); - expect(out).to.deep.equal({ - src: "https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max", - srcSet: "https://ik.imagekit.io/demo/sample.jpg?tr=w-16,c-at_max 16w, https://ik.imagekit.io/demo/sample.jpg?tr=w-32,c-at_max 32w, https://ik.imagekit.io/demo/sample.jpg?tr=w-48,c-at_max 48w, https://ik.imagekit.io/demo/sample.jpg?tr=w-64,c-at_max 64w, https://ik.imagekit.io/demo/sample.jpg?tr=w-96,c-at_max 96w, https://ik.imagekit.io/demo/sample.jpg?tr=w-128,c-at_max 128w, https://ik.imagekit.io/demo/sample.jpg?tr=w-256,c-at_max 256w, https://ik.imagekit.io/demo/sample.jpg?tr=w-384,c-at_max 384w, https://ik.imagekit.io/demo/sample.jpg?tr=w-640,c-at_max 640w, https://ik.imagekit.io/demo/sample.jpg?tr=w-750,c-at_max 750w, https://ik.imagekit.io/demo/sample.jpg?tr=w-828,c-at_max 828w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1080,c-at_max 1080w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1200,c-at_max 1200w, https://ik.imagekit.io/demo/sample.jpg?tr=w-1920,c-at_max 1920w, https://ik.imagekit.io/demo/sample.jpg?tr=w-2048,c-at_max 2048w, https://ik.imagekit.io/demo/sample.jpg?tr=w-3840,c-at_max 3840w", - sizes: "100%" - }); - }) - -}); diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index 5decfdd..0000000 --- a/test/setup.js +++ /dev/null @@ -1,12 +0,0 @@ -// test-setup.js (loaded before your tests) -global.FormData = require("formdata-node"); -global.Blob = require("web-file-polyfill").Blob -global.File = require("web-file-polyfill").File -global.ProgressEvent = class FakeProgressEvent { - constructor(type, init = {}) { - this.type = type; - this.lengthComputable = init.lengthComputable || false; - this.loaded = init.loaded || 0; - this.total = init.total || 0; - } -}; diff --git a/test/upload.js b/test/upload.js deleted file mode 100644 index a5c7004..0000000 --- a/test/upload.js +++ /dev/null @@ -1,1394 +0,0 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const expect = chai.expect; -import 'regenerator-runtime/runtime'; -import { - ImageKitAbortError, - ImageKitInvalidRequestError, - ImageKitServerError, - ImageKitUploadNetworkError, upload -} from "../src/index"; - -var requests, server; - -const uploadSuccessResponseObj = { - "fileId": "598821f949c0a938d57563bd", - "name": "file1.jpg", - "url": "https://ik.imagekit.io/your_imagekit_id/images/products/file1.jpg", - "thumbnailUrl": "https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/images/products/file1.jpg", - "height": 300, - "width": 200, - "size": 83622, - "filePath": "/images/products/file1.jpg", - "tags": ["t-shirt", "round-neck", "sale2019"], - "isPrivateFile": false, - "customCoordinates": null, - "fileType": "image", - "AITags": [{ "name": "Face", "confidence": 99.95, "source": "aws-auto-tagging" }], - "extensionStatus": { "aws-auto-tagging": "success" } -}; - -const securityParameters = { - signature: "test_signature", - expire: 123, - token: "test_token", - publicKey: "test_public_key", -}; - -function successUploadResponse() { - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - 200, - { "Content-Type": "application/json" }, - JSON.stringify(uploadSuccessResponseObj) - ] - ); - server.respond(); -} - -function errorUploadResponse(statusCode, obj) { - obj = obj || { - "message": "Your account cannot be authenticated.", - "help": "For support kindly contact us at support@imagekit.io ." - }; - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - statusCode || 400, - { "Content-Type": "application/json" }, - JSON.stringify(obj) - ] - ); - server.respond(); -} - -async function sleep(ms = 0) { - return true; - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} - -describe("File upload", async function () { - beforeEach(() => { - global.XMLHttpRequest = sinon.useFakeXMLHttpRequest(); - requests = []; - global.XMLHttpRequest.onCreate = function (req) { requests.push(req); }; - server = sinon.createFakeServer(); - }); - - afterEach(() => { - global.XMLHttpRequest.restore(); - server.restore(); - }); - - it('Invalid options', async function () { - try { - await upload(); - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid options provided for upload"); - } - }); - - it('Missing fileName', async function () { - const fileOptions = { - ...securityParameters, - file: "https://ik.imagekit.io/remote-url.jpg" - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing fileName parameter for upload"); - } - }); - - it('Missing file', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing file parameter for upload"); - } - }); - - it('Missing token', async function () { - const fileOptions = { - fileName: "test_file_name", - file: "test_file", - signature: 'test_signature', - expire: 123, - // Omit token - publicKey: 'test_public_key' - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing token for upload. The SDK expects token, signature and expire for authentication."); - } - }); - - it('Missing signature', async function () { - const fileOptions = { - fileName: "test_file_name", - file: "test_file", - token: 'test_token', - expire: 123, - publicKey: 'test_public_key' - // Omit signature - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing signature for upload. The SDK expects token, signature and expire for authentication."); - } - }); - - it('Missing expire', async function () { - const fileOptions = { - fileName: "test_file_name", - file: "test_file", - token: 'test_token', - signature: 'test_signature', - publicKey: 'test_public_key' - // Omit expire - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing expire for upload. The SDK expects token, signature and expire for authentication."); - } - }); - - it('Missing public key', async function () { - const fileOptions = { - fileName: "test_file_name", - file: "test_file", - token: 'test_token', - signature: 'test_signature', - expire: 123 - // Omit publicKey - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Missing public key for upload"); - } - }); - - it('Upload endpoint network error handling', async function () { - const fileOptions = { - fileName: "test_file_name", - file: "test_file", - token: 'test_token', - signature: 'test_signature', - expire: 123, - publicKey: 'test_public_key' - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - // Simulate network error on upload API - server.requests[0].error(); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitUploadNetworkError).to.be.true; - expect(ex.message).to.be.equal("Request to ImageKit upload endpoint failed due to network error"); - } - }); - - it('Boolean handling', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Tag array handling', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: ["test_tag1", "test_tag2"], - useUniqueFileName: false, - isPrivateFile: true - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Missing useUniqueFileName', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: ["test_tag1", "test_tag2"], - isPrivateFile: true - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Missing isPrivateFile', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: ["test_tag1", "test_tag2"] - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('With extensions parameter', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { - name: "aws-auto-tagging", - minConfidence: 80, - maxTags: 10 - } - ], - webhookUrl: "https://your-domain/?appId=some-id" - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - expect(arg.get('webhookUrl')).to.be.equal('https://your-domain/?appId=some-id'); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Bare minimum request', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: undefined - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('tags')).to.be.equal(undefined); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Bare minimum request: Blob', async function () { - const buffer = Buffer.from("test_buffer"); - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: buffer - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - // It's a blob now, check size - expect(arg.get('file').size).to.be.eq(buffer.length); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('tags')).to.be.equal(undefined); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Error during upload', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file" - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "For support kindly contact us at support@imagekit.io .", - message: "Your account cannot be authenticated." - }; - errorUploadResponse(401, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Your account cannot be authenticated."); - } - }); - - it('Error during upload non 2xx with bad body', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file" - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - 500, - { "Content-Type": "application/json" }, - "sdf" - ] - ); - server.respond(); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - // The response body is invalid JSON => SyntaxError - expect(ex instanceof ImageKitServerError).to.be.true; - expect(ex.message).to.be.equal("Server error occurred while uploading the file. This is rare and usually temporary."); - } - }); - - it('Error during upload 2xx with bad body', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file" - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - 200, - { "Content-Type": "application/json" }, - "sdf" - ] - ); - server.respond(); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof SyntaxError).to.be.true; - } - }); - - it('Upload via URL', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "https://ik.imagekit.io/remote-url.jpg" - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("https://ik.imagekit.io/remote-url.jpg"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('tags')).to.be.equal(undefined); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Overriding public key', async function () { - var newPublicKey = "override_public_key"; - - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "https://ik.imagekit.io/remote-url.jpg" - }; - - const uploadPromise = upload({ - ...fileOptions, - publicKey: newPublicKey - }); - - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("https://ik.imagekit.io/remote-url.jpg"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('publicKey')).to.be.equal('override_public_key'); - expect(arg.get('tags')).to.be.equal(undefined); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('useUniqueFileName')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - expect(arg.get('extensions')).to.be.equal(undefined); - expect(arg.get('customMetadata')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('With overwrite parameters', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ], - overwriteFile: false, - overwriteAITags: false, - overwriteTags: false, - overwriteCustomMetadata: false - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - expect(arg.get('overwriteFile')).to.be.equal('false'); - expect(arg.get('overwriteAITags')).to.be.equal('false'); - expect(arg.get('overwriteTags')).to.be.equal('false'); - expect(arg.get('overwriteCustomMetadata')).to.be.equal('false'); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('With customMetadata', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ], - overwriteFile: false, - overwriteAITags: false, - overwriteTags: false, - overwriteCustomMetadata: false, - customMetadata: { - brand: "Nike", - color: "red" - }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - expect(arg.get('overwriteFile')).to.be.equal('false'); - expect(arg.get('overwriteAITags')).to.be.equal('false'); - expect(arg.get('overwriteTags')).to.be.equal('false'); - expect(arg.get('overwriteCustomMetadata')).to.be.equal('false'); - expect(arg.get('customMetadata')).to.be.equal(JSON.stringify(fileOptions.customMetadata)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Array type fields', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: ["test_tag1", "test_tag2"], - customCoordinates: "10, 10, 100, 100", - responseFields: ["tags", "customCoordinates", "isPrivateFile", "metadata"], - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ], - overwriteFile: false, - overwriteAITags: false, - overwriteTags: false, - overwriteCustomMetadata: false, - customMetadata: { - brand: "Nike", - color: "red" - }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags,customCoordinates,isPrivateFile,metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - expect(arg.get('overwriteFile')).to.be.equal('false'); - expect(arg.get('overwriteAITags')).to.be.equal('false'); - expect(arg.get('overwriteTags')).to.be.equal('false'); - expect(arg.get('overwriteCustomMetadata')).to.be.equal('false'); - expect(arg.get('customMetadata')).to.be.equal(JSON.stringify(fileOptions.customMetadata)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('check custom XHR object is used', async function () { - var xhr = new XMLHttpRequest(); - var fun = function () { return "hello from function" }; - xhr.onprogress = fun; - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ], - xhr - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - expect(server.requests[0]).to.be.equal(xhr); - expect(server.requests[0].onprogress.toString()).to.be.equal(fun.toString()); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Upload using promise - success', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ] - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Server 5xx error with proper json and message', async function () { - var errRes = { - help: "For support kindly contact us at support@imagekit.io .", - message: "Something went wrong" - }; - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ] - }; - - try { - const uploadPromise = upload(fileOptions); - await sleep(); - errorUploadResponse(500, errRes); - await sleep(); - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitServerError).to.be.true; - expect(ex.message).to.be.equal("Something went wrong"); - } - }); - - it('Custom xhr promise', async function () { - var xhr = new XMLHttpRequest(); - var fun = function () { return "hello from function" }; - xhr.onprogress = fun; - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { name: "aws-auto-tagging", minConfidence: 80, maxTags: 10 } - ], - xhr - }; - const uploadPromise = upload(fileOptions); - - expect(server.requests.length).to.be.equal(1); - - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(server.requests[0]).to.be.equal(xhr); - expect(server.requests[0].onprogress.toString()).to.be.equal(fun.toString()); - - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('token')).to.be.equal("test_token"); - expect(arg.get('expire')).to.be.equal("123"); - expect(arg.get('signature')).to.be.equal("test_signature"); - expect(arg.get('tags')).to.be.equal("test_tag1,test_tag2"); - expect(arg.get('customCoordinates')).to.be.equal("10, 10, 100, 100"); - expect(arg.get('responseFields')).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get('useUniqueFileName')).to.be.equal('false'); - expect(arg.get('isPrivateFile')).to.be.equal('true'); - expect(arg.get('publicKey')).to.be.equal('test_public_key'); - expect(arg.get('extensions')).to.be.equal(JSON.stringify(fileOptions.extensions)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('$ResponseMetadata assertions using promise', async function () { - var dummyResponseHeaders = { - "content-type": "application/json", - "x-request-id": "sdfsdfsdfdsf" - }; - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: "test_tag1,test_tag2", - customCoordinates: "10, 10, 100, 100", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - isPrivateFile: true, - extensions: [ - { - name: "aws-auto-tagging", - minConfidence: 80, - maxTags: 10 - } - ] - }; - - var uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - - await sleep(); - - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - 200, - dummyResponseHeaders, - JSON.stringify(uploadSuccessResponseObj) - ] - ); - server.respond(); - await sleep(); - - const response = await uploadPromise; - expect(response.$ResponseMetadata.headers).to.deep.equal(dummyResponseHeaders); - expect(response.$ResponseMetadata.statusCode).to.equal(200); - expect(response.$ResponseMetadata.requestId).to.equal("sdfsdfsdfdsf"); - }); - - it('Undefined fields should not be sent', async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - tags: undefined, - folder: undefined, - isPrivateFile: undefined, - customCoordinates: undefined, - responseFields: undefined, - extensions: undefined, - webhookUrl: undefined, - overwriteFile: undefined, - overwriteAITags: undefined, - overwriteTags: undefined, - overwriteCustomMetadata: undefined, - customMetadata: undefined - }; - - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get('file')).to.be.equal("test_file"); - expect(arg.get('fileName')).to.be.equal("test_file_name"); - expect(arg.get('extensions')).to.be.equal(undefined); - expect(arg.get('tags')).to.be.equal(undefined); - expect(arg.get('folder')).to.be.equal(undefined); - expect(arg.get('isPrivateFile')).to.be.equal(undefined); - expect(arg.get('customCoordinates')).to.be.equal(undefined); - expect(arg.get('responseFields')).to.be.equal(undefined); - expect(arg.get('extensions')).to.be.equal(undefined); - expect(arg.get('webhookUrl')).to.be.equal(undefined); - expect(arg.get('overwriteFile')).to.be.equal(undefined); - expect(arg.get('overwriteAITags')).to.be.equal(undefined); - expect(arg.get('overwriteTags')).to.be.equal(undefined); - expect(arg.get('overwriteCustomMetadata')).to.be.equal(undefined); - expect(arg.get('customMetadata')).to.be.equal(undefined); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it("With pre and post transformation", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { pre: "w-100", post: [{ type: "transformation", value: "w-100" }] }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get("file")).to.be.equal("test_file"); - expect(arg.get("fileName")).to.be.equal("test_file_name"); - expect(arg.get("responseFields")).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get("useUniqueFileName")).to.be.equal("false"); - expect(arg.get("publicKey")).to.be.equal("test_public_key"); - expect(arg.get("transformation")).to.be.equal(JSON.stringify(fileOptions.transformation)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it("With pre transformation", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { pre: "w-100" }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get("file")).to.be.equal("test_file"); - expect(arg.get("fileName")).to.be.equal("test_file_name"); - expect(arg.get("responseFields")).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get("useUniqueFileName")).to.be.equal("false"); - expect(arg.get("publicKey")).to.be.equal("test_public_key"); - expect(arg.get("transformation")).to.be.equal(JSON.stringify(fileOptions.transformation)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it("With post transformation", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { post: [{ type: "transformation", value: "w-100" }] }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - - expect(arg.get("file")).to.be.equal("test_file"); - expect(arg.get("fileName")).to.be.equal("test_file_name"); - expect(arg.get("responseFields")).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get("useUniqueFileName")).to.be.equal("false"); - expect(arg.get("publicKey")).to.be.equal("test_public_key"); - expect(arg.get("transformation")).to.be.equal(JSON.stringify(fileOptions.transformation)); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it("Server 5xx without message", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "" - }; - errorUploadResponse(500, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitServerError).to.be.true; - expect(ex.message).to.be.equal("Server error occurred while uploading the file. This is rare and usually temporary."); - } - }); - - it("Should return error for an invalid pre transformation", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { pre: "" }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "", - message: "Invalid pre transformation parameter.", - }; - errorUploadResponse(500, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid pre transformation parameter."); - } - }); - - it("Should return error for an invalid post transformation of type abs", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { post: [{ type: "abs", value: "" }] }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "", - message: "Invalid post transformation parameter.", - }; - errorUploadResponse(500, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid post transformation parameter."); - } - }); - - it("Should return error for an invalid post transformation of type transformation", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { post: [{ type: "transformation", value: "" }] }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "", - message: "Invalid post transformation parameter.", - }; - errorUploadResponse(500, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid post transformation parameter."); - } - }); - - it("Should return error for an invalid post transformation if it's not an array", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - transformation: { post: {} }, - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - var errRes = { - help: "", - message: "Invalid post transformation parameter.", - }; - errorUploadResponse(500, errRes); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid post transformation parameter."); - } - }); - - it("With checks option", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - responseFields: "tags, customCoordinates, isPrivateFile, metadata", - useUniqueFileName: false, - checks: "'request.folder' : '/'", - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - await sleep(); - successUploadResponse(); - await sleep(); - - var arg = server.requests[0].requestBody; - expect(arg.get("file")).to.be.equal("test_file"); - expect(arg.get("fileName")).to.be.equal("test_file_name"); - expect(arg.get("responseFields")).to.be.equal("tags, customCoordinates, isPrivateFile, metadata"); - expect(arg.get("useUniqueFileName")).to.be.equal("false"); - expect(arg.get("publicKey")).to.be.equal("test_public_key"); - expect(arg.get('checks')).to.be.equal("'request.folder' : '/'"); - - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('onProgress callback is triggered during upload', async function () { - const progressSpy = sinon.spy(); - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - onProgress: progressSpy - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - server.requests[0].uploadProgress({ lengthComputable: true, loaded: 50, total: 100 }); - - await sleep(); - expect(progressSpy.calledOnce).to.be.true; - successUploadResponse(); - await sleep(); - expect(progressSpy.calledTwice).to.be.true; // final progress - const response = await uploadPromise; - expect(response).to.be.deep.equal(uploadSuccessResponseObj); - }); - - it('Abort signal aborts the upload', async function () { - const abortController = new AbortController(); - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - abortSignal: abortController.signal - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - abortController.abort(); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitAbortError).to.be.true; - expect(ex.reason.name).to.be.equal("AbortError"); - } - }); - - it('Abort signal aborts the upload with reason', async function () { - const abortController = new AbortController(); - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - abortSignal: abortController.signal - }; - const uploadPromise = upload(fileOptions); - expect(server.requests.length).to.be.equal(1); - abortController.abort("abort reason"); - await sleep(); - try { - await uploadPromise; - throw new Error('Should have thrown error'); - } catch (ex) { - expect(ex instanceof ImageKitAbortError).to.be.true; - expect(ex.reason).to.be.equal("abort reason"); - } - }); - - it("Already aborted signal should abort upload immediately", async function () { - const abortController = new AbortController(); - // Abort the signal before calling upload - abortController.abort(); - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - abortSignal: abortController.signal - }; - try { - await upload(fileOptions); - throw new Error("Should have thrown error"); - } catch (ex) { - expect(ex instanceof ImageKitAbortError).to.be.true; - expect(ex.reason && ex.reason.name).to.be.equal("AbortError"); - } - }); - - it("Error during upload 4xx with invalid JSON response", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file" - }; - const uploadPromise = upload(fileOptions); - // errorUploadResponse(400, `{sd`); - server.respondWith("POST", "https://upload.imagekit.io/api/v1/files/upload", - [ - 400, - { "Content-Type": "application/json" }, - "sdf" - ] - ); - server.respond(); - try { - await uploadPromise; - throw new Error("Should have thrown error"); - } catch (ex) { - expect(ex).to.be.instanceOf(SyntaxError); - } - }); - - it("Should return error for an invalid transformation object in upload", async function () { - const fileOptions = { - ...securityParameters, - fileName: "test_file_name", - file: "test_file", - transformation: 123 - }; - try { - await upload(fileOptions); - throw new Error("Should have thrown error"); - } catch (ex) { - expect(ex instanceof ImageKitInvalidRequestError).to.be.true; - expect(ex.message).to.be.equal("Invalid transformation parameter. Please include at least pre, post, or both."); - } - }); -}); diff --git a/test/url-generation/buildtransformationString.js b/test/url-generation/buildtransformationString.js deleted file mode 100644 index f116b2e..0000000 --- a/test/url-generation/buildtransformationString.js +++ /dev/null @@ -1,26 +0,0 @@ -const { buildTransformationString } = require("../../src/index"); -const { expect } = require('chai'); - -describe('buildTransformationString', function () { - it('should return an empty string when no transformations are provided', function () { - const result = buildTransformationString([{}]); - expect(result).to.equal(''); - }); - - it('should generate a transformation string for width only', function () { - const result = buildTransformationString([{ width: 300 }]); - expect(result).to.equal('w-300'); - }); - - it('should generate a transformation string for multiple transformations', function () { - const result = buildTransformationString([ - { - overlay: { - type: 'text', - text: 'Hello', - } - } - ]); - expect(result).to.equal('l-text,i-Hello,l-end'); - }); -}); diff --git a/test/url-generation/overlay.js b/test/url-generation/overlay.js deleted file mode 100644 index baf2bf8..0000000 --- a/test/url-generation/overlay.js +++ /dev/null @@ -1,603 +0,0 @@ -const chai = require("chai"); -const expect = chai.expect; -import { buildSrc } from "../../src/index"; -import { safeBtoa } from "../../src/utils/transformation"; - -describe("Overlay Transformation Test Cases", function () { - - it('Ignore invalid values if text is missing', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "text" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Ignore if type is missing', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Ignore invalid values if input (image)', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Ignore invalid values if input (video)', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "video" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Ignore invalid values if input (subtitle)', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "subtitle" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Ignore invalid values if color is missing (solidColor)', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "solidColor" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/base-image.jpg`); - }); - - it('Text overlay generates correct URL with encoded overlay text', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "text", - text: "Minimal Text", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-${encodeURIComponent("Minimal Text")},l-end/base-image.jpg`); - }); - - it('Image overlay generates correct URL with input logo.png', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "logo.png", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-logo.png,l-end/base-image.jpg`); - }); - - it('Video overlay generates correct URL with input play-pause-loop.mp4', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-video.mp4", - transformation: [{ - overlay: { - type: "video", - input: "play-pause-loop.mp4", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-video,i-play-pause-loop.mp4,l-end/base-video.mp4`); - }); - - it("Subtitle overlay generates correct URL with input subtitle.srt", function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-video.mp4", - transformation: [{ - overlay: { - type: "subtitle", - input: "subtitle.srt", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-subtitles,i-subtitle.srt,l-end/base-video.mp4`); - }); - - it("Solid color overlay generates correct URL with background color FF0000", function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "solidColor", - color: "FF0000", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-ik_canvas,bg-FF0000,l-end/base-image.jpg`); - }); - - it('Combined overlay transformations generate correct URL including nested overlays', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [ - { - // Text overlay - overlay: { - type: "text", - text: "Every thing", - position: { - x: "10", - y: "20", - focus: "center" - }, - timing: { - start: 5, - duration: "10", - end: 15 - }, - transformation: [{ - width: "bw_mul_0.5", - fontSize: 20, - fontFamily: "Arial", - fontColor: "0000ff", - innerAlignment: "left", - padding: 5, - alpha: 7, - typography: "b", - background: "red", - radius: 10, - rotation: "N45", - flip: "h", - lineHeight: 20 - }] - } - }, - { - // Image overlay - overlay: { - type: "image", - input: "logo.png", - position: { - x: "10", - y: "20", - focus: "center" - }, - timing: { - start: 5, - duration: "10", - end: 15 - }, - transformation: [ - { - width: "bw_mul_0.5", - height: "bh_mul_0.5", - rotation: "N45", - flip: "h", - overlay: { - type: "text", - text: "Nested text overlay", - } - } - ] - } - }, - { - // Video overlay. Just for URL generation testing, you can't actually overlay a video on an image. - overlay: { - type: "video", - input: "play-pause-loop.mp4", - position: { - x: "10", - y: "20", - focus: "center" - }, - timing: { - start: 5, - duration: "10", - end: 15 - }, - transformations: [{ - width: "bw_mul_0.5", - height: "bh_mul_0.5", - rotation: "N45", - flip: "h", - }] - } - }, - { - // Subtitle overlay. Just for URL generation testing, you can't actually overlay a subtitle on an image. - overlay: { - type: "subtitle", - input: "subtitle.srt", - position: { - x: "10", - y: "20", - focus: "center" - }, - timing: { - start: 5, - duration: "10", - end: 15 - }, - transformations: [{ - width: "bw_mul_0.5", - height: "bh_mul_0.5", - rotation: "N45", - flip: "h", - }] - } - }, - { - // Solid color overlay - overlay: { - type: "solidColor", - color: "FF0000", - position: { - x: "10", - y: "20", - focus: "center" - }, - timing: { - start: 5, - duration: "10", - end: 15 - }, - transformation: [{ - width: "bw_mul_0.5", - height: "bh_mul_0.5", - rotation: "N45", - flip: "h", - }] - } - } - ] - }); - - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-${encodeURIComponent("Every thing")},lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,fs-20,ff-Arial,co-0000ff,ia-left,pa-5,al-7,tg-b,bg-red,r-10,rt-N45,fl-h,lh-20,l-end:l-image,i-logo.png,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,h-bh_mul_0.5,rt-N45,fl-h,l-text,i-${encodeURIComponent("Nested text overlay")},l-end,l-end:l-video,i-play-pause-loop.mp4,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,l-end:l-subtitles,i-subtitle.srt,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,l-end:l-image,i-ik_canvas,bg-FF0000,lx-10,ly-20,lfo-center,lso-5,leo-15,ldu-10,w-bw_mul_0.5,h-bh_mul_0.5,rt-N45,fl-h,l-end/base-image.jpg`); - }); -}); - -describe("Overlay encoding test cases", function () { - it('Nested simple path, should use i instead of ie, handle slash properly', function () { - const url = buildSrc({ - // Using a different endpoint here, as we are checking for /demo - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/medium_cafe_B1iTdD0C.jpg", - transformation: [{ - overlay: { - type: "image", - input: "/customer_logo/nykaa.png", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-image,i-customer_logo@@nykaa.png,l-end/medium_cafe_B1iTdD0C.jpg`); - }); - - it('Nested non-simple path, should use ie instead of i', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/medium_cafe_B1iTdD0C.jpg", - transformation: [{ - overlay: { - type: "image", - input: "/customer_logo/Ñykaa.png" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-image,ie-Y3VzdG9tZXJfbG9nby9OzIN5a2FhLnBuZw%3D%3D,l-end/medium_cafe_B1iTdD0C.jpg`); - }); - - it('Simple text overlay, should use i instead of ie', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/medium_cafe_B1iTdD0C.jpg", - transformation: [{ - overlay: { - type: "text", - text: "Manu", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-text,i-Manu,l-end/medium_cafe_B1iTdD0C.jpg`); - }); - - it('Simple text overlay with spaces and other safe characters, should use i instead of ie', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/medium_cafe_B1iTdD0C.jpg", - transformation: [{ - overlay: { - type: "text", - text: "alnum123-._ ", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-text,i-${encodeURIComponent("alnum123-._ ")},l-end/medium_cafe_B1iTdD0C.jpg`); - }); - - it('Non simple text overlay, should use ie instead of i', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/medium_cafe_B1iTdD0C.jpg", - transformation: [{ - overlay: { - type: "text", - text: "Let's use ©, ®, ™, etc", - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-text,ie-TGV0J3MgdXNlIMKpLCDCriwg4oSiLCBldGM%3D,l-end/medium_cafe_B1iTdD0C.jpg`); - }); - - it('Text overlay with explicit plain encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.jpg", - transformation: [{ - overlay: { - type: "text", - text: "HelloWorld", - encoding: "plain" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-text,i-HelloWorld,l-end/sample.jpg`); - }); - - it('Text overlay with explicit base64 encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.jpg", - transformation: [{ - overlay: { - type: "text", - text: "HelloWorld", - encoding: "base64" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-text,ie-${encodeURIComponent(safeBtoa("HelloWorld"))},l-end/sample.jpg`); - }); - - it('Image overlay with explicit plain encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.jpg", - transformation: [{ - overlay: { - type: "image", - input: "/customer/logo.png", - encoding: "plain" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-image,i-customer@@logo.png,l-end/sample.jpg`); - }); - - it('Image overlay with explicit base64 encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.jpg", - transformation: [{ - overlay: { - type: "image", - input: "/customer/logo.png", - encoding: "base64" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-image,ie-${encodeURIComponent(safeBtoa("customer/logo.png"))},l-end/sample.jpg`); - }); - - it('Video overlay with explicit base64 encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.mp4", - transformation: [{ - overlay: { - type: "video", - input: "/path/to/video.mp4", - encoding: "base64" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-video,ie-${encodeURIComponent(safeBtoa("path/to/video.mp4"))},l-end/sample.mp4`); - }); - - it('Subtitle overlay with explicit plain encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.mp4", - transformation: [{ - overlay: { - type: "subtitle", - input: "/sub.srt", - encoding: "plain" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-subtitles,i-sub.srt,l-end/sample.mp4`); - }); - - it('Subtitle overlay with explicit base64 encoding', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.mp4", - transformation: [{ - overlay: { - type: "subtitle", - input: "sub.srt", - encoding: "base64" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/demo/tr:l-subtitles,ie-${encodeURIComponent(safeBtoa("sub.srt"))},l-end/sample.mp4`); - }); - - it("Avoid double encoding when transformation string is in query params", function () { - const url = buildSrc({ - urlEndpoint: "https://ik.imagekit.io/demo", - src: "/sample.jpg", - transformation: [{ - overlay: { - type: "text", - text: "Minimal Text" - } - }], - transformationPosition: "query" - }); - expect(url).equal(`https://ik.imagekit.io/demo/sample.jpg?tr=l-text,i-Minimal%20Text,l-end`); - }); - - // Layer Mode Tests - describe("Layer Mode Tests", function () { - it('should generate correct URL with multiply layer mode', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "overlay-image.jpg", - layerMode: "multiply" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-multiply,l-end/base-image.jpg`); - }); - - it('should generate correct URL with cutter layer mode', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "overlay-image.jpg", - layerMode: "cutter" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-cutter,l-end/base-image.jpg`); - }); - - it('should generate correct URL with cutout layer mode', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "overlay-image.jpg", - layerMode: "cutout" - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-cutout,l-end/base-image.jpg`); - }); - - it('should generate correct URL with displace layer mode', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "overlay-image.jpg", - layerMode: "displace", - position: { - x: 10, - y: 10 - } - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lm-displace,lx-10,ly-10,l-end/base-image.jpg`); - }); - - it('should generate correct URL with xCenter, yCenter and anchorPoint', function () { - const url = buildSrc({ - transformationPosition: "path", - urlEndpoint: "https://ik.imagekit.io/test_url_endpoint", - src: "/base-image.jpg", - transformation: [{ - overlay: { - type: "image", - input: "overlay-image.jpg", - position: { - xCenter: 100, - yCenter: 50, - anchorPoint: "top_left" - } - } - }] - }); - expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay-image.jpg,lxc-100,lyc-50,lap-top_left,l-end/base-image.jpg`); - }); - }); -});