From 35eb61fd971a812c1c6710873a734bb5c23cac4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20D=C3=A9siles?= <1536672+jokesterfr@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:25:38 +0200 Subject: [PATCH] fix/confidentiality issue (#360) --- .github/workflows/quality-check.yml | 35 + controllers/front/apiHealthCheck.php | 2 - e2e-env/README.md | 16 + e2e/eslint.config.mjs | 9 + e2e/package.json | 32 +- e2e/pnpm-lock.yaml | 998 +++++++++++++++++++++++--- e2e/src/env.spec.ts | 36 +- e2e/src/full-sync.spec.ts | 68 +- e2e/src/helpers/controllers.ts | 74 +- e2e/src/helpers/data-helper.ts | 40 +- e2e/src/helpers/log-helper.ts | 29 +- e2e/src/helpers/mock-probe.ts | 122 ++-- e2e/src/helpers/test.config.ts | 25 +- e2e/src/job-id-validation.spec.ts | 128 ++++ e2e/src/reject-invalid-job-id.spec.ts | 53 -- e2e/src/type/bundles.ts | 19 +- e2e/src/type/carrier-details.ts | 7 +- e2e/src/type/carriers.ts | 5 +- e2e/src/type/cart-products.ts | 23 +- e2e/src/type/carts.ts | 17 +- e2e/src/type/categories.ts | 7 +- e2e/src/type/currency.ts | 26 +- e2e/src/type/customers.ts | 33 +- e2e/src/type/employees.ts | 7 +- e2e/src/type/health-check.ts | 30 +- e2e/src/type/image-type.ts | 29 +- e2e/src/type/images.ts | 27 +- e2e/src/type/languages.ts | 35 +- e2e/src/type/manufacturers.ts | 35 +- e2e/src/type/modules.ts | 23 +- e2e/src/type/order-details.ts | 39 +- e2e/src/type/order-status-history.ts | 37 +- e2e/src/type/orders.ts | 65 +- e2e/src/type/product-supplier.ts | 25 +- e2e/src/type/products.ts | 113 +-- e2e/src/type/shops.ts | 55 +- e2e/src/type/specific-prices.ts | 57 +- e2e/src/type/stocks.ts | 33 +- e2e/src/type/stores.ts | 39 +- e2e/src/type/suppliers.ts | 33 +- 40 files changed, 1733 insertions(+), 753 deletions(-) create mode 100644 e2e/eslint.config.mjs create mode 100644 e2e/src/job-id-validation.spec.ts delete mode 100644 e2e/src/reject-invalid-job-id.spec.ts diff --git a/.github/workflows/quality-check.yml b/.github/workflows/quality-check.yml index db0fcc83..7a3a70b7 100644 --- a/.github/workflows/quality-check.yml +++ b/.github/workflows/quality-check.yml @@ -136,3 +136,38 @@ jobs: docker compose logs cloudsync-mock prestashop docker compose down -v working-directory: e2e-env + + e2e-lint: + name: Lint E2E tests + runs-on: ubuntu-latest + timeout-minutes: 30 + if: ${{ github.event_name == 'pull_request' }} + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + + - uses: pnpm/action-setup@v3 + with: + version: latest + + - uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_BUILDER_VERSION }} + cache: "pnpm" + cache-dependency-path: e2e/pnpm-lock.yaml + + - name: Cache vendor folder + uses: actions/cache@v3 + with: + path: vendor + key: php-${{ hashFiles('composer.lock') }} + + - name: Install dependencies + run: pnpm install --no-optional --force + working-directory: e2e + + - name: Lint test files + run: pnpm lint && pnpm format + working-directory: e2e diff --git a/controllers/front/apiHealthCheck.php b/controllers/front/apiHealthCheck.php index f1c32b69..e2bef3ee 100644 --- a/controllers/front/apiHealthCheck.php +++ b/controllers/front/apiHealthCheck.php @@ -20,13 +20,11 @@ class ps_EventbusApiHealthCheckModuleFrontController extends AbstractApiControll */ public function init() { - /* try { parent::init(); } catch (UnauthorizedException $exception) { $this->isAuthentifiedCall = false; } - */ } /** diff --git a/e2e-env/README.md b/e2e-env/README.md index 19920eba..16c76601 100644 --- a/e2e-env/README.md +++ b/e2e-env/README.md @@ -47,6 +47,22 @@ Or specifically only starting PrestaShop (and its dependencies) with special com docker compose up prestashop --force-recreate --renew-anon-volumes ``` +## Testing + +Simple! + +Is the module healthy? + +```sh +curl -s "http://localhost:8000/index.php?fc=module&module=ps_eventbus&controller=apiHealthCheck&job_id=valid-job-1" | jq . +``` + +Capture orders: + +```sh +curl -s "http://localhost:8000/index.php?fc=module&module=ps_eventbus&controller=apiOrders&job_id=valid-job-1" | jq . +``` + ## Make changes to the mock If you need to make change to the mocks, they can be built and run locally using scripts in `package.json`. diff --git a/e2e/eslint.config.mjs b/e2e/eslint.config.mjs new file mode 100644 index 00000000..1eb1b43f --- /dev/null +++ b/e2e/eslint.config.mjs @@ -0,0 +1,9 @@ +// @ts-check + +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommended, +); diff --git a/e2e/package.json b/e2e/package.json index ffdae3e2..04cfaec6 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -5,25 +5,35 @@ "scripts": { "test:e2e": "jest --config=jest.config.json", "test:e2e:watch": "jest --config=jest.config.json --watchAll", - "test:e2e:detectOpenHandles": "jest --config=jest.config.json --detectOpenHandles" + "test:e2e:detectOpenHandles": "jest --config=jest.config.json --detectOpenHandles", + "lint": "eslint 'src/**/*.ts'", + "lint:fix": "eslint 'src/**/*.ts' --fix", + "format": "prettier --check ./src", + "format:fix": "prettier --write ./src", + "fix": "pnpm format:fix && pnpm lint:fix" }, "devDependencies": { + "@eslint/js": "^9.10.0", "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.12", - "@types/node": "^20.12.12", - "@types/ramda": "^0.30.0", + "@types/eslint__js": "^8.42.3", + "@types/jest": "^29.5.13", + "@types/node": "^22.5.4", + "@types/ramda": "^0.30.2", "@types/semver": "^7.5.8", - "@types/ws": "^8.5.10", - "axios": "^1.7.4", + "@types/ws": "^8.5.12", + "axios": "^1.7.7", + "eslint": "^9.10.0", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "jest-extended": "^4.0.2", "jest-mock-extended": "^3.0.7", - "ramda": "^0.30.0", + "prettier": "^3.3.3", + "ramda": "^0.30.1", "rxjs": "^7.8.1", - "ts-jest": "^29.1.2", - "typescript": "^5.4.5", - "ws": "^8.17.1" + "ts-jest": "^29.2.5", + "typescript": "^5.6.2", + "typescript-eslint": "^8.5.0", + "ws": "^8.18.0" }, "engines": { "yarn": "please use pnpm", @@ -32,6 +42,6 @@ "pnpm": ">=8" }, "dependencies": { - "semver": "^7.6.2" + "semver": "^7.6.3" } } diff --git a/e2e/pnpm-lock.yaml b/e2e/pnpm-lock.yaml index ca26a045..0c5c8010 100644 --- a/e2e/pnpm-lock.yaml +++ b/e2e/pnpm-lock.yaml @@ -9,57 +9,72 @@ importers: .: dependencies: semver: - specifier: ^7.6.2 - version: 7.6.2 + specifier: ^7.6.3 + version: 7.6.3 devDependencies: + '@eslint/js': + specifier: ^9.10.0 + version: 9.10.0 '@jest/globals': specifier: ^29.7.0 version: 29.7.0 + '@types/eslint__js': + specifier: ^8.42.3 + version: 8.42.3 '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 + specifier: ^29.5.13 + version: 29.5.13 '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^22.5.4 + version: 22.5.4 '@types/ramda': - specifier: ^0.30.0 - version: 0.30.0 + specifier: ^0.30.2 + version: 0.30.2 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.5.12 + version: 8.5.12 axios: - specifier: ^1.7.4 - version: 1.7.4 + specifier: ^1.7.7 + version: 1.7.7 + eslint: + specifier: ^9.10.0 + version: 9.10.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.12) + version: 29.7.0(@types/node@22.5.4) jest-expect-message: specifier: ^1.1.3 version: 1.1.3 jest-extended: specifier: ^4.0.2 - version: 4.0.2(jest@29.7.0(@types/node@20.12.12)) + version: 4.0.2(jest@29.7.0(@types/node@22.5.4)) jest-mock-extended: specifier: ^3.0.7 - version: 3.0.7(jest@29.7.0(@types/node@20.12.12))(typescript@5.4.5) + version: 3.0.7(jest@29.7.0(@types/node@22.5.4))(typescript@5.6.2) + prettier: + specifier: ^3.3.3 + version: 3.3.3 ramda: - specifier: ^0.30.0 - version: 0.30.0 + specifier: ^0.30.1 + version: 0.30.1 rxjs: specifier: ^7.8.1 version: 7.8.1 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.12))(typescript@5.4.5) + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.4))(typescript@5.6.2) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.6.2 + version: 5.6.2 + typescript-eslint: + specifier: ^8.5.0 + version: 8.5.0(eslint@9.10.0)(typescript@5.6.2) ws: - specifier: ^8.17.1 - version: 8.17.1 + specifier: ^8.18.0 + version: 8.18.0 packages: @@ -236,6 +251,44 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.10.0': + resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.1.0': + resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -328,6 +381,18 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -349,6 +414,15 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -361,14 +435,17 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.13': + resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/ramda@0.30.0': - resolution: {integrity: sha512-DQtfqUbSB18iM9NHbQ++kVUDuBWHMr6T2FpW1XTiksYRGjq4WnNPZLt712OEHEBJs7aMyJ68Mf2kGMOP1srVVw==} + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + + '@types/ramda@0.30.2': + resolution: {integrity: sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -376,8 +453,8 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -385,6 +462,76 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@typescript-eslint/eslint-plugin@8.5.0': + resolution: {integrity: sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.5.0': + resolution: {integrity: sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.5.0': + resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.5.0': + resolution: {integrity: sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.5.0': + resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.5.0': + resolution: {integrity: sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.5.0': + resolution: {integrity: sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.5.0': + resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -412,11 +559,17 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.7.4: - resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -449,6 +602,9 @@ packages: brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -562,6 +718,9 @@ packages: babel-plugin-macros: optional: true + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -578,6 +737,11 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} @@ -603,11 +767,57 @@ packages: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.10.0: + resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -620,12 +830,32 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -634,6 +864,17 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -674,6 +915,14 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -682,9 +931,16 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -704,6 +960,14 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -727,6 +991,10 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -735,10 +1003,18 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -770,6 +1046,11 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -924,19 +1205,35 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -945,6 +1242,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -952,9 +1253,16 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -971,6 +1279,10 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -990,6 +1302,14 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1017,6 +1337,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -1029,10 +1353,18 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1067,6 +1399,15 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1078,11 +1419,18 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - ramda@0.30.0: - resolution: {integrity: sha512-13Y0iMhIQuAm/wNGBL/9HEqIfRGmNmjKnTPlKWfA9f7dnDkr8d45wQ+S7+ZLh/Pq9PdcGxkqKUEA7ySu1QSd9Q==} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + ramda@0.30.1: + resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -1095,6 +1443,10 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1107,6 +1459,13 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -1114,8 +1473,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -1195,6 +1554,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -1206,6 +1568,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-essentials@10.0.2: resolution: {integrity: sha512-Xwag0TULqriaugXqVdDiGZ5wuZpqABZlpwQ2Ho4GDyiu/R2Xjkp/9+zcFxL7uzeLl/QCPrflnvpVYyS3ouT7Zw==} peerDependencies: @@ -1214,12 +1582,13 @@ packages: typescript: optional: true - ts-jest@29.1.2: - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -1228,6 +1597,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -1241,6 +1612,10 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -1252,13 +1627,22 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript-eslint@8.5.0: + resolution: {integrity: sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} update-browserslist-db@1.1.0: resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} @@ -1266,6 +1650,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -1278,6 +1665,10 @@ packages: engines: {node: '>= 8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1289,8 +1680,8 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -1528,6 +1919,47 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)': + dependencies: + eslint: 9.10.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.6 + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.10.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.1.0': + dependencies: + levn: 0.4.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -1541,7 +1973,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -1554,14 +1986,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.12) + jest-config: 29.7.0(@types/node@22.5.4) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1586,7 +2018,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -1604,7 +2036,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.12 + '@types/node': 22.5.4 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -1626,7 +2058,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -1696,7 +2128,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.12 + '@types/node': 22.5.4 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -1717,6 +2149,18 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + '@sinclair/typebox@0.27.8': {} '@sinonjs/commons@3.0.1': @@ -1748,9 +2192,20 @@ snapshots: dependencies: '@babel/types': 7.25.4 + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 + + '@types/estree@1.0.5': {} + '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.12.12 + '@types/node': 22.5.4 '@types/istanbul-lib-coverage@2.0.6': {} @@ -1762,16 +2217,18 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.12': + '@types/jest@29.5.13': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - '@types/node@20.12.12': + '@types/json-schema@7.0.15': {} + + '@types/node@22.5.4': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 - '@types/ramda@0.30.0': + '@types/ramda@0.30.2': dependencies: types-ramda: 0.30.1 @@ -1779,9 +2236,9 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/ws@8.5.10': + '@types/ws@8.5.12': dependencies: - '@types/node': 20.12.12 + '@types/node': 22.5.4 '@types/yargs-parser@21.0.3': {} @@ -1789,6 +2246,100 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.5.0 + eslint: 9.10.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.5.0 + debug: 4.3.6 + eslint: 9.10.0 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.5.0': + dependencies: + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/visitor-keys': 8.5.0 + + '@typescript-eslint/type-utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.5.0': {} + + '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)': + dependencies: + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/visitor-keys': 8.5.0 + debug: 4.3.6 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + eslint: 9.10.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.5.0': + dependencies: + '@typescript-eslint/types': 8.5.0 + eslint-visitor-keys: 3.4.3 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -1814,9 +2365,13 @@ snapshots: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + + async@3.2.6: {} + asynckit@0.4.0: {} - axios@1.7.4: + axios@1.7.7: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 @@ -1886,6 +2441,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -1962,13 +2521,13 @@ snapshots: convert-source-map@2.0.0: {} - create-jest@29.7.0(@types/node@20.12.12): + create-jest@29.7.0(@types/node@22.5.4): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.12) + jest-config: 29.7.0(@types/node@22.5.4) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -1989,6 +2548,8 @@ snapshots: dedent@1.5.3: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} delayed-stream@1.0.0: {} @@ -1997,6 +2558,10 @@ snapshots: diff-sequences@29.6.3: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.5.13: {} emittery@0.13.1: {} @@ -2013,8 +2578,76 @@ snapshots: escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} + + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.10.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.10.0 + '@eslint/plugin-kit': 0.1.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -2037,12 +2670,36 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2052,6 +2709,18 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + follow-redirects@1.15.6: {} form-data@4.0.0: @@ -2075,6 +2744,14 @@ snapshots: get-stream@6.0.1: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2086,8 +2763,12 @@ snapshots: globals@11.12.0: {} + globals@14.0.0: {} + graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -2100,6 +2781,13 @@ snapshots: human-signals@2.1.0: {} + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -2120,12 +2808,20 @@ snapshots: dependencies: hasown: 2.0.2 + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-stream@2.0.1: {} isexe@2.0.0: {} @@ -2148,7 +2844,7 @@ snapshots: '@babel/parser': 7.25.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -2171,6 +2867,13 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -2183,7 +2886,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -2203,16 +2906,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.12.12): + jest-cli@29.7.0(@types/node@22.5.4): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.12) + create-jest: 29.7.0(@types/node@22.5.4) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.12.12) + jest-config: 29.7.0(@types/node@22.5.4) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -2222,7 +2925,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.12.12): + jest-config@29.7.0(@types/node@22.5.4): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -2247,7 +2950,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.12.12 + '@types/node': 22.5.4 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -2276,18 +2979,18 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 jest-mock: 29.7.0 jest-util: 29.7.0 jest-expect-message@1.1.3: {} - jest-extended@4.0.2(jest@29.7.0(@types/node@20.12.12)): + jest-extended@4.0.2(jest@29.7.0(@types/node@22.5.4)): dependencies: jest-diff: 29.7.0 jest-get-type: 29.6.3 optionalDependencies: - jest: 29.7.0(@types/node@20.12.12) + jest: 29.7.0(@types/node@22.5.4) jest-get-type@29.6.3: {} @@ -2295,7 +2998,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.12.12 + '@types/node': 22.5.4 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -2331,16 +3034,16 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@3.0.7(jest@29.7.0(@types/node@20.12.12))(typescript@5.4.5): + jest-mock-extended@3.0.7(jest@29.7.0(@types/node@22.5.4))(typescript@5.6.2): dependencies: - jest: 29.7.0(@types/node@20.12.12) - ts-essentials: 10.0.2(typescript@5.4.5) - typescript: 5.4.5 + jest: 29.7.0(@types/node@22.5.4) + ts-essentials: 10.0.2(typescript@5.6.2) + typescript: 5.6.2 jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -2375,7 +3078,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -2403,7 +3106,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 cjs-module-lexer: 1.4.0 collect-v8-coverage: 1.0.2 @@ -2442,14 +3145,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -2468,7 +3171,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 22.5.4 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -2477,17 +3180,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.12.12 + '@types/node': 22.5.4 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.12.12): + jest@29.7.0(@types/node@22.5.4): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.12.12) + jest-cli: 29.7.0(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -2501,31 +3204,56 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + jsesc@2.5.2: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kleur@3.0.3: {} leven@3.1.0: {} + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lines-and-columns@1.2.4: {} locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 make-error@1.3.6: {} @@ -2535,6 +3263,8 @@ snapshots: merge-stream@2.0.0: {} + merge2@1.4.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2552,6 +3282,14 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + ms@2.1.2: {} natural-compare@1.4.0: {} @@ -2574,6 +3312,15 @@ snapshots: dependencies: mimic-fn: 2.1.0 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -2586,8 +3333,16 @@ snapshots: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-try@2.2.0: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 @@ -2613,6 +3368,10 @@ snapshots: dependencies: find-up: 4.1.0 + prelude-ls@1.2.1: {} + + prettier@3.3.3: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -2626,9 +3385,13 @@ snapshots: proxy-from-env@1.1.0: {} + punycode@2.3.1: {} + pure-rand@6.1.0: {} - ramda@0.30.0: {} + queue-microtask@1.2.3: {} + + ramda@0.30.1: {} react-is@18.3.1: {} @@ -2638,6 +3401,8 @@ snapshots: dependencies: resolve-from: 5.0.0 + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve.exports@2.0.2: {} @@ -2648,13 +3413,19 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + rxjs@7.8.1: dependencies: tslib: 2.7.0 semver@6.3.1: {} - semver@7.6.2: {} + semver@7.6.3: {} shebang-command@2.0.0: dependencies: @@ -2722,6 +3493,8 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-table@0.2.0: {} + tmpl@1.0.5: {} to-fast-properties@2.0.0: {} @@ -2730,24 +3503,30 @@ snapshots: dependencies: is-number: 7.0.0 - ts-essentials@10.0.2(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.6.2): + dependencies: + typescript: 5.6.2 + + ts-essentials@10.0.2(typescript@5.6.2): optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.2 - ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.12))(typescript@5.4.5): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.4))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.12) + jest: 29.7.0(@types/node@22.5.4) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.2 - typescript: 5.4.5 + semver: 7.6.3 + typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) @@ -2755,6 +3534,10 @@ snapshots: tslib@2.7.0: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-detect@4.0.8: {} type-fest@0.21.3: {} @@ -2763,9 +3546,20 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript@5.4.5: {} + typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - eslint + - supports-color + + typescript@5.6.2: {} - undici-types@5.26.5: {} + undici-types@6.19.8: {} update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: @@ -2773,6 +3567,10 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -2787,6 +3585,8 @@ snapshots: dependencies: isexe: 2.0.0 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2800,7 +3600,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.17.1: {} + ws@8.18.0: {} y18n@5.0.8: {} diff --git a/e2e/src/env.spec.ts b/e2e/src/env.spec.ts index 7f8dbf9b..198da23a 100644 --- a/e2e/src/env.spec.ts +++ b/e2e/src/env.spec.ts @@ -1,27 +1,33 @@ import testConfig from "./helpers/test.config"; import axios from "axios"; -import {expect} from "@jest/globals"; -import {getShopHealthCheck} from "./helpers/data-helper"; +import { expect } from "@jest/globals"; +import { getShopHealthCheck } from "./helpers/data-helper"; // This suite is designed to help troubleshoot the e2e environment by checking if some prerequisites are met. -describe('e2e setup', () => { - it('ps_eventbus should be up and ready', async () => { - const healthCheck = await getShopHealthCheck({cache: false}); +describe("e2e setup", () => { + it("ps_eventbus should be up and ready", async () => { + const healthCheck = await getShopHealthCheck({ cache: false }); expect(healthCheck.ps_eventbus).toEqual(true); }); - it('Collector mock should be up and ready', async () => { - const res = await axios.get(`${testConfig.mockBaseUrl}${testConfig.mockCollectorPath}/healthcheck`) - expect(res.data.mock).toEqual('CollectorApiServer') + it("Collector mock should be up and ready", async () => { + const res = await axios.get( + `${testConfig.mockBaseUrl}${testConfig.mockCollectorPath}/healthcheck`, + ); + expect(res.data.mock).toEqual("CollectorApiServer"); }); - it('Live Sync Api mock should be up and ready', async () => { - const res = await axios.get(`${testConfig.mockBaseUrl}${testConfig.mockLiveSyncApiPath}/healthcheck`) - expect(res.data.mock).toEqual('LiveSyncApiServer') + it("Live Sync Api mock should be up and ready", async () => { + const res = await axios.get( + `${testConfig.mockBaseUrl}${testConfig.mockLiveSyncApiPath}/healthcheck`, + ); + expect(res.data.mock).toEqual("LiveSyncApiServer"); }); - it('Sync Api mock should be up and ready', async () => { - const res = await axios.get(`${testConfig.mockBaseUrl}${testConfig.mockSyncApiPath}/healthcheck`) - expect(res.data.mock).toEqual('SyncApiServer') + it("Sync Api mock should be up and ready", async () => { + const res = await axios.get( + `${testConfig.mockBaseUrl}${testConfig.mockSyncApiPath}/healthcheck`, + ); + expect(res.data.mock).toEqual("SyncApiServer"); }); -}) +}); diff --git a/e2e/src/full-sync.spec.ts b/e2e/src/full-sync.spec.ts index de6db3d0..2c35aaac 100644 --- a/e2e/src/full-sync.spec.ts +++ b/e2e/src/full-sync.spec.ts @@ -33,28 +33,28 @@ const isString = (val) => const isNumber = (val) => val ? expect(val).toBeNumber() : expect(val).toBeNull(); const specialFieldAssert: { [index: string]: (val) => void } = { - 'created_at': isDateString, - 'updated_at': isDateString, - 'last_connection_date': isDateString, - 'folder_created_at': isDateString, - 'date_add': isDateString, - 'from': isDateString, - 'to': isDateString, - 'conversion_rate': isNumber, - 'cms_version': isString, - 'module_id': isString, - 'module_version': isString, - 'theme_version': isString, - 'php_version': isString, - 'http_server' : isString, -} - -describe('Full Sync', () => { + created_at: isDateString, + updated_at: isDateString, + last_connection_date: isDateString, + folder_created_at: isDateString, + date_add: isDateString, + from: isDateString, + to: isDateString, + conversion_rate: isNumber, + cms_version: isString, + module_id: isString, + module_version: isString, + theme_version: isString, + php_version: isString, + http_server: isString, +}; + +describe("Full Sync", () => { let testIndex = 0; // gérer les cas ou un shopContent n'existe pas (pas de fixture du coup) const controllers: Controller[] = controllerList.filter( - (it) => !EXCLUDED_API.includes(it) + (it) => !EXCLUDED_API.includes(it), ); let jobId: string; @@ -76,14 +76,14 @@ describe('Full Sync', () => { // arrange const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&full=1&job_id=${jobId}`; - const callId = { 'call_id': Math.random().toString(36).substring(2, 11) }; + const callId = { call_id: Math.random().toString(36).substring(2, 11) }; // act const response = await axios .post(url, callId, { - headers: { + headers: { Host: testConfig.prestaShopHostHeader, - 'Content-Type': 'application/x-www-form-urlencoded' // for compat PHP 5.6 + "Content-Type": "application/x-www-form-urlencoded", // for compat PHP 5.6 }, }) .catch((err) => { @@ -103,14 +103,14 @@ describe('Full Sync', () => { // arrange const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&full=1&job_id=${jobId}`; - const callId = { 'call_id': Math.random().toString(36).substring(2, 11) }; + const callId = { call_id: Math.random().toString(36).substring(2, 11) }; // act const response = await axios .post(url, callId, { headers: { Host: testConfig.prestaShopHostHeader, - 'Content-Type': 'application/x-www-form-urlencoded' // for compat PHP 5.6 + "Content-Type": "application/x-www-form-urlencoded", // for compat PHP 5.6 }, }) .catch((err) => { @@ -136,16 +136,16 @@ describe('Full Sync', () => { const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&full=1&job_id=${jobId}`; const message$ = probe({ url: `/upload/${jobId}` }); - const callId = { 'call_id': Math.random().toString(36).substring(2, 11) }; + const callId = { call_id: Math.random().toString(36).substring(2, 11) }; // act const request$ = from( axios.post(url, callId, { headers: { Host: testConfig.prestaShopHostHeader, - 'Content-Type': 'application/x-www-form-urlencoded' // for compat PHP 5.6 + "Content-Type": "application/x-www-form-urlencoded", // for compat PHP 5.6 }, - }) + }), ); const results = await lastValueFrom( @@ -154,8 +154,8 @@ describe('Full Sync', () => { probeMessage: result[0], psEventbusReq: result[1], })), - toArray() - ) + toArray(), + ), ); // assert @@ -166,13 +166,11 @@ describe('Full Sync', () => { }); }); } - if (MISSING_TEST_DATA.includes(controller)) { it.skip(`${controller} should upload complete dataset to collector`, () => {}); } else { it(`${controller} should upload complete dataset collector`, async () => { - // arrange const fullSync$ = doFullSync(jobId, controller, { timeout: 4000 }); const message$ = probe({ url: `/upload/${jobId}` }, { timeout: 4000 }); @@ -184,8 +182,8 @@ describe('Full Sync', () => { concatMap((syncedPage) => { return from(syncedPage); }), - toArray() - ) + toArray(), + ), ); // dump data for easier debugging or updating fixtures @@ -204,12 +202,12 @@ describe('Full Sync', () => { } processedData = omitProperties( processedData, - Object.keys(specialFieldAssert) + Object.keys(specialFieldAssert), ); processedData = sortUploadData(processedData); processedFixture = omitProperties( processedFixture, - Object.keys(specialFieldAssert) + Object.keys(specialFieldAssert), ); processedFixture = sortUploadData(processedFixture); @@ -221,7 +219,7 @@ describe('Full Sync', () => { for (const specialFieldName of Object.keys(specialFieldAssert)) { if (data.properties[specialFieldName] !== undefined) { specialFieldAssert[specialFieldName]( - data.properties[specialFieldName] + data.properties[specialFieldName], ); } } diff --git a/e2e/src/helpers/controllers.ts b/e2e/src/helpers/controllers.ts index 73103286..919183aa 100644 --- a/e2e/src/helpers/controllers.ts +++ b/e2e/src/helpers/controllers.ts @@ -1,47 +1,47 @@ import R from "ramda"; export const contentControllerMapping = { - 'carriers': 'apiCarriers', - 'carrier_details': 'apiCarriers', - 'carts' : 'apiCarts', - 'cart_products': 'apiCarts', - 'cart_rules' : 'apiCartRules', - 'categories' : 'apiCategories', - 'currencies' : 'apiCurrencies', - 'specific_prices': 'apiSpecificPrices', - 'custom_product_carriers' : 'apiCustomProductCarriers', - 'customers': 'apiCustomers', - 'taxonomies': 'apiGoogleTaxonomies', - 'modules': 'apiModules', - 'orders': 'apiOrders', - 'order_details': 'apiOrders', - 'order_status_history': 'apiOrders', - 'order_cart_rules': 'apiOrders', - 'products': 'apiProducts', - 'shops': 'apiInfo', - 'stores': 'apiStores', - 'themes': 'apiThemes', - 'bundles': 'apiProducts', - 'wishlists': 'apiWishlists', - 'wishlist_products': 'apiWishlists', - 'stocks': 'apiStocks', - 'stock_movements': 'apiStocks', - 'manufacturers': 'apiManufacturers', - 'suppliers': 'apiSuppliers', - 'product_suppliers': 'apiProducts', - 'languages': 'apiLanguages', - 'employees': 'apiEmployees', - 'translations': 'apiTranslations', - 'images': 'apiImages', - 'image_types': 'apiImageTypes' + carriers: "apiCarriers", + carrier_details: "apiCarriers", + carts: "apiCarts", + cart_products: "apiCarts", + cart_rules: "apiCartRules", + categories: "apiCategories", + currencies: "apiCurrencies", + specific_prices: "apiSpecificPrices", + custom_product_carriers: "apiCustomProductCarriers", + customers: "apiCustomers", + taxonomies: "apiGoogleTaxonomies", + modules: "apiModules", + orders: "apiOrders", + order_details: "apiOrders", + order_status_history: "apiOrders", + order_cart_rules: "apiOrders", + products: "apiProducts", + shops: "apiInfo", + stores: "apiStores", + themes: "apiThemes", + bundles: "apiProducts", + wishlists: "apiWishlists", + wishlist_products: "apiWishlists", + stocks: "apiStocks", + stock_movements: "apiStocks", + manufacturers: "apiManufacturers", + suppliers: "apiSuppliers", + product_suppliers: "apiProducts", + languages: "apiLanguages", + employees: "apiEmployees", + translations: "apiTranslations", + images: "apiImages", + image_types: "apiImageTypes", } as const; type ContentControllerMapping = typeof contentControllerMapping; export type Content = keyof ContentControllerMapping; -export const contentList = Object.keys(contentControllerMapping) as Content[]; +export const contentList = Object.keys(contentControllerMapping) as Content[]; export type Controller = ContentControllerMapping[Content]; -export const controllerList = R.uniq(Object.values(contentControllerMapping)) as Controller[]; - - +export const controllerList = R.uniq( + Object.values(contentControllerMapping), +) as Controller[]; diff --git a/e2e/src/helpers/data-helper.ts b/e2e/src/helpers/data-helper.ts index 3e08261c..5c6964ff 100644 --- a/e2e/src/helpers/data-helper.ts +++ b/e2e/src/helpers/data-helper.ts @@ -12,10 +12,10 @@ import semver from "semver"; * @param data ps_eventbus upload data */ export const sortUploadData: ( - data: PsEventbusSyncUpload[] + data: PsEventbusSyncUpload[], ) => PsEventbusSyncUpload[] = R.pipe( R.sortBy(R.prop("collection")), - R.sortBy(R.prop("id")) + R.sortBy(R.prop("id")), ); /** @@ -24,14 +24,14 @@ export const sortUploadData: ( * @param data */ export function generatePredictableModuleId( - data: PsEventbusSyncUpload[] + data: PsEventbusSyncUpload[], ): PsEventbusSyncUpload[] { return data.map((it) => ({ ...it, id: `${it.properties.name}` })); } export function omitProperties( data: PsEventbusSyncUpload[], - omitFields: string[] + omitFields: string[], ): PsEventbusSyncUpload[] { return data.map((it) => ({ ...it, @@ -56,7 +56,7 @@ export async function getShopHealthCheck(options?: { healthCheck = cachedHealthCheck; } else { const res = await axios.get( - `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=apiHealthCheck&job_id=valid-job-healthcheck` + `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=apiHealthCheck&job_id=valid-job-healthcheck`, ); healthCheck = res.data; cachedHealthCheck = healthCheck; @@ -67,37 +67,39 @@ export async function getShopHealthCheck(options?: { const FIXTURE_DIR = "./src/fixtures"; export async function loadFixture( - controller: Controller + controller: Controller, ): Promise { const contents = getControllerContent(controller); const shopVersion = (await getShopHealthCheck()).prestashop_version; const shopSemver = semver.coerce(shopVersion); const fixture = []; - const fixtureVersions = await fs.promises.readdir( - `${FIXTURE_DIR}`, - {encoding: 'utf-8', withFileTypes: true} - ) + const fixtureVersions = await fs.promises.readdir(`${FIXTURE_DIR}`, { + encoding: "utf-8", + withFileTypes: true, + }); // use either fixture specific to PS version or latest fixture const matchingFixtures = fixtureVersions - .filter(version => version.isDirectory()) - .map(version => version.name) - .filter(fixtureDir => semver.satisfies(shopSemver, fixtureDir)); + .filter((version) => version.isDirectory()) + .map((version) => version.name) + .filter((fixtureDir) => semver.satisfies(shopSemver, fixtureDir)); - let useFixture = 'latest'; + let useFixture = "latest"; - if(matchingFixtures.length > 1) { - throw new Error(`More than one fixture matches prestashop version ${shopVersion} : ${JSON.stringify(useFixture)}`) - } else if(matchingFixtures.length === 1) { + if (matchingFixtures.length > 1) { + throw new Error( + `More than one fixture matches prestashop version ${shopVersion} : ${JSON.stringify(useFixture)}`, + ); + } else if (matchingFixtures.length === 1) { useFixture = matchingFixtures[0]; } const files = contents.map((content) => fs.promises.readFile( `${FIXTURE_DIR}/${useFixture}/${controller}/${content}.json`, - "utf-8" - ) + "utf-8", + ), ); for await (const file of files) { diff --git a/e2e/src/helpers/log-helper.ts b/e2e/src/helpers/log-helper.ts index f359289a..8baf908b 100644 --- a/e2e/src/helpers/log-helper.ts +++ b/e2e/src/helpers/log-helper.ts @@ -1,24 +1,29 @@ -import axios, {AxiosError} from "axios"; +import { AxiosError } from "axios"; import R from "ramda"; import fs from "fs"; import testConfig from "./test.config"; -import {PsEventbusSyncUpload} from "./mock-probe"; -import {getShopHealthCheck} from "./data-helper"; +import { PsEventbusSyncUpload } from "./mock-probe"; +import { getShopHealthCheck } from "./data-helper"; export function logAxiosError(err: Error) { - if(err instanceof AxiosError) { - console.log(R.pick(['status', 'statusText' ,'data',], err.response)) + if (err instanceof AxiosError) { + console.log(R.pick(["status", "statusText", "data"], err.response)); } } -export async function dumpUploadData(data: PsEventbusSyncUpload[], filename: string) { +export async function dumpUploadData( + data: PsEventbusSyncUpload[], + filename: string, +) { const shopVersion = (await getShopHealthCheck()).prestashop_version; const dir = `./dumps/${testConfig.testRunTime}/${shopVersion}/${filename}`; - await fs.promises.mkdir(dir, {recursive: true}); - const groupedData = R.groupBy( el => el.collection, data ) - const files = Object.keys(groupedData).map(collection => { - return fs.promises.writeFile(`${dir}/${collection}.json`, - JSON.stringify(groupedData[collection], null, 2) + '\n'); - }) + await fs.promises.mkdir(dir, { recursive: true }); + const groupedData = R.groupBy((el) => el.collection, data); + const files = Object.keys(groupedData).map((collection) => { + return fs.promises.writeFile( + `${dir}/${collection}.json`, + JSON.stringify(groupedData[collection], null, 2) + "\n", + ); + }); await Promise.all(files); } diff --git a/e2e/src/helpers/mock-probe.ts b/e2e/src/helpers/mock-probe.ts index eb9d66c4..a412acf3 100644 --- a/e2e/src/helpers/mock-probe.ts +++ b/e2e/src/helpers/mock-probe.ts @@ -1,23 +1,13 @@ -import WebSocket from 'ws'; -import {WebSocketSubject} from "rxjs/webSocket"; -import { - EMPTY, - expand, - filter, firstValueFrom, - from, - map, - Observable, take, - tap, throwIfEmpty, - timeout -} from "rxjs"; -import R from 'ramda'; +import WebSocket from "ws"; +import { WebSocketSubject } from "rxjs/webSocket"; +import { EMPTY, expand, filter, from, map, Observable, timeout } from "rxjs"; +import R from "ramda"; import testConfig from "./test.config"; import axios from "axios"; -import {Controller} from "./controllers"; -import {anyBoolean} from "jest-mock-extended"; +import { Controller } from "./controllers"; const DEFAULT_OPTIONS = { - timeout: 3000 + timeout: 3000, }; export type MockProbeOptions = typeof DEFAULT_OPTIONS; @@ -25,82 +15,96 @@ export type MockClientOptions = typeof DEFAULT_OPTIONS; // no Websocket implementation seems to exist in jest runner if (!global.WebSocket) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any (global as any).WebSocket = WebSocket; } let wsConnection: Observable = null; function getProbeSocket(): Observable { if (!wsConnection) { - wsConnection = new WebSocketSubject('ws://localhost:8080'); + wsConnection = new WebSocketSubject( + "ws://localhost:8080", + ); } return wsConnection; } export type MockProbeResponse = { - apiName: string, - method: string, - headers: Record, - url: string, - query: Record, - params: Record, - body: Record & { file: any[] } -} + apiName: string; + method: string; + headers: Record; + url: string; + query: Record; + params: Record; + body: Record & { file: unknown[] }; +}; -export function probe(match?: Partial, options?: MockProbeOptions): Observable { +export function probe( + match?: Partial, + options?: MockProbeOptions, +): Observable { options = R.mergeLeft(options, DEFAULT_OPTIONS); const socket = getProbeSocket(); return socket.pipe( - filter(message => match ? R.whereEq(match, message) : true), + filter((message) => (match ? R.whereEq(match, message) : true)), timeout(options.timeout), - ) + ); } export type PsEventbusSyncResponse = { - job_id: string, - object_type: string, - syncType: string, // 'full' | 'incremental' - total_objects: number, // may not always be accurate, can't be relied on - has_remaining_objects: boolean, // reliable - remaining_objects: number, // may not always be accurate, can't be relied on - md5: string, - status: boolean, - httpCode: number, - body: unknown, // not sure what this is - upload_url: string, -} + job_id: string; + object_type: string; + syncType: string; // 'full' | 'incremental' + total_objects: number; // may not always be accurate, can't be relied on + has_remaining_objects: boolean; // reliable + remaining_objects: number; // may not always be accurate, can't be relied on + md5: string; + status: boolean; + httpCode: number; + body: unknown; // not sure what this is + upload_url: string; +}; // TODO define collection as type literal -export type Collection = string +export type Collection = string; export type PsEventbusSyncUpload = { - collection: Collection, id: string, properties: any -} + collection: Collection; + id: string; + properties: unknown; +}; -export function doFullSync(jobId: string, controller: Controller, options?: MockClientOptions): Observable { +export function doFullSync( + jobId: string, + controller: Controller, + options?: MockClientOptions, +): Observable { options = R.mergeLeft(options, DEFAULT_OPTIONS); - - const callId = { 'call_id': Math.random().toString(36).substring(2, 11) }; - const requestNext = (full: number) => axios.post( - `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&full=${full}&job_id=${jobId}`, - callId, - { - headers: { - 'Host': testConfig.prestaShopHostHeader, - 'Content-Type': 'application/x-www-form-urlencoded' // for compat PHP 5.6 - } - }); + const callId = { call_id: Math.random().toString(36).substring(2, 11) }; + + const requestNext = (full: number) => + axios.post( + `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&full=${full}&job_id=${jobId}`, + callId, + { + headers: { + Host: testConfig.prestaShopHostHeader, + "Content-Type": "application/x-www-form-urlencoded", // for compat PHP 5.6 + }, + }, + ); return from(requestNext(1)).pipe( - expand(response => { + expand((response) => { if (response.data.has_remaining_objects) { return from(requestNext(0)); } else { - return EMPTY + return EMPTY; } }), timeout(options.timeout), - map(response => response.data) - ) + map((response) => response.data), + ); } diff --git a/e2e/src/helpers/test.config.ts b/e2e/src/helpers/test.config.ts index 7421d225..f5e281da 100644 --- a/e2e/src/helpers/test.config.ts +++ b/e2e/src/helpers/test.config.ts @@ -1,23 +1,22 @@ export default { // client test configuration prestashopUrl: - process.env.RUN_IN_DOCKER === '1' - ? 'http://prestashop' - : 'http://localhost:8000', - prestaShopHostHeader: 'localhost:8000', + process.env.RUN_IN_DOCKER === "1" + ? "http://prestashop" + : "http://localhost:8000", + prestaShopHostHeader: "localhost:8000", mockBaseUrl: - process.env.RUN_IN_DOCKER === '1' - ? 'http://reverse-proxy' - : 'http://localhost:3030', + process.env.RUN_IN_DOCKER === "1" + ? "http://reverse-proxy" + : "http://localhost:3030", - mockProbePath: '/mock-probe', - mockSyncApiPath: '/sync/v1', - mockCollectorPath: '/collector/v1', - mockLiveSyncApiPath: '/live-sync-api/v1', + mockProbePath: "/mock-probe", + mockSyncApiPath: "/sync/v1", + mockCollectorPath: "/collector/v1", + mockLiveSyncApiPath: "/live-sync-api/v1", - dumpFullSyncData: - process.env.RUN_IN_DOCKER !== '1', + dumpFullSyncData: process.env.RUN_IN_DOCKER !== "1", testRunTime: new Date().toISOString(), }; diff --git a/e2e/src/job-id-validation.spec.ts b/e2e/src/job-id-validation.spec.ts new file mode 100644 index 00000000..2fa5fff3 --- /dev/null +++ b/e2e/src/job-id-validation.spec.ts @@ -0,0 +1,128 @@ +import testConfig from "./helpers/test.config"; +import { beforeEach, describe, expect } from "@jest/globals"; +import axios from "axios"; +import { from, lastValueFrom, map, toArray, zip } from "rxjs"; +import { probe } from "./helpers/mock-probe"; +import { Controller, controllerList } from "./helpers/controllers"; + +describe("Reject invalid job-id", () => { + let testIndex = 0; + + const controllers: Controller[] = controllerList; + + let jobId: string; + + describe("healthcheck endpoint", () => { + it(`should return an authentified payload with an valid job-id`, async () => { + // arrange + const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=apiHealthCheck&job_id=valid-job-1`; + + //act + const res = await axios.get(url, { + headers: { Host: testConfig.prestaShopHostHeader }, + }); + + // assert + expect(res.status).toEqual(200); + expect(res.headers).toMatchObject({ + "content-type": /json/, + }); + expect(res.data).toMatchObject({ + httpCode: 200, + shop_id: "f07181f7-2399-406d-9226-4b6c14cf6068", + is_valid_jwt: true, + ps_account: true, + ps_eventbus: true, + php_version: "8.1.29", + prestashop_version: "8.1.7", + ps_accounts_version: "7.0.2", + ps_eventbus_version: "0.0.0", + env: { + EVENT_BUS_LIVE_SYNC_API_URL: "http://reverse-proxy/live-sync-api/v1", + EVENT_BUS_PROXY_API_URL: "http://reverse-proxy/collector", + EVENT_BUS_SYNC_API_URL: "http://reverse-proxy/sync-api", + }, + }); + }); + + it(`should return a minimal dataset with an invalid job`, async () => { + // arrange + const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=apiHealthCheck&job_id=invalid-job`; + + //act + const res = await axios.get(url, { + headers: { Host: testConfig.prestaShopHostHeader }, + }); + + // assert + expect(res.status).toEqual(200); + expect(res.headers).toMatchObject({ + "content-type": /json/, + }); + expect(res.data).toMatchObject({ + httpCode: 200, + is_valid_jwt: true, + ps_account: true, + ps_eventbus: true, + env: { + EVENT_BUS_LIVE_SYNC_API_URL: "http://reverse-proxy/live-sync-api/v1", + EVENT_BUS_PROXY_API_URL: "http://reverse-proxy/collector", + EVENT_BUS_SYNC_API_URL: "http://reverse-proxy/sync-api", + }, + }); + }); + }); + + describe("data endpoints", () => { + beforeEach(() => { + jobId = `invalid-job-id-${testIndex++}`; + }); + + it.each(controllers)( + `%s should return 454 with an invalid job id (sync-api status 454)`, + async (controller) => { + expect.assertions(6); + // arrange + const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&job_id=${jobId}`; + const message$ = probe({ params: { id: jobId } }); + + //act + const request$ = from( + axios + .get(url, { + headers: { Host: testConfig.prestaShopHostHeader }, + }) + .then((res) => { + expect(res).toBeNull(); // fail test + }) + .catch((err) => { + return err.response; + }), + ); + + const results = await lastValueFrom( + zip(message$, request$).pipe( + map((result) => ({ + probeMessage: result[0], + psEventbusReq: result[1], + })), + toArray(), + ), + ); + + // assert + expect(results.length).toEqual(1); + expect(results[0].probeMessage.method).toBe("GET"); + expect(results[0].probeMessage.url.split("/")).toContain(jobId); + expect(results[0].psEventbusReq.status).toEqual(454); + expect(results[0].psEventbusReq.headers).toMatchObject({ + "content-type": /json/, + }); + expect(results[0].psEventbusReq.data).toMatchObject({ + status: false, + httpCode: 454, + }); + }, + ); + }); +}); diff --git a/e2e/src/reject-invalid-job-id.spec.ts b/e2e/src/reject-invalid-job-id.spec.ts deleted file mode 100644 index 9a15dc99..00000000 --- a/e2e/src/reject-invalid-job-id.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import testConfig from './helpers/test.config'; -import {beforeEach, describe, expect} from "@jest/globals"; -import axios from "axios"; -import {from, lastValueFrom, map, toArray, zip} from "rxjs"; -import {probe} from "./helpers/mock-probe"; -import {Controller, controllerList} from "./helpers/controllers"; - -describe('Reject invalid job-id', () => { - let testIndex = 0; - - const controllers: Controller[] = controllerList - - let jobId: string; - - beforeEach(() => { - jobId = `invalid-job-id-${testIndex++}` - }); - - it.each(controllers)(`%s should return 454 with an invalid job id (sync-api status 454)`, async (controller) => { - expect.assertions(6); - // arrange - const url = `${testConfig.prestashopUrl}/index.php?fc=module&module=ps_eventbus&controller=${controller}&limit=5&job_id=${jobId}` - const message$ = probe({params: {id: jobId}}); - - //act - const request$ = from(axios.get(url, { - headers: {'Host': testConfig.prestaShopHostHeader} - }).then(res => { - expect(res).toBeNull(); // fail test - }).catch(err => { - return err.response; - })) - - const results = await lastValueFrom(zip(message$, request$) - .pipe(map(result => ({ - probeMessage: result[0], - psEventbusReq: result[1], - })), - toArray())); - - // assert - expect(results.length).toEqual(1); - expect(results[0].probeMessage.method).toBe('GET'); - expect(results[0].probeMessage.url.split('/')).toContain(jobId); - expect(results[0].psEventbusReq.status).toEqual(454); - expect(results[0].psEventbusReq.headers).toMatchObject({'content-type': /json/}); - expect(results[0].psEventbusReq.data).toMatchObject({ - status: false, - httpCode: 454, - }); - } - ); -}) diff --git a/e2e/src/type/bundles.ts b/e2e/src/type/bundles.ts index dbadecaa..33cb39e6 100644 --- a/e2e/src/type/bundles.ts +++ b/e2e/src/type/bundles.ts @@ -1,16 +1,17 @@ import fixture from "../fixtures/latest/apiProducts/bundles.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Bundles[] = fixture; export type Bundles = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_bundle: number, - id_product: number, - id_product_attribute: number, - unique_product_id: string, - quantity: number - } -} + id_bundle: number; + id_product: number; + id_product_attribute: number; + unique_product_id: string; + quantity: number; + }; +}; diff --git a/e2e/src/type/carrier-details.ts b/e2e/src/type/carrier-details.ts index f6f6d4d8..36e5361c 100644 --- a/e2e/src/type/carrier-details.ts +++ b/e2e/src/type/carrier-details.ts @@ -1,6 +1,7 @@ -import fixture from "../fixtures/latest/apiCarriers/carrier_details.json" +import fixture from "../fixtures/latest/apiCarriers/carrier_details.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: CarrierDetails[] = fixture; export type CarrierDetails = { @@ -17,5 +18,5 @@ export type CarrierDetails = { price: number; shipping_method: string; state_ids: string; - } -} + }; +}; diff --git a/e2e/src/type/carriers.ts b/e2e/src/type/carriers.ts index 141ac727..13923fde 100644 --- a/e2e/src/type/carriers.ts +++ b/e2e/src/type/carriers.ts @@ -1,6 +1,7 @@ import fixture from "../fixtures/latest/apiCarriers/carriers.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Carriers[] = fixture; export type Carriers = { @@ -31,5 +32,5 @@ export type Carriers = { shipping_handling: number; url: string; weight_unit: string; - } -} + }; +}; diff --git a/e2e/src/type/cart-products.ts b/e2e/src/type/cart-products.ts index 47458904..afc0f7fd 100644 --- a/e2e/src/type/cart-products.ts +++ b/e2e/src/type/cart-products.ts @@ -1,17 +1,18 @@ -import fixture from "../fixtures/latest/apiCarts/cart_products.json" +import fixture from "../fixtures/latest/apiCarts/cart_products.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: CartProducts[] = fixture; export type CartProducts = { - id: string, - collection: string, + id: string; + collection: string; properties: { - id_cart: string, - id_product: string, - id_product_attribute: string, - quantity: number, - created_at?: string, - id_cart_product: string - } -} + id_cart: string; + id_product: string; + id_product_attribute: string; + quantity: number; + created_at?: string; + id_cart_product: string; + }; +}; diff --git a/e2e/src/type/carts.ts b/e2e/src/type/carts.ts index f93d9f8a..4f47ef31 100644 --- a/e2e/src/type/carts.ts +++ b/e2e/src/type/carts.ts @@ -1,14 +1,15 @@ -import fixture from "../fixtures/latest/apiCarts/carts.json" +import fixture from "../fixtures/latest/apiCarts/carts.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Carts[] = fixture; export type Carts = { - id: string, - collection: string, + id: string; + collection: string; properties: { - id_cart: string, - created_at: string, - updated_at: string - } -} + id_cart: string; + created_at: string; + updated_at: string; + }; +}; diff --git a/e2e/src/type/categories.ts b/e2e/src/type/categories.ts index 3ff7d3c1..49dbca50 100644 --- a/e2e/src/type/categories.ts +++ b/e2e/src/type/categories.ts @@ -1,6 +1,7 @@ -import fixture from "../fixtures/latest/apiCategories/categories.json" +import fixture from "../fixtures/latest/apiCategories/categories.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Categories[] = fixture; export type Categories = { @@ -19,5 +20,5 @@ export type Categories = { name: string; unique_category_id: string; updated_at: string; - } -} + }; +}; diff --git a/e2e/src/type/currency.ts b/e2e/src/type/currency.ts index 1dc2dd85..22e4092e 100644 --- a/e2e/src/type/currency.ts +++ b/e2e/src/type/currency.ts @@ -1,19 +1,19 @@ -import fixture from "../fixtures/latest/apiCurrencies/currencies.json" +import fixture from "../fixtures/latest/apiCurrencies/currencies.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Currencies[] = fixture; export type Currencies = { - id: number, - collection: string, + id: number; + collection: string; properties: { - active: boolean, - conversion_rate: number, - deleted: boolean, - id_currency: number, - iso_code: string, - name: string, - precision: number - } -} - + active: boolean; + conversion_rate: number; + deleted: boolean; + id_currency: number; + iso_code: string; + name: string; + precision: number; + }; +}; diff --git a/e2e/src/type/customers.ts b/e2e/src/type/customers.ts index 534c3b9e..5a18e57c 100644 --- a/e2e/src/type/customers.ts +++ b/e2e/src/type/customers.ts @@ -1,22 +1,23 @@ -import fixture from "../fixtures/latest/apiCustomers/customers.json" +import fixture from "../fixtures/latest/apiCustomers/customers.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Customers[] = fixture; export type Customers = { - id: string, - collection: string, + id: string; + collection: string; properties: { - active: boolean, - created_at: string, - deleted: boolean, - email_hash: string, - id_customer: number, - id_lang: number, - is_guest: boolean, - newsletter: boolean, - newsletter_date_add?: string, - optin: boolean, - updated_at: string - } -} + active: boolean; + created_at: string; + deleted: boolean; + email_hash: string; + id_customer: number; + id_lang: number; + is_guest: boolean; + newsletter: boolean; + newsletter_date_add?: string; + optin: boolean; + updated_at: string; + }; +}; diff --git a/e2e/src/type/employees.ts b/e2e/src/type/employees.ts index a37bc1ca..f347f00b 100644 --- a/e2e/src/type/employees.ts +++ b/e2e/src/type/employees.ts @@ -1,6 +1,7 @@ -import fixture from '../fixtures/latest/apiEmployees/employees.json' +import fixture from "../fixtures/latest/apiEmployees/employees.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Employees[] = fixture; export type Employees = { @@ -25,5 +26,5 @@ export type Employees = { id_shop: number; last_connection_date?: string; optin: boolean; - } -} + }; +}; diff --git a/e2e/src/type/health-check.ts b/e2e/src/type/health-check.ts index 4027b4cc..e2825949 100644 --- a/e2e/src/type/health-check.ts +++ b/e2e/src/type/health-check.ts @@ -1,16 +1,16 @@ export type HealthCheck = { - "prestashop_version"?: string, - "ps_eventbus_version"?: string, - "ps_accounts_version"?: string, - "php_version"?: string, - "shop_id"?: string, - "ps_account": boolean, - "is_valid_jwt": boolean, - "ps_eventbus": boolean, - "env": { - "EVENT_BUS_PROXY_API_URL": string, - "EVENT_BUS_SYNC_API_URL": string, - "EVENT_BUS_LIVE_SYNC_API_URL": string - }, - "httpCode": number -} + prestashop_version?: string; + ps_eventbus_version?: string; + ps_accounts_version?: string; + php_version?: string; + shop_id?: string; + ps_account: boolean; + is_valid_jwt: boolean; + ps_eventbus: boolean; + env: { + EVENT_BUS_PROXY_API_URL: string; + EVENT_BUS_SYNC_API_URL: string; + EVENT_BUS_LIVE_SYNC_API_URL: string; + }; + httpCode: number; +}; diff --git a/e2e/src/type/image-type.ts b/e2e/src/type/image-type.ts index 4fab6030..19640032 100644 --- a/e2e/src/type/image-type.ts +++ b/e2e/src/type/image-type.ts @@ -1,20 +1,21 @@ -import fixture from '../fixtures/latest/apiImageTypes/image_types.json' +import fixture from "../fixtures/latest/apiImageTypes/image_types.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: ImageType[] = fixture; export type ImageType = { - id: string, - collection: string, + id: string; + collection: string; properties: { - id_image_type: number, - name: string, - width: number, - height: number, - products: boolean, - categories: boolean, - manufacturers: boolean, - suppliers: boolean, - stores: boolean - } -} + id_image_type: number; + name: string; + width: number; + height: number; + products: boolean; + categories: boolean; + manufacturers: boolean; + suppliers: boolean; + stores: boolean; + }; +}; diff --git a/e2e/src/type/images.ts b/e2e/src/type/images.ts index fa8d0d00..b6b5cfe1 100644 --- a/e2e/src/type/images.ts +++ b/e2e/src/type/images.ts @@ -1,18 +1,19 @@ -import fixture from '../fixtures/latest/apiImages/images.json' +import fixture from "../fixtures/latest/apiImages/images.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Images[] = fixture; export type Images = { - "id": string, - "collection": string, - "properties": { - "id_image": number, - "id_product": number, - "position": number, - "cover": boolean, - "id_lang": number, - "legend": string, - "id_shop": number - } -} + id: string; + collection: string; + properties: { + id_image: number; + id_product: number; + position: number; + cover: boolean; + id_lang: number; + legend: string; + id_shop: number; + }; +}; diff --git a/e2e/src/type/languages.ts b/e2e/src/type/languages.ts index 660ba9e4..be4c493d 100644 --- a/e2e/src/type/languages.ts +++ b/e2e/src/type/languages.ts @@ -1,23 +1,24 @@ -import fixture from '../fixtures/latest/apiLanguages/languages.json' +import fixture from "../fixtures/latest/apiLanguages/languages.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Languages[] = fixture; export type Languages = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_lang: number, - name: string, - active: boolean, - iso_code: string, - language_code: string, - locale: string, - date_format_lite: string, - date_format_full: string, - is_rtl: boolean, - id_shop: number, - created_at?: string, - updated_at?: string - } -} + id_lang: number; + name: string; + active: boolean; + iso_code: string; + language_code: string; + locale: string; + date_format_lite: string; + date_format_full: string; + is_rtl: boolean; + id_shop: number; + created_at?: string; + updated_at?: string; + }; +}; diff --git a/e2e/src/type/manufacturers.ts b/e2e/src/type/manufacturers.ts index 4f1fafaa..3b32664f 100644 --- a/e2e/src/type/manufacturers.ts +++ b/e2e/src/type/manufacturers.ts @@ -1,23 +1,24 @@ -import fixture from '../fixtures/latest/apiManufacturers/manufacturers.json' +import fixture from "../fixtures/latest/apiManufacturers/manufacturers.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Manufacturers[] = fixture; export type Manufacturers = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_manufacturer: number, - name: string, - created_at: string, - updated_at: string, - active: boolean, - id_lang: number, - description: string - short_description: string, - meta_title: string, - meta_keywords: string, - meta_description: string, - id_shop: number - } -} + id_manufacturer: number; + name: string; + created_at: string; + updated_at: string; + active: boolean; + id_lang: number; + description: string; + short_description: string; + meta_title: string; + meta_keywords: string; + meta_description: string; + id_shop: number; + }; +}; diff --git a/e2e/src/type/modules.ts b/e2e/src/type/modules.ts index a96a2e03..3dc6002b 100644 --- a/e2e/src/type/modules.ts +++ b/e2e/src/type/modules.ts @@ -1,17 +1,18 @@ -import fixture from '../fixtures/latest/apiModules/modules.json' +import fixture from "../fixtures/latest/apiModules/modules.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Modules[] = fixture; export type Modules = { - id: string, - collection: string, + id: string; + collection: string; properties: { - module_id: string, - name: string, - module_version: string, - active: boolean, - created_at: string, - updated_at: string - } -} + module_id: string; + name: string; + module_version: string; + active: boolean; + created_at: string; + updated_at: string; + }; +}; diff --git a/e2e/src/type/order-details.ts b/e2e/src/type/order-details.ts index 25fc421d..a934f6f3 100644 --- a/e2e/src/type/order-details.ts +++ b/e2e/src/type/order-details.ts @@ -1,25 +1,26 @@ -import fixture from '../fixtures/latest/apiOrders/order_details.json' +import fixture from "../fixtures/latest/apiOrders/order_details.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: OrderDetails[] = fixture; export type OrderDetails = { - id: number, - collection: string, + id: number; + collection: string; properties: { - category: number, - conversion_rate: number, - currency: string, - id_order: number, - id_order_detail: number, - iso_code: string, - product_attribute_id: number, - product_id: number, - product_quantity: number, - refund: number, - refund_tax_excl: number, - unique_product_id: string, - unit_price_tax_excl: number, - unit_price_tax_incl: number - } -} + category: number; + conversion_rate: number; + currency: string; + id_order: number; + id_order_detail: number; + iso_code: string; + product_attribute_id: number; + product_id: number; + product_quantity: number; + refund: number; + refund_tax_excl: number; + unique_product_id: string; + unit_price_tax_excl: number; + unit_price_tax_incl: number; + }; +}; diff --git a/e2e/src/type/order-status-history.ts b/e2e/src/type/order-status-history.ts index b2524234..83b9cf16 100644 --- a/e2e/src/type/order-status-history.ts +++ b/e2e/src/type/order-status-history.ts @@ -1,24 +1,25 @@ -import fixture from '../fixtures/latest/apiOrders/order_status_history.json' +import fixture from "../fixtures/latest/apiOrders/order_status_history.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: OrderStatusHistory[] = fixture; export type OrderStatusHistory = { - id: number, - collection: string, + id: number; + collection: string; properties: { - created_at: string, - date_add: string, - id_order: number, - id_order_history: number, - id_order_state: number, - is_deleted: boolean, - is_delivered: boolean, - is_paid: boolean, - is_shipped: boolean, - is_validated: boolean, - name: string, - template: string, - updated_at: string - } -} + created_at: string; + date_add: string; + id_order: number; + id_order_history: number; + id_order_state: number; + is_deleted: boolean; + is_delivered: boolean; + is_paid: boolean; + is_shipped: boolean; + is_validated: boolean; + name: string; + template: string; + updated_at: string; + }; +}; diff --git a/e2e/src/type/orders.ts b/e2e/src/type/orders.ts index ea320ac6..61bb9fce 100644 --- a/e2e/src/type/orders.ts +++ b/e2e/src/type/orders.ts @@ -1,38 +1,39 @@ -import fixture from '../fixtures/latest/apiOrders/orders.json' +import fixture from "../fixtures/latest/apiOrders/orders.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Orders[] = fixture; export type Orders = { - id: number, - collection: string, + id: number; + collection: string; properties: { - conversion_rate: number, - created_at: string, - currency: string, - current_state: number, - delivery_country_code: string, - id_carrier: number, - id_cart: number, - id_customer: number, - id_order: number, - invoice_country_code: string, - is_paid: boolean, - is_shipped: number, - is_validated: number, - new_customer: boolean, - payment_mode: string, - payment_module: string, - payment_name: string, - reference: string, - refund: number, - refund_tax_excl: number, - shipping_cost: number, - status_label: string, - total_paid_real: string, // TODO check this is the desired behaviour - total_paid_tax: number, - total_paid_tax_excl: number, - total_paid_tax_incl: number, - updated_at: string - } -} + conversion_rate: number; + created_at: string; + currency: string; + current_state: number; + delivery_country_code: string; + id_carrier: number; + id_cart: number; + id_customer: number; + id_order: number; + invoice_country_code: string; + is_paid: boolean; + is_shipped: number; + is_validated: number; + new_customer: boolean; + payment_mode: string; + payment_module: string; + payment_name: string; + reference: string; + refund: number; + refund_tax_excl: number; + shipping_cost: number; + status_label: string; + total_paid_real: string; // TODO check this is the desired behaviour + total_paid_tax: number; + total_paid_tax_excl: number; + total_paid_tax_incl: number; + updated_at: string; + }; +}; diff --git a/e2e/src/type/product-supplier.ts b/e2e/src/type/product-supplier.ts index a2f8b6f0..f7d1a2c7 100644 --- a/e2e/src/type/product-supplier.ts +++ b/e2e/src/type/product-supplier.ts @@ -1,18 +1,19 @@ -import fixture from '../fixtures/latest/apiProducts/product_suppliers.json'; +import fixture from "../fixtures/latest/apiProducts/product_suppliers.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: ProductSuppliers[] = fixture; export type ProductSuppliers = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_product_supplier: number, - id_product: number, - id_product_attribute: number, - id_supplier: number, - product_supplier_reference: string, - product_supplier_price_te: number, - id_currency: number - } -} + id_product_supplier: number; + id_product: number; + id_product_attribute: number; + id_supplier: number; + product_supplier_reference: string; + product_supplier_price_te: number; + id_currency: number; + }; +}; diff --git a/e2e/src/type/products.ts b/e2e/src/type/products.ts index 4629eeb1..89f6018e 100644 --- a/e2e/src/type/products.ts +++ b/e2e/src/type/products.ts @@ -1,62 +1,63 @@ -import fixture from '../fixtures/latest/apiProducts/products.json' +import fixture from "../fixtures/latest/apiProducts/products.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Products[] = fixture; export type Products = { - id: string, - collection: string, + id: string; + collection: string; properties: { - id_product: number, - id_manufacturer: number, - id_supplier: number, - id_attribute: number, - is_default_attribute: boolean, - name: string, - description: string, - description_short: string, - link_rewrite: string, - default_category: string, - id_category_default: number, - reference: string, - upc: string, - ean: string, - condition: string, - visibility: string, - active: boolean, - quantity: number, - manufacturer: string, - weight: number, - price_tax_excl: number, - created_at: string, - updated_at: string, - available_for_order: boolean, - available_date: string, - is_bundle: boolean, - is_virtual: boolean, - mpn: string, - width: string, // TODO : wrong cast - height: string, // TODO : wrong cast - depth: string, // TODO : wrong cast - additional_delivery_times: number, - additional_shipping_cost: string, - delivery_in_stock: string, - delivery_out_stock: string, - isbn: string, - features: {}, - attributes: {}, - images: string, - cover: string, - iso_code: string, - unique_product_id: string, - id_product_attribute: string, - link: string, - price_tax_incl: number, - sale_price_tax_excl: number, - sale_price_tax_incl: number, - tax: number, - sale_tax: number, - category_path: string, - category_id_path: string - } -} + id_product: number; + id_manufacturer: number; + id_supplier: number; + id_attribute: number; + is_default_attribute: boolean; + name: string; + description: string; + description_short: string; + link_rewrite: string; + default_category: string; + id_category_default: number; + reference: string; + upc: string; + ean: string; + condition: string; + visibility: string; + active: boolean; + quantity: number; + manufacturer: string; + weight: number; + price_tax_excl: number; + created_at: string; + updated_at: string; + available_for_order: boolean; + available_date: string; + is_bundle: boolean; + is_virtual: boolean; + mpn: string; + width: string; // TODO : wrong cast + height: string; // TODO : wrong cast + depth: string; // TODO : wrong cast + additional_delivery_times: number; + additional_shipping_cost: string; + delivery_in_stock: string; + delivery_out_stock: string; + isbn: string; + features: unknown; + attributes: unknown; + images: string; + cover: string; + iso_code: string; + unique_product_id: string; + id_product_attribute: string; + link: string; + price_tax_incl: number; + sale_price_tax_excl: number; + sale_price_tax_incl: number; + tax: number; + sale_tax: number; + category_path: string; + category_id_path: string; + }; +}; diff --git a/e2e/src/type/shops.ts b/e2e/src/type/shops.ts index f9e9be2b..1a41b9f7 100644 --- a/e2e/src/type/shops.ts +++ b/e2e/src/type/shops.ts @@ -1,33 +1,34 @@ -import fixture from '../fixtures/latest/apiInfo/shops.json' +import fixture from "../fixtures/latest/apiInfo/shops.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Shops[] = fixture; export type Shops = { - collection: string, - id: string, + collection: string; + id: string; properties: { - cart_is_persistent: boolean, - cms_version: string, - country_code: string, - created_at: string, - currencies: string, - default_currency: string, - default_language: string, - dimension_unit: string, - distance_unit: string, - folder_created_at: string, - http_server: string, - is_order_return_enabled: boolean, - languages: string, - multi_shop_count: number, - order_return_nb_days: number, - php_version: string, - ssl: boolean, - timezone: string, - url: string, - url_is_simplified: boolean, - volume_unit: string, - weight_unit: string, - } -} + cart_is_persistent: boolean; + cms_version: string; + country_code: string; + created_at: string; + currencies: string; + default_currency: string; + default_language: string; + dimension_unit: string; + distance_unit: string; + folder_created_at: string; + http_server: string; + is_order_return_enabled: boolean; + languages: string; + multi_shop_count: number; + order_return_nb_days: number; + php_version: string; + ssl: boolean; + timezone: string; + url: string; + url_is_simplified: boolean; + volume_unit: string; + weight_unit: string; + }; +}; diff --git a/e2e/src/type/specific-prices.ts b/e2e/src/type/specific-prices.ts index 05d3b829..9c1cdcbf 100644 --- a/e2e/src/type/specific-prices.ts +++ b/e2e/src/type/specific-prices.ts @@ -1,34 +1,35 @@ -import fixture from '../fixtures/latest/apiSpecificPrices/specific_prices.json' +import fixture from "../fixtures/latest/apiSpecificPrices/specific_prices.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: SpecificPrices[] = fixture; export type SpecificPrices = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_specific_price: number, - id_product: number, - id_shop: number, - id_shop_group: number, - id_currency: number, - id_country: number, - id_group: number, - id_customer: number, - id_product_attribute: number, - price: number, - from_quantity: number, - reduction: number, - reduction_tax: number, - reduction_type: string, - country: string, - currency: string, - price_tax_included: number, - price_tax_excluded: number, - sale_price_tax_incl: number, - sale_price_tax_excl: number, - discount_percentage: number, - discount_value_tax_incl: number, - discount_value_tax_excl: number - } -} + id_specific_price: number; + id_product: number; + id_shop: number; + id_shop_group: number; + id_currency: number; + id_country: number; + id_group: number; + id_customer: number; + id_product_attribute: number; + price: number; + from_quantity: number; + reduction: number; + reduction_tax: number; + reduction_type: string; + country: string; + currency: string; + price_tax_included: number; + price_tax_excluded: number; + sale_price_tax_incl: number; + sale_price_tax_excl: number; + discount_percentage: number; + discount_value_tax_incl: number; + discount_value_tax_excl: number; + }; +}; diff --git a/e2e/src/type/stocks.ts b/e2e/src/type/stocks.ts index b3df988d..fc73418a 100644 --- a/e2e/src/type/stocks.ts +++ b/e2e/src/type/stocks.ts @@ -1,22 +1,23 @@ -import fixture from '../fixtures/latest/apiStocks/stocks.json' +import fixture from "../fixtures/latest/apiStocks/stocks.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Stocks[] = fixture; export type Stocks = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_stock_available: number, - id_product: number, - id_product_attribute: number, - id_shop: number, - id_shop_group: number, - quantity: number, - physical_quantity: number, - reserved_quantity: number, - depends_on_stock: boolean, - out_of_stock: boolean, - location: string - } -} + id_stock_available: number; + id_product: number; + id_product_attribute: number; + id_shop: number; + id_shop_group: number; + quantity: number; + physical_quantity: number; + reserved_quantity: number; + depends_on_stock: boolean; + out_of_stock: boolean; + location: string; + }; +}; diff --git a/e2e/src/type/stores.ts b/e2e/src/type/stores.ts index bf2ef217..96ef4084 100644 --- a/e2e/src/type/stores.ts +++ b/e2e/src/type/stores.ts @@ -1,25 +1,26 @@ -import fixture from '../fixtures/latest/apiStores/stores.json' +import fixture from "../fixtures/latest/apiStores/stores.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Stores[] = fixture; export type Stores = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_store: number, - id_country: number, - id_state: number, - city: string, - postcode: string, - active: boolean, - created_at: string, - updated_at: string, - id_lang: number, - name: string, - address1: string, - address2: string, - hours: string, // TODO : actually json array inside a string -> transition to a nested array ? - id_shop: number - } -} + id_store: number; + id_country: number; + id_state: number; + city: string; + postcode: string; + active: boolean; + created_at: string; + updated_at: string; + id_lang: number; + name: string; + address1: string; + address2: string; + hours: string; // TODO : actually json array inside a string -> transition to a nested array ? + id_shop: number; + }; +}; diff --git a/e2e/src/type/suppliers.ts b/e2e/src/type/suppliers.ts index 38833290..ecf8cfc5 100644 --- a/e2e/src/type/suppliers.ts +++ b/e2e/src/type/suppliers.ts @@ -1,22 +1,23 @@ -import fixture from '../fixtures/latest/apiSuppliers/suppliers.json' +import fixture from "../fixtures/latest/apiSuppliers/suppliers.json"; // test type +// eslint-disable-next-line @typescript-eslint/no-unused-vars const t: Suppliers[] = fixture; export type Suppliers = { - id: number, - collection: string, + id: number; + collection: string; properties: { - id_supplier: number, - name: string, - created_at: string, - updated_at: string, - active: boolean, - id_lang: number, - description: string, - meta_title: string, - meta_keywords: string, - meta_description: string, - id_shop: number - } -} + id_supplier: number; + name: string; + created_at: string; + updated_at: string; + active: boolean; + id_lang: number; + description: string; + meta_title: string; + meta_keywords: string; + meta_description: string; + id_shop: number; + }; +};