From 0ca667cecdcfa3c09f872a1467483f2ccf6c861e Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 29 Jul 2023 20:56:45 +0800 Subject: [PATCH 01/34] chore: update author and add repository field in package.json --- package.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a9cf6c9..3428f98 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,20 @@ "name": "shopee-coins-bot", "version": "1.3.2", "description": "Get Shopee coins everyday", + "author": { + "name": "hyperbola", + "email": "me@hyperbola.me", + "url": "https://blog.hyperbola.me" + }, + "repository": "github:hyperbola/shopee-coins-bot", + "packageManager": "pnpm@8.6.6", + "type": "module", "scripts": { "build": "webpack", "clean": "rm -rf dist", "lint": "eslint src/ --ext .ts --fix --ignore-path .gitignore", "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" }, - "author": "hyperbola", - "packageManager": "pnpm@8.6.6", - "type": "module", "dependencies": { "commander": "^10.0.1", "loglevel": "^1.8.1", From 9763d7b0f26ca139dadd9237d6141bda6c5158d9 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 01:52:51 +0800 Subject: [PATCH 02/34] feat: implement v2 Also upgrade dependencies and remove unused ones. Upgrade Node.js version to 20. Also update commands in package.json, and ESLint and prettier configurations. All unittests in v1 are removed. Removed VSCode devcontainer as it is no longer needed. --- .devcontainer/Dockerfile | 23 - .devcontainer/devcontainer.json | 26 - .eslintrc.cjs | 5 +- .prettierrc | 3 +- package.json | 31 +- pnpm-lock.yaml | 2487 ++++++------------------------- src/__tests__/bot.ts | 80 - src/__tests__/utils.ts | 21 - src/api-types/checkin.ts | 27 + src/api-types/coins.ts | 16 + src/api-types/settings.ts | 32 + src/bot.ts | 129 ++ src/cookie.ts | 15 + src/errors.ts | 19 + src/exit-code.ts | 18 +- src/index.ts | 306 ++-- src/text.ts | 15 - src/tw-shopee-bot.ts | 503 ------- src/util.ts | 10 - tsconfig.json | 2 +- 20 files changed, 862 insertions(+), 2906 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 src/__tests__/bot.ts delete mode 100644 src/__tests__/utils.ts create mode 100644 src/api-types/checkin.ts create mode 100644 src/api-types/coins.ts create mode 100644 src/api-types/settings.ts create mode 100644 src/bot.ts create mode 100644 src/cookie.ts create mode 100644 src/errors.ts delete mode 100644 src/text.ts delete mode 100644 src/tw-shopee-bot.ts delete mode 100644 src/util.ts diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 0cab437..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM mcr.microsoft.com/devcontainers/typescript-node:0-18 - -RUN apt-get update -y \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends unzip - -ARG CHROME_VERSION="112.0.5615.49" -# Install google chrome -RUN wget -qO /tmp/chrome.deb https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}-1_amd64.deb \ - && apt-get install -yqq /tmp/chrome.deb \ - && rm /tmp/chrome.deb - -# Install chromedriver -RUN wget -qO /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/${CHROME_VERSION}/chromedriver_linux64.zip \ - && unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ \ - && rm /tmp/chromedriver.zip -RUN sed -i s/cdc_/fan_/g /usr/local/bin/chromedriver -# Set display port to avoid crash -ENV DISPLAY=:99 -ENV PATH /usr/local/bin:$PATH - -# Install required font -RUN apt-get update -y \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends fonts-noto-cjk diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 36d88d7..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,26 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile -{ - "name": "Existing Dockerfile", - "build": { - // Sets the run context to one level up instead of the .devcontainer folder. - "context": ".", - // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. - "dockerfile": "./Dockerfile" - } - - // Features to add to the dev container. More info: https://containers.dev/features. - // "features": {}, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Uncomment the next line to run commands after the container is created. - // "postCreateCommand": "cat /etc/os-release", - - // Configure tool-specific properties. - // "customizations": {}, - - // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "devcontainer" -} diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 483e7d4..e820188 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,7 +1,7 @@ /* eslint-env node */ module.exports = { root: true, - extends: ['wdzeng', 'wdzeng/typescript', 'plugin:prettier/recommended'], + extends: ['wdzeng/typescript'], env: { browser: false, es2022: true, @@ -9,7 +9,8 @@ module.exports = { }, parserOptions: { ecmaVersion: 13, - sourceType: 'module' + sourceType: 'module', + project: './tsconfig.json' }, rules: { // Your custom rules go here ... diff --git a/.prettierrc b/.prettierrc index e523f79..c94b601 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,5 +5,6 @@ "semi": false, "singleQuote": true, "trailingComma": "none", - "endOfLine": "lf" + "endOfLine": "lf", + "quoteProps": "consistent" } diff --git a/package.json b/package.json index 3428f98..ab13ad8 100644 --- a/package.json +++ b/package.json @@ -8,34 +8,29 @@ "url": "https://blog.hyperbola.me" }, "repository": "github:hyperbola/shopee-coins-bot", - "packageManager": "pnpm@8.6.6", + "packageManager": "pnpm@8.6.9", "type": "module", "scripts": { "build": "webpack", - "clean": "rm -rf dist", + "dev": "tsx src/index.ts", "lint": "eslint src/ --ext .ts --fix --ignore-path .gitignore", - "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" + "clean": "rm -rf dist" }, "dependencies": { - "commander": "^10.0.1", - "loglevel": "^1.8.1", - "selenium-webdriver": "^4.10.0" + "commander": "^11.0.0", + "loglevel": "^1.8.1" }, "devDependencies": { - "@jest/globals": "^29.6.1", - "@types/node": "^18.16.19", - "@types/selenium-webdriver": "^4.1.15", - "eslint": "^8.44.0", - "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.2.4", - "jest": "^29.6.1", - "prettier": "^2.8.8", - "ts-jest": "^29.1.1", + "@types/node": "^20.4.4", + "eslint": "^8.45.0", + "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.3.4", + "prettier": "^3.0.0", + "ts-custom-error": "^3.3.1", "ts-loader": "^9.4.4", - "ts-node": "^10.9.1", - "tsc-alias": "^1.8.7", - "tsconfig-paths-webpack-plugin": "^4.0.1", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "tsx": "^3.12.7", "typescript": "^5.1.6", - "webpack": "^5.88.1", + "webpack": "^5.88.2", "webpack-cli": "^5.1.4" }, "license": "MIT" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f09a88a..cd412e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,61 +6,46 @@ settings: dependencies: commander: - specifier: ^10.0.1 - version: 10.0.1 + specifier: ^11.0.0 + version: 11.0.0 loglevel: specifier: ^1.8.1 version: 1.8.1 - selenium-webdriver: - specifier: ^4.10.0 - version: 4.10.0 devDependencies: - '@jest/globals': - specifier: ^29.6.1 - version: 29.6.1 '@types/node': - specifier: ^18.16.19 - version: 18.16.19 - '@types/selenium-webdriver': - specifier: ^4.1.15 - version: 4.1.15 + specifier: ^20.4.4 + version: 20.4.4 eslint: - specifier: ^8.44.0 - version: 8.44.0 + specifier: ^8.45.0 + version: 8.45.0 eslint-config-wdzeng: - specifier: github:wdzeng/eslint-config#semver:^0.2.4 - version: github.com/wdzeng/eslint-config/4a2715393f61e653cc0e0d52ced0f4f69cb40006(@typescript-eslint/eslint-plugin@5.61.0)(@typescript-eslint/parser@5.61.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@4.2.1)(eslint-plugin-unicorn@47.0.0)(eslint@8.44.0)(prettier@2.8.8)(typescript@5.1.6) - jest: - specifier: ^29.6.1 - version: 29.6.1(@types/node@18.16.19)(ts-node@10.9.1) + specifier: github:wdzeng/eslint-config#semver:^0.3.4 + version: github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.1.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@5.0.0)(eslint-plugin-unicorn@47.0.0)(eslint@8.45.0)(prettier@3.0.0)(typescript@5.1.6) prettier: - specifier: ^2.8.8 - version: 2.8.8 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.3)(jest@29.6.1)(typescript@5.1.6) + specifier: ^3.0.0 + version: 3.0.0 + ts-custom-error: + specifier: ^3.3.1 + version: 3.3.1 ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.1.6)(webpack@5.88.1) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@18.16.19)(typescript@5.1.6) - tsc-alias: - specifier: ^1.8.7 - version: 1.8.7 + version: 9.4.4(typescript@5.1.6)(webpack@5.88.2) tsconfig-paths-webpack-plugin: - specifier: ^4.0.1 - version: 4.0.1 + specifier: ^4.1.0 + version: 4.1.0 + tsx: + specifier: ^3.12.7 + version: 3.12.7 typescript: specifier: ^5.1.6 version: 5.1.6 webpack: - specifier: ^5.88.1 - version: 5.88.1(webpack-cli@5.1.4) + specifier: ^5.88.2 + version: 5.88.2(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.88.1) + version: 5.1.4(webpack@5.88.2) packages: @@ -69,14 +54,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -84,352 +61,252 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data@7.21.0: - resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.21.3: - resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.3 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.21.3: - resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.3 - dev: true - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 - dev: true - - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.3 dev: true - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - transitivePeerDependencies: - - supports-color + chalk: 2.4.2 + js-tokens: 4.0.0 dev: true - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} - engines: {node: '>=6.9.0'} + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@babel/types': 7.21.3 + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.6.2 dev: true - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} dependencies: - '@babel/types': 7.21.3 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} - engines: {node: '>=6.9.0'} + esbuild: 0.17.19 + source-map-support: 0.5.21 dev: true - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} - engines: {node: '>=6.9.0'} + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - transitivePeerDependencies: - - supports-color + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.6.2 dev: true - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/parser@7.21.3: - resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.21.3 + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.3): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.3): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.3): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.3): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.3): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.3): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.3): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true dev: true + optional: true - /@babel/traverse@7.21.3: - resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true dev: true + optional: true - /@babel/types@7.21.3: - resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true dev: true + optional: true - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + cpu: [ia32] + os: [win32] + requiresBuild: true dev: true + optional: true - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.45.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 dependencies: - eslint: 8.44.0 - eslint-visitor-keys: 3.3.0 + eslint: 8.45.0 + eslint-visitor-keys: 3.4.1 dev: true /@eslint-community/regexpp@4.4.1: @@ -437,6 +314,11 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true + /@eslint-community/regexpp@4.6.0: + resolution: {integrity: sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint/eslintrc@2.1.0: resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -479,262 +361,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console@29.6.1: - resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - chalk: 4.1.2 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/core@29.6.1(ts-node@10.9.1): - resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.6.1 - '@jest/reporters': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.1(@types/node@18.16.19)(ts-node@10.9.1) - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-resolve-dependencies: 29.6.1 - jest-runner: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - jest-watcher: 29.6.1 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment@29.6.1: - resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - jest-mock: 29.6.1 - dev: true - - /@jest/expect-utils@29.6.1: - resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.1: - resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.6.1 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.6.1: - resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.16.19 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /@jest/globals@29.6.1: - resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/types': 29.6.1 - jest-mock: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.6.1: - resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 18.16.19 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - jest-worker: 29.6.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.25.24 - dev: true - - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.6.1: - resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer@29.6.1: - resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - slash: 3.0.0 - dev: true - - /@jest/transform@29.6.1: - resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.21.3 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.16.19 - '@types/yargs': 17.0.22 - chalk: 4.1.2 - dev: true - - /@jest/types@29.6.1: - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.16.19 - '@types/yargs': 17.0.22 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} @@ -772,13 +398,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -812,71 +431,6 @@ packages: tslib: 2.6.0 dev: true - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} - dependencies: - '@sinonjs/commons': 2.0.0 - dev: true - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - dev: true - - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} - dependencies: - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - dev: true - - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.21.3 - dev: true - - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 - dev: true - - /@types/babel__traverse@7.18.3: - resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} - dependencies: - '@babel/types': 7.21.3 - dev: true - /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: @@ -895,28 +449,6 @@ packages: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: true - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} - dependencies: - '@types/node': 18.16.19 - dev: true - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true @@ -925,175 +457,147 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@18.16.19: - resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} + /@types/node@20.4.4: + resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} dev: true /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/prettier@2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} - dev: true - - /@types/selenium-webdriver@4.1.15: - resolution: {integrity: sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg==} - dependencies: - '@types/ws': 8.5.3 - dev: true - /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/ws@8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} - dependencies: - '@types/node': 18.16.19 - dev: true - - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs@17.0.22: - resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.4.1 - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/type-utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@eslint-community/regexpp': 4.6.0 + '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.1.0 + '@typescript-eslint/type-utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.1.0 debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.45.0 graphemer: 1.4.0 ignore: 5.2.4 + natural-compare: 1.4.0 natural-compare-lite: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.1.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.1.0 + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.1.0 debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.45.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.61.0: - resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager@6.1.0: + resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/visitor-keys': 6.1.0 dev: true - /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.1.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) - '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) + '@typescript-eslint/utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.44.0 - tsutils: 3.21.0(typescript@5.1.6) + eslint: 8.45.0 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.61.0: - resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types@6.1.0: + resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): - resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@6.1.0(typescript@5.1.6): + resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/visitor-keys': 6.1.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.1.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) - eslint: 8.44.0 - eslint-scope: 5.1.1 + '@typescript-eslint/scope-manager': 6.1.0 + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) + eslint: 8.45.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.61.0: - resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@6.1.0: + resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/types': 6.1.0 eslint-visitor-keys: 3.4.1 dev: true @@ -1203,29 +707,29 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.1): + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.1) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) dev: true - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.1): + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.88.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.1) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) dev: true - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.1): + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} engines: {node: '>=14.15.0'} peerDependencies: @@ -1236,8 +740,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.88.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.1) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) dev: true /@xtuc/ieee754@1.2.0: @@ -1264,23 +768,12 @@ packages: acorn: 8.10.0 dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -1298,13 +791,6 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1324,29 +810,6 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1399,91 +862,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /babel-jest@29.6.1(@babel/core@7.21.3): - resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.21.3 - '@jest/transform': 29.6.1 - '@types/babel__core': 7.20.0 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.3) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.3 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.3 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.3): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.3) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.21.3): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.3 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.3) - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -1496,6 +883,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -1515,19 +903,6 @@ packages: update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -1556,16 +931,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - /caniuse-lite@1.0.30001467: resolution: {integrity: sha512-cEdN/5e+RPikvl9AHm4uuLXxeCNq8rFsQ+lPHTfe/OtypP3WwnVVbjn+6uBV7PaFL6xUFzTh+sSCOz1rKhcO+Q==} dev: true @@ -1587,26 +952,6 @@ packages: supports-color: 7.2.0 dev: true - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -1617,10 +962,6 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true - /clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1628,15 +969,6 @@ packages: escape-string-regexp: 1.0.5 dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -1646,15 +978,6 @@ packages: shallow-clone: 3.0.1 dev: true - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1683,33 +1006,19 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + dev: true + + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + dev: false /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /cross-spawn@7.0.3: @@ -1744,19 +1053,10 @@ packages: ms: 2.1.2 dev: true - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - /default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} @@ -1783,24 +1083,9 @@ packages: /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 dev: true /dir-glob@3.0.1: @@ -1828,15 +1113,6 @@ packages: resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} dev: true - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} @@ -1925,6 +1201,36 @@ packages: is-symbol: 1.0.4 dev: true + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -1935,23 +1241,18 @@ packages: engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /eslint-config-prettier@8.8.0(eslint@8.44.0): + /eslint-config-prettier@8.8.0(eslint@8.45.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.44.0 + eslint: 8.45.0 dev: true /eslint-import-resolver-node@0.3.7: @@ -1964,7 +1265,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.61.0)(eslint-plugin-import@2.27.5)(eslint@8.44.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1973,9 +1274,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 - eslint: 8.44.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint: 8.45.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.11.0 @@ -1988,7 +1289,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2009,16 +1310,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) debug: 3.2.7 - eslint: 8.44.0 + eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-plugin-import@2.27.5)(eslint@8.44.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -2028,15 +1329,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.44.0 + eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -2051,34 +1352,38 @@ packages: - supports-color dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.44.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@8.8.0)(eslint@8.45.0)(prettier@3.0.0): + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.28.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' eslint-config-prettier: '*' - prettier: '>=2.0.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true dependencies: - eslint: 8.44.0 - eslint-config-prettier: 8.8.0(eslint@8.44.0) - prettier: 2.8.8 + eslint: 8.45.0 + eslint-config-prettier: 8.8.0(eslint@8.45.0) + prettier: 3.0.0 prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 dev: true - /eslint-plugin-unicorn@47.0.0(eslint@8.44.0): + /eslint-plugin-unicorn@47.0.0(eslint@8.45.0): resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.38.0' dependencies: '@babel/helper-validator-identifier': 7.19.1 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.44.0 + eslint: 8.45.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -2109,22 +1414,17 @@ packages: estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-visitor-keys@3.4.1: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.44.0: - resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} + /eslint@8.45.0: + resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) '@eslint-community/regexpp': 4.4.1 '@eslint/eslintrc': 2.1.0 '@eslint/js': 8.44.0 @@ -2149,7 +1449,6 @@ packages: globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2161,7 +1460,6 @@ packages: natural-compare: 1.4.0 optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color @@ -2176,12 +1474,6 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -2246,23 +1538,6 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@29.6.1: - resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.6.1 - '@types/node': 18.16.19 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -2301,12 +1576,6 @@ packages: reusify: 1.0.4 dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2357,6 +1626,7 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -2384,16 +1654,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -2403,11 +1663,6 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2454,10 +1709,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} dev: true /globals@13.20.0: @@ -2559,10 +1810,6 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2578,10 +1825,6 @@ packages: engines: {node: '>= 4'} dev: true - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false - /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -2614,9 +1857,11 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} @@ -2650,13 +1895,6 @@ packages: has-bigints: 1.0.2 dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -2707,16 +1945,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2812,517 +2040,39 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.21.3 - '@babel/parser': 7.21.3 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.6.1: - resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/expect': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.6.1 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-runtime: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - p-limit: 3.1.0 - pretty-format: 29.6.1 - pure-rand: 6.0.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli@29.6.1(@types/node@18.16.19)(ts-node@10.9.1): - resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.9.1) - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.6.1(@types/node@18.16.19)(ts-node@10.9.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - prompts: 2.4.2 - yargs: 17.7.1 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config@29.6.1(@types/node@18.16.19)(ts-node@10.9.1): - resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.21.3 - '@jest/test-sequencer': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - babel-jest: 29.6.1(@babel/core@7.21.3) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.6.1 - jest-environment-node: 29.6.1 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-runner: 29.6.1 - jest-util: 29.6.1 - jest-validate: 29.6.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.6.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.16.19)(typescript@5.1.6) - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff@29.6.1: - resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.6.1: - resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.1 - pretty-format: 29.6.1 - dev: true - - /jest-environment-node@29.6.1: - resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - jest-mock: 29.6.1 - jest-util: 29.6.1 - dev: true - - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.6.1: - resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 18.16.19 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.1 - jest-worker: 29.6.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.1: - resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-matcher-utils@29.6.1: - resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - pretty-format: 29.6.1 - dev: true - - /jest-message-util@29.6.1: - resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.6.1: - resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - jest-util: 29.6.1 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.6.1 - dev: true - - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.6.1: - resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.6.1: - resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) - jest-util: 29.6.1 - jest-validate: 29.6.1 - resolve: 1.22.1 - resolve.exports: 2.0.1 - slash: 3.0.0 - dev: true - - /jest-runner@29.6.1: - resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.6.1 - '@jest/environment': 29.6.1 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.1 - jest-haste-map: 29.6.1 - jest-leak-detector: 29.6.1 - jest-message-util: 29.6.1 - jest-resolve: 29.6.1 - jest-runtime: 29.6.1 - jest-util: 29.6.1 - jest-watcher: 29.6.1 - jest-worker: 29.6.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.6.1: - resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.6.1 - '@jest/fake-timers': 29.6.1 - '@jest/globals': 29.6.1 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.6.1 - jest-message-util: 29.6.1 - jest-mock: 29.6.1 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.1 - jest-snapshot: 29.6.1 - jest-util: 29.6.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.6.1: - resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.21.3 - '@babel/generator': 7.21.3 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) - '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) - '@babel/types': 7.21.3 - '@jest/expect-utils': 29.6.1 - '@jest/transform': 29.6.1 - '@jest/types': 29.6.1 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.3) - chalk: 4.1.2 - expect: 29.6.1 - graceful-fs: 4.2.11 - jest-diff: 29.6.1 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.1 - jest-message-util: 29.6.1 - jest-util: 29.6.1 - natural-compare: 1.4.0 - pretty-format: 29.6.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 18.16.19 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-util@29.6.1: - resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + dependencies: + call-bind: 1.0.2 dev: true - /jest-validate@29.6.1: - resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: - '@jest/types': 29.6.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.4.3 - leven: 3.1.0 - pretty-format: 29.6.1 + is-docker: 2.2.1 dev: true - /jest-watcher@29.6.1: - resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.6.1 - '@jest/types': 29.6.1 - '@types/node': 18.16.19 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.6.1 - string-length: 4.0.2 + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} dev: true /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.16.19 + '@types/node': 20.4.4 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest-worker@29.6.1: - resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 18.16.19 - jest-util: 29.6.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.6.1(@types/node@18.16.19)(ts-node@10.9.1): - resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.6.1(ts-node@10.9.1) - '@jest/types': 29.6.1 - import-local: 3.1.0 - jest-cli: 29.6.1(@types/node@18.16.19)(ts-node@10.9.1) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -3335,12 +2085,6 @@ packages: hasBin: true dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - /jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3372,30 +2116,11 @@ packages: hasBin: true dev: true - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.7 - setimmediate: 1.0.5 - dev: false - /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3404,12 +2129,6 @@ packages: type-check: 0.4.0 dev: true - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: false - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -3433,10 +2152,6 @@ packages: p-locate: 5.0.0 dev: true - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -3450,12 +2165,6 @@ packages: engines: {node: '>= 0.6.0'} dev: false - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -3463,23 +2172,6 @@ packages: yallist: 4.0.0 dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -3528,6 +2220,7 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -3537,11 +2230,6 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /mylas@2.1.13: - resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} - engines: {node: '>=12.0.0'} - dev: true - /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -3554,10 +2242,6 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true @@ -3571,11 +2255,6 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3622,6 +2301,7 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -3692,10 +2372,6 @@ packages: engines: {node: '>=6'} dev: true - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3721,6 +2397,7 @@ packages: /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -3750,11 +2427,6 @@ packages: engines: {node: '>=8.6'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -3762,12 +2434,6 @@ packages: find-up: 4.1.0 dev: true - /plimit-lit@1.5.0: - resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} - dependencies: - queue-lit: 1.5.0 - dev: true - /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3785,46 +2451,17 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + engines: {node: '>=14'} hasBin: true dev: true - /pretty-format@29.6.1: - resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /pure-rand@6.0.1: - resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} - dev: true - - /queue-lit@1.5.0: - resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} - dev: true - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -3835,10 +2472,6 @@ packages: safe-buffer: 5.1.2 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -3858,25 +2491,6 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - /rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} @@ -3905,11 +2519,6 @@ packages: jsesc: 0.5.0 dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3931,11 +2540,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve.exports@2.0.1: - resolution: {integrity: sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==} - engines: {node: '>=10'} - dev: true - /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -3955,6 +2559,7 @@ packages: hasBin: true dependencies: glob: 7.2.3 + dev: true /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} @@ -3971,6 +2576,7 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -3995,18 +2601,6 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /selenium-webdriver@4.10.0: - resolution: {integrity: sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==} - engines: {node: '>= 14.20.0'} - dependencies: - jszip: 3.10.1 - tmp: 0.2.1 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -4031,10 +2625,6 @@ packages: randombytes: 2.1.0 dev: true - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false - /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -4066,10 +2656,6 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4080,13 +2666,6 @@ packages: engines: {node: '>=12'} dev: true - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -4121,34 +2700,6 @@ packages: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} @@ -4174,12 +2725,6 @@ packages: es-abstract: 1.21.2 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4192,11 +2737,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -4258,7 +2798,7 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.9(webpack@5.88.1): + /terser-webpack-plugin@5.3.9(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -4279,7 +2819,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.18.2 - webpack: 5.88.1(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true /terser@5.18.2: @@ -4293,15 +2833,6 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -4311,22 +2842,6 @@ packages: engines: {node: '>=12'} dev: true - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: false - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4334,41 +2849,21 @@ packages: is-number: 7.0.0 dev: true - /ts-jest@29.1.1(@babel/core@7.21.3)(jest@29.6.1)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + /ts-api-utils@1.0.1(typescript@5.1.6): + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + typescript: '>=4.2.0' dependencies: - '@babel/core': 7.21.3 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@18.16.19)(ts-node@10.9.1) - jest-util: 29.5.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 typescript: 5.1.6 - yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.1): + /ts-custom-error@3.3.1: + resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} + engines: {node: '>=14.0.0'} + dev: true + + /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4380,54 +2875,11 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.1.6 - webpack: 5.88.1(webpack-cli@5.1.4) - dev: true - - /ts-node@10.9.1(@types/node@18.16.19)(typescript@5.1.6): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.16.19 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsc-alias@1.8.7: - resolution: {integrity: sha512-59Q/zUQa3miTf99mLbSqaW0hi1jt4WoG8Uhe5hSZJHQpSoFW9eEwvW7jlKMHXWvT+zrzy3SN9PE/YBhQ+WVydA==} - hasBin: true - dependencies: - chokidar: 3.5.3 - commander: 9.5.0 - globby: 11.1.0 - mylas: 2.1.13 - normalize-path: 3.0.0 - plimit-lit: 1.5.0 + webpack: 5.88.2(webpack-cli@5.1.4) dev: true - /tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + /tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 @@ -4453,22 +2905,19 @@ packages: strip-bom: 3.0.0 dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: true - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + /tsx@3.12.7: + resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + hasBin: true dependencies: - tslib: 1.14.1 - typescript: 5.1.6 + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 dev: true /type-check@0.4.0: @@ -4478,21 +2927,11 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -4548,23 +2987,6 @@ packages: punycode: 2.3.0 dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -4572,12 +2994,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -4586,7 +3002,7 @@ packages: graceful-fs: 4.2.11 dev: true - /webpack-cli@5.1.4(webpack@5.88.1): + /webpack-cli@5.1.4(webpack@5.88.2): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -4604,9 +3020,9 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -4615,7 +3031,7 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.88.1(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) webpack-merge: 5.9.0 dev: true @@ -4632,8 +3048,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.88.1(webpack-cli@5.1.4): - resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} + /webpack@5.88.2(webpack-cli@5.1.4): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -4663,9 +3079,9 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.1) + terser-webpack-plugin: 5.3.9(webpack@5.88.2) watchpack: 2.4.0 - webpack-cli: 5.1.4(webpack@5.88.1) + webpack-cli: 5.1.4(webpack@5.88.2) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -4707,105 +3123,44 @@ packages: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - github.com/wdzeng/eslint-config/4a2715393f61e653cc0e0d52ced0f4f69cb40006(@typescript-eslint/eslint-plugin@5.61.0)(@typescript-eslint/parser@5.61.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@4.2.1)(eslint-plugin-unicorn@47.0.0)(eslint@8.44.0)(prettier@2.8.8)(typescript@5.1.6): - resolution: {tarball: https://codeload.github.com/wdzeng/eslint-config/tar.gz/4a2715393f61e653cc0e0d52ced0f4f69cb40006} - id: github.com/wdzeng/eslint-config/4a2715393f61e653cc0e0d52ced0f4f69cb40006 + github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.1.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@5.0.0)(eslint-plugin-unicorn@47.0.0)(eslint@8.45.0)(prettier@3.0.0)(typescript@5.1.6): + resolution: {tarball: https://codeload.github.com/wdzeng/eslint-config/tar.gz/76b054e7f387337efc36987c0c8eccfa987e36c6} + id: github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6 name: eslint-config-wdzeng - version: 0.2.4 + version: 0.3.4 peerDependencies: - '@typescript-eslint/eslint-plugin': '>= 5.61.0' - '@typescript-eslint/parser': '>= 5.61.0' - eslint: '>= 8.44.0' + '@typescript-eslint/eslint-plugin': ^6.0.0 + '@typescript-eslint/parser': ^6.0.0 + eslint: ^8.45.0 eslint-config-prettier: '>= 8.8.0' eslint-import-resolver-typescript: '>= 3.5.5' eslint-plugin-import: '>= 2.27.5' - eslint-plugin-prettier: '>= 4.2.1' + eslint-plugin-prettier: ^5.0.0 eslint-plugin-unicorn: '>= 47.0.0' - prettier: ^2.8.8 + prettier: ^3.0.0 typescript: '>= 5.1.6' dependencies: - '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - eslint: 8.44.0 - eslint-config-prettier: 8.8.0(eslint@8.44.0) - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-plugin-import@2.27.5)(eslint@8.44.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.44.0)(prettier@2.8.8) - eslint-plugin-unicorn: 47.0.0(eslint@8.44.0) - prettier: 2.8.8 + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + eslint: 8.45.0 + eslint-config-prettier: 8.8.0(eslint@8.45.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@8.8.0)(eslint@8.45.0)(prettier@3.0.0) + eslint-plugin-unicorn: 47.0.0(eslint@8.45.0) + prettier: 3.0.0 typescript: 5.1.6 dev: true diff --git a/src/__tests__/bot.ts b/src/__tests__/bot.ts deleted file mode 100644 index 5d68d21..0000000 --- a/src/__tests__/bot.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Test bot operations - -import crypto from 'node:crypto' -import fs from 'node:fs' - -import { describe, expect, test } from '@jest/globals' - -import { isPng, testIf } from '@/__tests__/utils' -import { ExitCode } from '@/exit-code' -import Bot from '@/tw-shopee-bot' - -const TIMEOUT_LOGIN = 20 * 1000 // 20s - -function generateRandomString() { - const chars = 'abcdefghijklmnopqrstuvwxyz' - let result = '' - const randomBytes = crypto.randomBytes(10) - for (let i = 0; i < 10; i++) { - // @ts-expect-error: randomBytes is a Buffer - const index = randomBytes[i] % chars.length - result += chars[index] - } - return result -} - -async function testLoginWithDummyUserInfo(screenshotPath: undefined | string) { - const dummyUsername = generateRandomString() - const dummyPassword = generateRandomString() - const bot = new Bot(dummyUsername, dummyPassword, undefined) - const exitCode = await bot.run(true, true, false, screenshotPath) - expect(exitCode).toBe(ExitCode.WRONG_PASSWORD) -} - -describe('login', () => { - test( - 'bot cannot login with a wrong username or password', - () => testLoginWithDummyUserInfo(undefined), - TIMEOUT_LOGIN - ) - - test( - 'bot cannot login with an invalid cookie', - async () => { - const cookie = 'dummycookie' - const bot = new Bot(undefined, undefined, cookie) - const exitCode = await bot.run(true, true, false, undefined) - expect(exitCode).toBe(ExitCode.WRONG_PASSWORD) - }, - TIMEOUT_LOGIN - ) - - testIf( - false, - // Boolean( - // (process.env['SHOPEE_USERNAME'] && process.env['SHOPEE_PASSWORD']) || - // process.env['GITHUB_ACTIONS'] - // ), - 'bot can login with correct username and password', - async () => { - const bot = new Bot(process.env.SHOPEE_USERNAME, process.env.SHOPEE_PASSWORD, undefined) - const exitCode = await bot.run(true, true, false, undefined) - expect([ExitCode.NEED_SMS_AUTH, ExitCode.NEED_EMAIL_AUTH]).toContain(exitCode) - }, - TIMEOUT_LOGIN - ) -}) - -describe('screenshot', () => { - test( - 'bot can save a screenshot', - async () => { - const screenshotPath = '/tmp/screenshot.png' - fs.rmSync(screenshotPath, { force: true }) - expect(fs.existsSync(screenshotPath)).toBe(false) - await testLoginWithDummyUserInfo('/tmp') - expect(isPng(screenshotPath)).toBe(true) - }, - TIMEOUT_LOGIN - ) -}) diff --git a/src/__tests__/utils.ts b/src/__tests__/utils.ts deleted file mode 100644 index 3405601..0000000 --- a/src/__tests__/utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import fs from 'node:fs' - -import { test } from '@jest/globals' - -export function isPng(filePath: string): boolean { - const pngSignature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]) - - // Read the first few bytes of the file. - const fileSignature = Buffer.alloc(pngSignature.length) - const fd = fs.openSync(filePath, 'r') - fs.readSync(fd, fileSignature, 0, pngSignature.length, 0) - fs.closeSync(fd) - - // Check if the file signature matches the PNG signature. - return pngSignature.equals(fileSignature) -} - -export const testIf = (condition: boolean, ...args: Parameters) => - condition ? test(...args) : test.skip(...args) - -test.skip('This suite contains utilities without any unittests.', () => undefined) diff --git a/src/api-types/checkin.ts b/src/api-types/checkin.ts new file mode 100644 index 0000000..626421f --- /dev/null +++ b/src/api-types/checkin.ts @@ -0,0 +1,27 @@ +// Response from API https://shopee.tw/mkt/coins/api/v2/checkin_new + +export interface CheckinResponse { + code: number + msg: string + data: Data +} + +export interface Data { + '@timestamp': Date + 'check_in_day': number + 'checkin_list': [number, number, number, number, number, number, number] | null + 'dataview_type': string + 'deviceid': string + 'devicetype': string + 'err_msg': string + 'increase_coins': number + 'increase_time': number + 'ip_addr': string + 'logid': string + 'rule_id': number + 'success': boolean + 'timestamp': number + 'today_index': number + 'userid': string + 'username': string +} diff --git a/src/api-types/coins.ts b/src/api-types/coins.ts new file mode 100644 index 0000000..7839e27 --- /dev/null +++ b/src/api-types/coins.ts @@ -0,0 +1,16 @@ +// Response from API https://shopee.tw/mkt/coins/api/v1/cs/coins + +export type UnknownCoinsResponse = CoinsResponse | ErrorCoinsResponse + +export interface CoinsResponse { + coins: number + logid: string + ts: number + userid: string + username: string +} + +export interface ErrorCoinsResponse { + code: number // 401 indicated invalid cookie + msg: string +} diff --git a/src/api-types/settings.ts b/src/api-types/settings.ts new file mode 100644 index 0000000..1f01e53 --- /dev/null +++ b/src/api-types/settings.ts @@ -0,0 +1,32 @@ +// Response from API https://shopee.tw/mkt/coins/api/v2/settings + +export interface SettingsResponse { + code: number + msg: string + data: Data +} + +interface Data { + '@timestamp': Date + 'activity_id': number + 'asset_setting': string + 'checked_in_today': boolean + 'checked_in_today_amount': number + 'checkin_list': [number, number, number, number, number, number, number] + 'dataview_type': string + 'deviceid': string + 'devicetype': string + 'fraud_detected': boolean + 'highlight': number[] + 'ip_addr': string + 'last_prize_type': number + 'logid': string + 'login': boolean + 'slot_id': number + 'subscribe': boolean + 'timestamp': number + 'today_index': number + 'uniqueid': string + 'userid': string + 'username': string +} diff --git a/src/bot.ts b/src/bot.ts new file mode 100644 index 0000000..515f905 --- /dev/null +++ b/src/bot.ts @@ -0,0 +1,129 @@ +import logger from 'loglevel' + +import type { CheckinResponse } from '@/api-types/checkin' +import type { CoinsResponse, UnknownCoinsResponse } from '@/api-types/coins' +import type { SettingsResponse } from '@/api-types/settings' +import { parseCookie } from '@/cookie' +import { InvalidCookieError, UserNotLoggedInError } from '@/errors' + +export interface CheckinHistory { + amounts: [number, number, number, number, number, number, number] + checkedInToday: boolean + todayIndex: number +} + +export default class ShopeeBot { + constructor(private readonly cookie: string) {} + + private async getCoinsApiResponseBody(): Promise { + const url = 'https://shopee.tw/mkt/coins/api/v1/cs/coins' + const fetchResult = await fetch(url, { + method: 'GET', + // eslint-disable-next-line unicorn/no-null + body: null, + headers: { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'cookie': this.cookie, + 'pragma': 'no-cache', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' + } + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const result: UnknownCoinsResponse = await fetchResult.json() + if ('code' in result) { + if (result.code === 401) { + throw new InvalidCookieError(`Shopee server: ${result.msg}`) + } + + // Unexpected error. + throw new Error(`Shopee server: ${result.msg}`) + } + + return result + } + + async checkin(): Promise { + const checkinApiUrl = 'https://shopee.tw/mkt/coins/api/v2/checkin_new' + const cookieItems = parseCookie(this.cookie) + if (!cookieItems.shopee_webUnique_ccd) { + throw new InvalidCookieError('Missing required cookie: shopee_webUnique_ccd') + } + const dfp = decodeURIComponent(cookieItems.shopee_webUnique_ccd) + const requestBody = JSON.stringify({ dfp }) + const fetchResult = await fetch(checkinApiUrl, { + method: 'POST', + body: requestBody, + headers: { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'content-type': 'application/json;charset=UTF-8', + 'cookie': this.cookie, + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' + } + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const responseBody: CheckinResponse = await fetchResult.json() + return responseBody.data.success ? responseBody.data.increase_coins : false + } + + async getBalance(): Promise { + const coinsResponseBody = await this.getCoinsApiResponseBody() + logger.debug(coinsResponseBody) + return coinsResponseBody.coins + } + + async getCheckinHistory(): Promise { + const settingsApiUrl = 'https://shopee.tw/mkt/coins/api/v2/settings' + const fetchResult = await fetch(settingsApiUrl, { + method: 'GET', + // eslint-disable-next-line unicorn/no-null + body: null, + headers: { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'cookie': this.cookie, + 'pragma': 'no-cache', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' + } + }) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const body: SettingsResponse = await fetchResult.json() + + if (body.data.userid === '-1') { + throw new UserNotLoggedInError() + } + + return { + amounts: body.data.checkin_list, + checkedInToday: body.data.checked_in_today, + todayIndex: body.data.today_index - 1 + } + } + + async getLoginUser(): Promise { + const body = await this.getCoinsApiResponseBody() + if (body.userid === '-1') { + throw new UserNotLoggedInError() + } + return body.username + } +} diff --git a/src/cookie.ts b/src/cookie.ts new file mode 100644 index 0000000..df0a872 --- /dev/null +++ b/src/cookie.ts @@ -0,0 +1,15 @@ +import { InvalidCookieError } from './errors' + +export function parseCookie(cookie: string): Record { + return cookie.split(';').reduce>((acc, cookieString) => { + const [key, value] = cookieString.split('=').map((s) => s.trim()) + if (!key) { + throw new InvalidCookieError('Invalid cookie string: missing key') + } + if (!value) { + throw new InvalidCookieError('Invalid cookie string: missing value') + } + acc[key] = value + return acc + }, {}) +} diff --git a/src/errors.ts b/src/errors.ts new file mode 100644 index 0000000..4334d17 --- /dev/null +++ b/src/errors.ts @@ -0,0 +1,19 @@ +import { CustomError } from 'ts-custom-error' + +export class InvalidCookieError extends CustomError {} + +export class UserNotLoggedInError extends CustomError { + constructor() { + super('User is not logged in.') + } +} + +// TODO: Use ShopeeError if status code is 2XX but response body contains error messages. +export class ShopeeError extends CustomError { + constructor( + public readonly code: number, + msg: string + ) { + super(msg) + } +} diff --git a/src/exit-code.ts b/src/exit-code.ts index 4cf1d21..26ed0f6 100644 --- a/src/exit-code.ts +++ b/src/exit-code.ts @@ -1,14 +1,10 @@ -export enum ExitCode { +enum ExitCode { SUCCESS = 0, ALREADY_RECEIVED = 1, - NEED_SMS_AUTH = 2, - CANNOT_SOLVE_PUZZLE = 3, - OPERATION_TIMEOUT_EXCEEDED = 4, - LOGIN_DENIED = 6, - NEED_EMAIL_AUTH = 7, - SHOPEE_ERROR = 10, - TOO_MUCH_TRY = 69, - INVALID_OPTIONS = 77, - WRONG_PASSWORD = 87, - UNKNOWN_ERROR = 88 + INVALID_COOKIE = 2, + LOGIN_DENIED = 3, + INVALID_OPTIONS = 87, + UNKNOWN_ERROR = 255 } + +export default ExitCode diff --git a/src/index.ts b/src/index.ts index 54248eb..f07402d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,162 +1,210 @@ #!/usr/bin/env node -import fs from 'node:fs/promises' -import path from 'node:path' +import fs from 'node:fs' -import { program } from 'commander' +import { Option, program } from 'commander' import logger from 'loglevel' -import { ExitCode } from '@/exit-code' -import Bot from '@/tw-shopee-bot' -import { isValidPassword, version } from '@/util' +import ShopeeBot, { type CheckinHistory } from '@/bot' +import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/errors' +import ExitCode from '@/exit-code' -const majorVersion = version.split('.')[0] -program - .name(`docker run hyperbola/shopee-coins-bot:${majorVersion}`) - .description('A check-in bot for Shopee.') - .option('-u, --user ', 'shopee username') - .option('-p, --pass ', 'shopee password') - .option('-P, --path-to-pass ', 'password file') - .option('-c, --cookie ', 'cookie file') - .option('-i, --ignore-password', 'do not save username and password with cookies') - .option('-x, --no-sms', 'do not use SMS login') - .option('-y, --no-email', 'do not use email login') - .option('-q, --quiet', 'do not output message') - .option('-s, --screenshot ', 'directory to save screenshot if checkin failed') - .option('-f, --force', 'no error if coins already received') - .version(version) - .exitOverride((e) => process.exit(e.exitCode === 1 ? ExitCode.INVALID_OPTIONS : e.exitCode)) +function handleError(e: unknown): never { + if (e instanceof InvalidCookieError) { + logger.error('Invalid cookie.') + process.exit(ExitCode.INVALID_COOKIE) + } -const args = program.parse(process.argv).opts() + if (e instanceof UserNotLoggedInError) { + logger.error('You are not logged in. Is your cookie expired?') + process.exit(ExitCode.LOGIN_DENIED) + } -if (program.args.length) { - logger.error('Unknown option: %s', program.args[0]) - process.exit(ExitCode.INVALID_OPTIONS) -} + if (e instanceof ShopeeError) { + logger.error('Shopee server: %s', e.message) + logger.debug('Error code: %d', e.code) + process.exit(ExitCode.UNKNOWN_ERROR) + } -if (args.quiet) { - if (process.env.DEBUG) { - logger.setDefaultLevel('debug') - logger.warn('Option `--quiet` is ignored in debug mode.') - } else { - logger.setDefaultLevel('warn') + // Unexpected error. + if (e instanceof Error) { + logger.debug(e.stack) } -} else if (process.env.DEBUG) { - logger.setDefaultLevel('debug') -} else { - logger.setDefaultLevel('info') + const errMsg: unknown = e instanceof Error ? e.message : e + logger.error('Unexpected error: %s', typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg)) + process.exit(ExitCode.UNKNOWN_ERROR) } -function getUsername(): string | undefined { - return process.env.USERNAME || args.user -} +function readCookieFromFile(path: string): string { + let cookieContent: string + try { + cookieContent = fs.readFileSync(path, 'utf8') + } catch (e: unknown) { + handleError(e) + } -async function getPassword(): Promise { - let pass = process.env.PASSWORD - if (pass) { - return pass + const lines = cookieContent.split('\n') + if (lines.length === 0) { + logger.error('Cookie is empty.') + process.exit(ExitCode.INVALID_COOKIE) } - pass = args.pass - if (pass) { - logger.warn( - 'Passing password from command line is considered insecure.', - 'Should use environment variable or password file.' - ) - logger.warn('Option `--pass` is deprecated and will be removed in the future.') - return pass + // @ts-expect-error: lines[1] is string + if (lines.length > 2 || (lines.length === 2 && lines[1].length > 0)) { + logger.warn('Found more than one lines in cookie file; only the first line will be read.') } + // @ts-expect-error: lines[0] is string + const cookie: string = lines[0] - // Try to read password from file. - let passPath: string | undefined = process.env.PATH_PASS || args.pathToPass - if (!passPath) { - return undefined + if (cookie.length === 0) { + logger.error('Cookie is empty.') + process.exit(ExitCode.INVALID_COOKIE) } - passPath = path.resolve(passPath) - logger.debug('Try to read password: %s', passPath) - try { - pass = await fs.readFile(passPath, 'utf8') - - // Get the first line of password file. - const passwordLines = pass.split('\n') - if (passwordLines.length > 1) { - logger.warn( - 'Read more than one lines from password file.', - 'Only the first line is considered password.' - ) + return cookie +} + +const version: string = process.env.VERSION ?? 'Development' +program + .name(`docker run hyperbola/shopee-coins-bot:${version}`) + .description('Give me Shopee coins!') + .version(version) + +program + .option('-q, --quiet', 'suppress output message', false) // Don't wrap + .hook('preAction', (thisCommand) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const quietOption = thisCommand.opts().quiet + if (quietOption) { + if (process.env.DEBUG) { + logger.setDefaultLevel('debug') + logger.warn('Option `--quiet` is ignored in debug mode.') + } else { + logger.setDefaultLevel('warn') + } + } else if (process.env.DEBUG) { + logger.setDefaultLevel('debug') + } else { + logger.setDefaultLevel('info') } + }) - pass = passwordLines[0] - logger.debug('Password read from file.') - return pass - } catch (e: unknown) { - logger.error('Failed to read password from file: %s', passPath) - throw e - } -} +let cookie: string +program + .requiredOption('-c, --cookie ', 'path to cookie file') + .hook('preAction', (thisCommand) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const cookieOption: string = thisCommand.opts().cookie + cookie = readCookieFromFile(cookieOption) + }) -function getCookies(): string | undefined { - const cookie = process.env.COOKIE || args.cookie - return cookie && path.resolve(cookie) -} +program + .command('checkin') + .description('Checkin to get Shopee coins') + .option('-f --force', 'force checkin even if already checked in', false) + .action(async (options) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const force = options.force + const bot = new ShopeeBot(cookie) + let result: number | false + + try { + result = await bot.checkin() + } catch (e: unknown) { + handleError(e) + } -async function main() { - logger.info('Start shopee coins bot v%s.', version) - logger.debug('Dump arguments:\n%s', JSON.stringify(args)) + if (typeof result === 'number') { + // Checkin succeeded. + logger.info(`Checkin succeeded; received coins: ${result}`) + process.exit(0) + } - const username: string | undefined = getUsername() - const password: string | undefined = await getPassword() - const cookies: string | undefined = getCookies() - const smsLogin: boolean = args.sms - const emailLogin: boolean = args.email - const ignorePassword: boolean = args.ignorePassword - const screenshot: string | undefined = args.screenshot + // Already checked in. + if (force) { + logger.info('Already checked in.') + process.exit(0) + } - if (ignorePassword) { - logger.warn('Option `--ignore-password` is deprecated and will be removed in the future.') - } + logger.error('Already checked in.') + process.exit(ExitCode.ALREADY_RECEIVED) + }) - if (!cookies && (!username || !password)) { - // Neither cookie nor password is given. - logger.error('Failed to login. Missing username or password.') - process.exit(ExitCode.WRONG_PASSWORD) - } +program + .command('balance') + .description('Get my Shopee coins balance') + .action(async () => { + const bot = new ShopeeBot(cookie) + let balance: number + try { + balance = await bot.getBalance() + } catch (e: unknown) { + handleError(e) + } + console.log(balance) + }) - // On v1.0.9 strict password checking was removed because of issue #4; log warning message - // instead. - if (password && !isValidPassword(password)) { - logger.warn( - 'Password length does not meet the requirement (length 8-16).', - 'Was this password set long time ago?' - ) - logger.warn( - 'I will let you go. Please refer to this issue:', - 'https://github.com/wdzeng/shopee-coins-bot/issues/4' - ) - } +program + .command('history') + .description('Get my Shopee coins checkin history') + .addOption(new Option('-o, --output [format]').choices(['raw', 'json']).default('raw')) + .action(async (options) => { + const bot = new ShopeeBot(cookie) + let history: CheckinHistory + try { + history = await bot.getCheckinHistory() + } catch (e: unknown) { + handleError(e) + } - // Warn if using screenshot in kelly image. - if (process.env.IMAGE_VARIANT === 'kelly' && screenshot) { - logger.warn('You are using kelly image. You may not see CJK characters in screenshots.') - } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + const outputFormat: 'raw' | 'json' = options.output + if (outputFormat === 'json') { + console.log(JSON.stringify(history)) + process.exit(0) + } - // Run bot. - const bot = new Bot(username, password, cookies) - let result: number - try { - result = await bot.run(!smsLogin, !emailLogin, ignorePassword, screenshot) - } catch { - // Unknown error. - result = ExitCode.UNKNOWN_ERROR - } + let outputResult = '' + for (let i = 0; i < 7; i++) { + const checkedIn = + i < history.todayIndex || (i === history.todayIndex && history.checkedInToday) + outputResult += checkedIn ? '✅' : '⬜' + outputResult += ' ' + outputResult += history.amounts[i]?.toFixed(2) + if (i === history.todayIndex) { + outputResult += ' <' + } + outputResult += '\n' + } + console.log(outputResult) + }) - // Update exit code if force is set. - if (result === 1 && args.force) { - result = 0 - } +program + .command('whoami') + .description('Get my Shopee username') + .action(async () => { + const bot = new ShopeeBot(cookie) + let username + try { + username = await bot.getLoginUser() + } catch (e: unknown) { + handleError(e) + } + console.log(username) + process.exit(0) + }) + +// Override exit code when user gives invalid arguments. +program.exitOverride((e) => process.exit(e.exitCode === 1 ? ExitCode.INVALID_OPTIONS : e.exitCode)) + +// If no command is matched, show help message. +program.action(() => { + program.help({ error: true }) +}) - process.exit(result) +// If user does not give any arguments, suppress missing argument error message; show help message. +if (process.argv.length === 2) { + program.help({ error: true }) } -await main() +program.parse() diff --git a/src/text.ts b/src/text.ts deleted file mode 100644 index 8bc2d2e..0000000 --- a/src/text.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const COIN_RECEIVED = '明天再回來' -export const FAILURE = '很抱歉,您的身份驗證已遭到拒絕。' -export const PLAY_PUZZLE = '點擊以重新載入頁面' -export const RECEIVE_COIN = '完成簽到' -export const SHOPEE_REWARD = '蝦幣獎勵' -export const TOO_MUCH_TRY = '您已達到今日驗證次數上限。' -export const USE_SMS = '使用簡訊驗證' -export const SMS_SENT = '您的驗證碼已透過簡訊傳送至' -export const USE_EMAIL_LINK = '透過電子郵件連結驗證' -export const WRONG_PASSWORDS = [ - '你的帳號或密碼不正確,請再試一次', - '登入失敗,請稍後再試或使用其他登入方法', - '您輸入的帳號或密碼不正確,若遇到困難,請重設您的密碼。' -] -export const ERROR_TRY_AGAIN = '發生錯誤,請再試一次。' diff --git a/src/tw-shopee-bot.ts b/src/tw-shopee-bot.ts deleted file mode 100644 index ff1f7f0..0000000 --- a/src/tw-shopee-bot.ts +++ /dev/null @@ -1,503 +0,0 @@ -import fs from 'node:fs/promises' -import path from 'node:path' - -import logger from 'loglevel' -import { - Browser, - Builder, - By, - type ChromiumWebDriver, - type IWebDriverOptionsCookie, - error, - until -} from 'selenium-webdriver' -import chrome from 'selenium-webdriver/chrome.js' - -import { ExitCode } from '@/exit-code' -import * as Text from '@/text' -import { xpathByText } from '@/util' - -const TIMEOUT_AUTH = 10 * 60 * 1000 // 10 min -const TIMEOUT_OPERATION = 2 * 60 * 1000 // 2 min - -interface ShopeeCredential { - username: string | undefined - password: string | undefined - cookies: IWebDriverOptionsCookie[] -} - -export default class TaiwanShopeeBot { - private driver!: ChromiumWebDriver - - constructor( - private username: string | undefined, - private password: string | undefined, - private pathCookie: string | undefined - ) {} - - private async tryLogin(): Promise { - logger.info('Start to login shopee.') - - // Go to the login page. If the user is already logged in, the webpage will be soon redirected - // to the coin check-in page. Since the login form still shows temporarily in this case, we - // could not determine if the user is not logged in even if the login form appears. An - // alternative way is to wait for a delay (4s), and if the webpage stays at the login page, we - // assert that the user is not logged in. - const urlLogin = - 'https://shopee.tw/buyer/login?from=https%3A%2F%2Fshopee.tw%2Fuser%2Fcoin&next=https%3A%2F%2Fshopee.tw%2Fshopee-coins' - await this.driver.get(urlLogin) - await new Promise((res) => setTimeout(res, 4000)) - const curUrl = await this.driver.getCurrentUrl() - logger.debug('Currently at url: %s', curUrl) - - const urlCoin = 'https://shopee.tw/shopee-coins' - if (curUrl === urlCoin) { - // The webpage is redirected to the coin check-in page and therefore the - // User must have been logged in. - logger.info('Already logged in.') - return undefined - } - // The webpage stays at the login page after the delay (4s). We assert that the user is not - // logged in. - - // If username or password is not specified, the login fails. - if (!this.username || !this.password) { - logger.error('Failed to login. Missing username or password.') - return ExitCode.WRONG_PASSWORD - } - - // Now try to fill the login form and submit it. - logger.info('Try to login by username and password.') - - // Fill username and password inputs. - const inputUsername = await this.driver.findElement(By.name('loginKey')) - await inputUsername.sendKeys(this.username) - const inputPassword = await this.driver.findElement(By.name('password')) - await inputPassword.sendKeys(this.password) - - // Submit form. - // Wait until the login button is enabled. - const btnLogin = await this.driver.findElement(By.xpath(xpathByText('button', '登入'))) - await this.driver.wait(until.elementIsEnabled(btnLogin), TIMEOUT_OPERATION) - // Do not await for this click since it may hang. - btnLogin.click() - logger.info('Login form submitted. Waiting for redirect.') - - // Wait for something happens. - const xpath = [ - ...Text.WRONG_PASSWORDS.map((e) => xpathByText('div', e)), - xpathByText('button', Text.PLAY_PUZZLE), - xpathByText('div', Text.USE_SMS), - xpathByText('div', Text.TOO_MUCH_TRY), - xpathByText('div', Text.SHOPEE_REWARD), - xpathByText('div', Text.USE_EMAIL_LINK) - ].join('|') - const result = await this.driver.wait(until.elementLocated(By.xpath(xpath)), TIMEOUT_OPERATION) - const text = await result.getText() - - if (text === Text.SHOPEE_REWARD) { - // Login succeeded. - logger.info('Login succeeded.') - return undefined - } - if (Text.WRONG_PASSWORDS.includes(text)) { - // Wrong password. - logger.error('Login failed: wrong password.') - return ExitCode.WRONG_PASSWORD - } - if (text === Text.PLAY_PUZZLE) { - // Need to play puzzle. - logger.error('Login failed: I cannot solve the puzzle.') - return ExitCode.CANNOT_SOLVE_PUZZLE - } - if (text === Text.USE_SMS) { - // Need to authenticate via SMS link. - logger.warn('Login failed: please login via SMS.') - return ExitCode.NEED_SMS_AUTH - } - if (text === Text.USE_EMAIL_LINK) { - // Need to authenticate via email link. - logger.warn('Login failed: please login via email.') - return ExitCode.NEED_EMAIL_AUTH - } - - // Unknown error. - logger.debug('Unexpected error occurred. Fetched text by xpath: %s', text) - throw new Error('Unknown error occurred when trying to login.') - } - - private async tryReceiveCoin(): Promise { - const xpath = `${xpathByText('button', Text.RECEIVE_COIN)} | ${xpathByText( - 'button', - Text.COIN_RECEIVED - )}` - await this.driver.wait(until.elementLocated(By.xpath(xpath)), TIMEOUT_OPERATION) - const btnReceiveCoin = await this.driver.findElement(By.xpath(xpath)) - - // Check if coin is already received today. - const text = await btnReceiveCoin.getText() - if (text.startsWith(Text.COIN_RECEIVED)) { - // Already received. - logger.info('Coin already received.') - return ExitCode.ALREADY_RECEIVED - } - - await btnReceiveCoin.click() - await this.driver.wait( - until.elementLocated(By.xpath(xpathByText('button', Text.COIN_RECEIVED))) - ) - - logger.info('Coin received.') - return ExitCode.SUCCESS - } - - private async waitUntilLoginPermitted(): Promise { - let result: 'success' | 'foul' - try { - const success = new Promise<'success'>((res, rej) => { - this.driver - .wait(until.urlMatches(/^https:\/\/shopee.tw\/shopee-coins(\?.*)?$/), TIMEOUT_AUTH) - .then(() => res('success')) - .catch(rej) - }) - const foul = new Promise<'foul'>((res, rej) => { - this.driver - .wait(until.elementLocated(By.xpath(xpathByText('div', Text.FAILURE))), TIMEOUT_AUTH) - .then(() => res('foul')) - .catch(rej) - }) - result = await Promise.any([success, foul]) - } catch (e: unknown) { - // Timeout error. - if ( - e instanceof AggregateError && - e.errors.length === 2 && - e.errors[0] instanceof error.TimeoutError && - e.errors[1] instanceof error.TimeoutError - ) { - logger.error('You are too slow. Bye bye.') - throw e.errors[0] - } - - // Unexpected error. - throw e - } - - if (result === 'success') { - // Login permitted. - logger.info('Login permitted.') - return undefined - } - - // Login denied. - logger.error('Login denied.') - return ExitCode.LOGIN_DENIED - } - - private async tryLoginWithSmsLink(): Promise { - // Wait until the '使用簡訊驗證' button is available. - await this.driver.wait( - until.elementLocated(By.xpath(xpathByText('div', Text.USE_SMS))), - TIMEOUT_OPERATION - ) - - // Click the '使用簡訊驗證' button. - const btnLoginWithLink = await this.driver.findElement( - By.xpath(xpathByText('div', Text.USE_SMS)) - ) - await btnLoginWithLink.click() - logger.debug('Clicked "使用簡訊驗證" button. Waiting for redirect.') - - // Wait until the page is redirect. Set timeout to be 8 seconds. - await this.driver.wait(until.urlContains('https://shopee.tw/verify/otp'), 8000) - - const validatePageLoaded = async (timeout: number) => { - const start = Date.now() - - while (Date.now() < start + timeout) { - // Check if reaching daily limits. - const reachLimit = await this.driver.findElements( - By.xpath(xpathByText('div', Text.TOO_MUCH_TRY)) - ) - if (reachLimit.length > 0) { - // Failed because reach limits. - logger.error('Cannot use SMS link to login: reach daily limits.') - return ExitCode.TOO_MUCH_TRY - } - - // Check if puzzle quiz is required. - const requirePuzzleQuiz = await this.driver.findElements( - By.xpath(xpathByText('button', Text.PLAY_PUZZLE)) - ) - if (requirePuzzleQuiz.length > 0) { - logger.error('Login failed: I cannot solve the puzzle.') - return ExitCode.CANNOT_SOLVE_PUZZLE - } - - // Check if Shopee website reports any error. - const errorTryAgain = await this.driver.findElements( - By.xpath(xpathByText('div', Text.ERROR_TRY_AGAIN)) - ) - if (errorTryAgain.length > 0) { - logger.error('Failed to login with SMS authentication.') - return ExitCode.SHOPEE_ERROR - } - - // Check if SMS is sent out. - const smsSent = await this.driver.findElements(By.xpath(xpathByText('div', Text.SMS_SENT))) - if (smsSent.length > 0) { - return true - } - } - - // Unexpected error. - logger.error('Redirect timeout exceeds.') - return ExitCode.OPERATION_TIMEOUT_EXCEEDED - } - - // Wait for page loaded. 10s should be enough. - const result = await validatePageLoaded(10 * 1000) - if (result !== true) { - return result - } - - // Now user should click the link sent from Shopee to her mobile via SMS. - // - // Wait for user completing the process; by the time the website should be redirected to coin - // page. - logger.warn( - 'An SMS message is sent to your mobile.', - 'Once you click the link I will keep going.', - 'I will wait for you and please complete it in 10 minutes.' - ) - return this.waitUntilLoginPermitted() - } - - private async tryLoginWithEmailLink(): Promise { - // Wait until the '透過電子郵件連結驗證' button is available. - await this.driver.wait( - until.elementLocated(By.xpath(xpathByText('div', Text.USE_EMAIL_LINK))), - TIMEOUT_OPERATION - ) - - // Click the '透過電子郵件連結驗證' button. - const btnLoginWithLink = await this.driver.findElement( - By.xpath(xpathByText('div', Text.USE_EMAIL_LINK)) - ) - await btnLoginWithLink.click() - - // Wait until the page is redirect. - await this.driver.wait(until.urlIs('https://shopee.tw/verify/email-link')) - - // TODO: check if reaching daily limits. - - // Now user should click the link sent from Shopee to her inbox. - // - // Wait for user completing the process; by the time the website should be redirected to coin - // page. - logger.warn( - 'An authentication mail is sent to your inbox.', - 'Once you click the link I will keep going.', - 'I will wait for you and please complete it in 10 minutes.' - ) - return this.waitUntilLoginPermitted() - } - - private async saveCookies(ignorePassword: boolean): Promise { - logger.info('Start to save cookie.') - - try { - const cookies = await this.driver.manage().getCookies() - const json: ShopeeCredential = { - cookies, - password: ignorePassword ? undefined : this.password, - username: ignorePassword ? undefined : this.username - } - - await fs.writeFile(this.pathCookie as string, JSON.stringify(json)) - logger.info('Cookie saved.') - } catch (e: unknown) { - // Suppress error. - if (e instanceof Error) { - logger.warn('Failed to save cookie: %s', e.message) - } else { - logger.warn('Failed to save cookie.') - } - } - } - - private async loadCookies(ignorePassword: boolean): Promise { - logger.info('Start to load cookies.') - - // Connect to dummy page. - const urlHome = 'https://shopee.tw/' - await this.driver.get(urlHome) - - // Try to load cookies. - try { - const cookieBuffer = await fs.readFile(this.pathCookie as string) - - // If the json is an array, then the cookie is generate by bot version <= v1.0.2. - // @ts-expect-error: Parse a buffer to JSON object is OK. - const json: IWebDriverOptionsCookie[] | ShopeeCredential = JSON.parse(cookieBuffer) - let cookies: IWebDriverOptionsCookie[] - if (Array.isArray(json)) { - // Old version bot (<= v1.0.2). - logger.warn('The cookies are saved by old version shopee coins bot.') - cookies = json - } else { - if (!ignorePassword) { - // If username or password is not explicitly set, load it from credentials. - this.username ||= json.username - this.password ||= json.password - } - cookies = json.cookies - } - - const options = this.driver.manage() - await Promise.all(cookies.map((cookie) => options.addCookie(cookie))) - logger.info('Cookies loaded.') - } catch (e: unknown) { - // Cannot load cookies; ignore. This may be due to invalid cookie string pattern. - if (e instanceof Error) { - logger.error('Failed to load cookies: %s', e.message) - } else { - logger.error('Failed to load cookies.') - } - } - } - - private async initDriver(): Promise { - const options = new chrome.Options() - options - .addArguments('--start-maximized') - .addArguments('--headless') - .addArguments('--disable-extensions') - .addArguments('--no-sandbox') - .addArguments('--disable-dev-shm-usage') - .addArguments('--disable-gpu') - .addArguments('--lang=zh-TW') - // Shopee server now detects if the bot is running in headless mode. - .addArguments( - '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36' - ) - .addArguments('--disable-blink-features') - .addArguments('--disable-blink-features=AutomationControlled') - .excludeSwitches('enable-automation') - .excludeSwitches('useAutomationExtension') - - if (process.env.DEBUG) { - logger.debug('Open debug port on 9222.') - options.addArguments('--remote-debugging-port=9222') - } - - this.driver = (await new Builder() - .forBrowser(Browser.CHROME) - .setChromeOptions(options) - .build()) as ChromiumWebDriver - - await this.driver.sendDevToolsCommand('Page.addScriptToEvaluateOnNewDocument', { - source: `Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) ` - }) - } - - private async runBot( - disableSmsLogin: boolean, - disableEmailLogin: boolean, - ignorePassword: boolean - ): Promise { - if (this.pathCookie === undefined) { - logger.info('No cookies given. Will try to login using username and password.') - } else { - await this.loadCookies(ignorePassword) - } - - let result: number | undefined = await this.tryLogin() - if (result === ExitCode.NEED_SMS_AUTH) { - // Login failed. Try use the SMS link to login. - if (disableSmsLogin) { - logger.error('SMS authentication is required.') - return result - } - result = await this.tryLoginWithSmsLink() - } else if (result === ExitCode.NEED_EMAIL_AUTH) { - // Login failed. Try use email link to login. - if (disableEmailLogin) { - logger.error('Email authentication is required.') - return result - } - result = await this.tryLoginWithEmailLink() - } - - if (result !== undefined) { - // Failed to login. - return result - } - - // Now we are logged in. - - // Save cookies. - if (this.pathCookie !== undefined) { - await this.saveCookies(ignorePassword) // Never raise error - } - - // Receive coins. - return this.tryReceiveCoin() - } - - private async takeScreenshot(screenshotPath: string): Promise { - const png = await this.driver.takeScreenshot() - const filename = path.resolve(screenshotPath, 'screenshot.png') - try { - await fs.writeFile(filename, png, 'base64') - logger.error('A screenshot has been put at %s.', filename) - } catch (e: unknown) { - if (e instanceof Error) { - logger.error('Failed to save screenshot: %s', e.message) - } else { - logger.error('Failed to save screenshot.') - } - } - } - - async run( - disableSmsLogin: boolean, - disableEmailLogin: boolean, - ignorePassword: boolean, - screenshotPath: string | undefined - ): Promise { - await this.initDriver() - - try { - const exitCode = await this.runBot(disableSmsLogin, disableEmailLogin, ignorePassword) - if ( - exitCode !== 0 && // If not succeeded then take a screenshot. - screenshotPath - ) { - await this.takeScreenshot(screenshotPath) - } - return exitCode - } catch (e: unknown) { - // If not succeeded then take a screenshot. - if (screenshotPath) { - await this.takeScreenshot(screenshotPath) - } - - if (e instanceof error.TimeoutError) { - logger.error('Operation timeout exceeded.') - return ExitCode.OPERATION_TIMEOUT_EXCEEDED - } - - if (e instanceof Error) { - logger.error('Unexpected error: %s', e.message) - } else { - logger.error('Unexpected error occurred.') - logger.debug(e) - } - - throw e - } finally { - await this.driver.close() - } - } -} diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index 052b9ab..0000000 --- a/src/util.ts +++ /dev/null @@ -1,10 +0,0 @@ -export function xpathByText(tag: string, text: string): string { - // There should be no text contains quotes. - return `//${tag}[contains(text(), "${text}")]` -} - -export function isValidPassword(p: string | undefined): boolean { - return Boolean(p && p.length >= 8 && p.length <= 16) -} - -export const version: string = process.env.VERSION || 'Development' diff --git a/tsconfig.json b/tsconfig.json index 03ebc42..49fe4c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "module": "es2022", "moduleResolution": "bundler", "esModuleInterop": true, - "lib": ["ES2022"], + "lib": ["ES2022", "DOM"], "rootDir": "src", "baseUrl": ".", "paths": { From 41a83b8bcfbaa852203893c21a6634e1323b3472 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 05:46:20 +0800 Subject: [PATCH 03/34] docs: update docs and demo pictures for v2 --- README.md | 158 +++++++++++++++++++---------------- docs/how-to-get-cookie.md | 16 ++++ res/cookie-instruction-1.png | Bin 0 -> 57531 bytes res/cookie-instruction-2.png | Bin 0 -> 140991 bytes 4 files changed, 104 insertions(+), 70 deletions(-) create mode 100644 docs/how-to-get-cookie.md create mode 100644 res/cookie-instruction-1.png create mode 100644 res/cookie-instruction-2.png diff --git a/README.md b/README.md index f2e959c..f444fe8 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,13 @@ [![ghcr](https://badgen.net/badge/icon/ghcr/black?icon=github&label=)](https://github.com/wdzeng/shopee-coins-bot/pkgs/container/shopee-coins-bot) > [!IMPORTANT] -> 蝦皮的登入驗證程序不時更新且越來越嚴格,維護登入步驟花費不少時間與力氣。正在實驗的新版 -> ([v2](https://github.com/wdzeng/shopee-coins-bot/tree/features/v2)) -> 機器人將不會再支援使用帳號密碼登入,而是改用與 -> [pinkoi 簽到機器人](https://github.com/wdzeng/pinkoi-coins-bot)同樣的人工給予 cookie -> 的方式。新版機器人會在九月釋出,屆時當前 (v1) 的機器人將會停止維護。 +> 蝦皮簽到機器人 v2 還在實驗中,預計九月釋出。目前仍在使用的 v1 +> 請至[這裡](https://github.com/wdzeng/shopee-coins-bot/tree/main)。 💰💰 簽到蝦皮領蝦幣 💰💰 -這支程式針對台灣的蝦皮用戶設計,也就是 [shopee.tw](https://shopee.tw/) 網站的使用者。其他國家沒試過。 +這支程式針對台灣的蝦皮用戶設計,也就是 [shopee.tw](https://shopee.tw/) +網站的使用者。其他國家沒試過。 ## 使用方式 @@ -30,100 +28,120 @@ 以下為映像最新的 tag。其他可用的 tag 請參考 Docker Hub 或 GitHub Container Registry 頁面。 -- `latest`, `1`, `1.3`, `1.3.1` +- `edge` -### 使用說明 +## 使用說明 傳入 `--help` 可以印出使用說明。 ```sh -docker run hyperbola/shopee-coins-bot:1 --help +docker run hyperbola/shopee-coins-bot:edge --help ``` -### 帳號密碼登入 +機器人支援四個指令。 -第一次使用時,需要提供蝦皮帳號密碼,並且強烈建議設定機器人登入後儲存 cookie -的位置,以備未來機器人能夠執行自動登入。如果你不指定一個 cookie 的位置,那未來每次登入都會需要帳號與密碼。 +- `whoami`: 顯示你的蝦皮帳號。這通常是用來測試 cookie 是否可用。 +- `checkin`: 進行簽到。 +- `balance`: 顯示你的蝦幣餘額。 +- `history`: 顯示你七天內的簽到記錄。 -```sh -docker run -v /path/to/somewhere:/cookie \ - hyperbola/shopee-coins-bot:1 -u username -p password -c /cookie -``` +### 通用參數 -> [!IMPORTANT] -> 機器人進行登入期間,你可能會收到來自 shopee 的 Email -> 或手機驗證簡訊,其中會有一個驗證登入的連結。請在 10 -> 分鐘內進行驗證,在這期間機器人會等你。一旦你點了驗證簡訊後,機器人會立即繼續執行下去。 +這些參數適用於所有指令。 + +- `-c`, `--cookie `: cookie 檔案;所有指令必填 +- `-q`, `--quiet`: 不要印出提示訊息(仍會印出警告與錯誤訊息);所有指令選填 + +### 通用 Exit Code + +| Exit Code | 說明 | +| --------- | ------------------------------------------------------------------------------------------------------------- | +| `0` | 指令成功 | +| `2` | Cookie 無效;這通常是人工錯誤,像是複製貼上 cookie 時多貼或少貼了一些東西。 | +| `3` | 登入失敗;這通常是自然錯誤,像是 cookie 過期。 | +| `87` | 參數不合法。 | +| `255` | 未知錯誤。有可能是 Bug;如果無法排解,請至 [Issues](https://github.com/wdzeng/shopee-coins-bot/issues) 回報。 | -### 自動登入 +## 準備 Cookie 檔案 -如果之前有儲存過 cookie,用 cookie 登入即可,這樣就不會觸發簡訊驗證。 +所有的指令都需要 cookie 才能執行。請參考[這份](./docs/how-to-get-cookie.md)說明,將 cookie +複製貼上到一個檔案。 + +> [!IMPORTANT] +> Cookie 是敏感資料,請妥善保存。 + +然後你可以用 `-c` 或 `--cookie` 將 cookie 檔案餵給機器人,再用 `whoami` +指令確認是否登入成功。如果成功,以下指令會印出你的帳號。 ```sh -docker run -v /path/to/somewhere:/cookie hyperbola/shopee-coins-bot:1 -c /cookie +# 假設 cookie 檔案在 ~/.config/shopee/cookie +docker run -v "$HOME/.config/shopee:/config" hyperbola/shopee-coins-bot:edge -c /config/cookie whoami ``` -## 參數 +## 簽到 -所有參數都是選填。 +使用 `checkin` 指令進行簽到。 -- `-u`, `--user `: 蝦皮帳號;可以是手機、電子信箱或蝦皮 ID -- ~~`-p`, `--pass `: 蝦皮密碼~~ **DEPRECATED** -- `-P`, `--path-to-pass `: 密碼檔案 -- `-c`, `--cookie `: cookie 檔案 -- ~~`-i`, `--ignore-password`: 不要儲存密碼~~ **DEPRECATED** -- `-x`, `--no-sms`: 如果觸發簡訊驗證,直接令程式以失敗結束;預設為 `false` -- `-y`, `--no-email`: 如果觸發電子郵件驗證,直接令程式以失敗結束;預設為 `false` -- `-f`, `--force`: 如果今天已經領過蝦幣,令程式以成功作收;預設為 `false` -- `-q`, `--quiet`: 不要印出訊息;但仍會印出警告與錯誤訊息 -- `-s`, `--screenshot `: 簽到失敗時將螢幕截圖的儲存於指定資料夾下(圖檔檔名 - 為 screenshot.png) -- `-V`, `--version`: 印出版本 -- `-h`, `--help`: 印出參數說明 +```shell +docker run hyperbola/shopee-coins-bot:edge checkin +``` -如果你同時設定了帳號、密碼與 cookie,機器人會以下列順序嘗試登入: +### 簽到參數 -1. cookie -2. 帳號與密碼 +- `-f`, `--force`: 如果今天已經簽到過,不要回報錯誤。 -每次登入成功時,機器人就會將 cookie 更新至最新狀態。 +**Exit Code:** -> [!IMPORTANT] -> Cookie 是機密資料,請妥善保存。 +| Exit Code | 說明 | +| --------- | ------------------------------------------------ | +| `0` | 簽到成功。 | +| `1` | 今日已簽到過;如果傳了 `--force`,就會改為 `0`。 | -Cookie 檔案的位置以下列優先順序決定。 +## 餘額 -1. 環境變數 `COOKIE` -2. 程式參數 `--cookie` +使用 `balance` 指令顯示蝦幣餘額。以下範例顯示你有 87 個蝦幣。 + +```shell +$ docker run hyperbola/shopee-coins-bot:edge balance +87 +``` + +## 簽到記錄 + +使用 `history` 指令顯示蝦幣餘額。以下範例顯示你已經連續簽到三天,且今天已經簽到。 + +```shell +$ docker run hyperbola/shopee-coins-bot:edge history +✅ 0.05 +✅ 0.10 +✅ 0.15 < +⬜ 0.20 +⬜ 0.25 +⬜ 0.25 +⬜ 0.50 +``` + +如果你想分析 output,可以用 `--output json`,這樣印出的結果比較好分析。 + +```sh +$ docker run hyperbola/shopee-coins-bot:edge history +{"amounts":[0.05,0.1,0.15,0.2,0.25,0.25,0.5],"checkedInToday":true,"todayIndex":2} +``` -帳號以下列優先順序決定。 +### 簽到記錄參數 -1. 環境變數 `USERNAME` -2. 程式參數 `--user` +- `-o`, `--output`: Output 的格式,必須是 `raw` 或 `json` 其中之一。選填;預設為 `raw`。 -密碼以下列優先順序決定。 +### 簽到記錄 Output -1. 環境變數 `PASSWORD` -2. ~~程式參數 `--pass`~~ **DEPRECATED** -3. 環境變數 `PATH_PASS` -4. 程式參數 `--path-to-pass` +如果 `--output` 是 `raw`,會印出人眼可讀的結果。 -## Exit Code +如果 `--output` 是 `json`,其結果格式如下。 -| Exit code | 解釋 | -| --------- | ----------------------------------------------------------------- | -| 0 | 簽到成功。 | -| 1 | 今日已簽到。如果傳了 `--force` 參數,那就會改為回傳 0。 | -| 2 | 需要簡訊驗證,但你傳了 `--no-sms` 參數。 | -| 3 | 機器人遇到拼圖遊戲。這通常是因為嘗試登入次數太多,被網站 ban 掉。 | -| 4 | 操作逾時。 | -| ~~5~~ | ~~觸發電子郵件驗證。機器人尚不支援。~~ **DEPRECATED** | -| 6 | 使用者進行簡訊驗證時選擇拒絕機器人登入。 | -| 7 | 需要電子郵件驗證,但你傳了 `--no-email` 參數。 | -| 69 | 嘗試登入次數太多被 ban。 | -| 77 | 參數不合法。 | -| 87 | 帳號或密碼錯誤。 | -| 88 | 不明錯誤。 | +- `.amounts` (`number[]`): 含有七個數字的陣列,分別表示七天來每天可領的蝦幣數量。 +- `.checkedInToday` (`boolean`): 今天是否已經簽到。 +- `todayIndex` (`number`): 今天是七天中的第幾天;此值為 0-based,亦即 `0` 表第一天、`1` + 表第二天、依此類推。 ## 姊妹機器人 diff --git a/docs/how-to-get-cookie.md b/docs/how-to-get-cookie.md new file mode 100644 index 0000000..fc2b608 --- /dev/null +++ b/docs/how-to-get-cookie.md @@ -0,0 +1,16 @@ +# 如何取得 Cookie + +以下示範用中文版的 Google Chrome。 + +1. 用瀏覽器開無痕。 +2. 登入你的蝦皮帳號。建議用帳號密碼,但用第三方登入應該也是可以(沒仔細研究)。然後回到官網[首頁](https://shopee.tw)。 +3. 按 F12 打開開發者工具,選「網路」頁籤,再選「文件」子頁籤。然後按 F5 重新整理。 + + ![cookie-instruction-demo](../res/cookie-instruction-1.png) + +4. 點選 shopee.tw 項目,選「標頭」標籤,再找到「要求標頭」,然後找到「Cookie」項目。 + + ![cookie-instruction-demo](../res/cookie-instruction-2.png) + +5. 複製 cookie,如上圖大紅框。Cookie 是敏感資訊,不要外流;上圖沒有打馬賽克是因為我沒有登入。 +6. 將 cookie 貼到一個檔案中。注意 cookie 只會有一行。把檔案存起來。 diff --git a/res/cookie-instruction-1.png b/res/cookie-instruction-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2b26dddff056baa7d71a7e8c4c5341e69a02db0b GIT binary patch literal 57531 zcmZ^K1yr2PvMnJE`S1>Z)D4c7>`c%VMCCqQb$!VaUr#e}aQU9D{>fJBq%^3G1 z!z7kdFn~VJOnr*E8T6UQP+CUyMT`=mc9S;gZoExX$~ih0RinP7xTHAzc&9h( zF4bWaI&#-`A_CJLy-xE`dqop~EeZVS`U!q`D2OZ2_c*&zSoJw+y|OLWgI1f4R#jE~ z_`$BF>ok441D<1`lln9;Gc;7*E%Lzz;^nNPlibyd1zCB%ob(a)+#Tyq&=qt$S0^Ad zxY~!<+^jx|w%#v!jcN%~MukPBvge4CGGL+L2RHa(M(E8N)40``aYcz z;rgy_-RH($_g7^lWzBm?PLFpMYHDg^WMmaB=lfd~E$Qj$>@l1>Hi+rPdiXSMIHa%D6A1e&P`G ze%qWXQnP7T3-W%vb3B;A=%PqD{C3W$xgE)45uc=WdAV8iH!TY;|z&3`mQRW5brwTgZLdLk6^qp^8 zd|FP{&l1cm!}CG)ejHwVBM6^CaQF*%ckZt4uwyz-4GoR;J-m>j60x${mEG^CWuDe> z#jg7G!mgR#;ke6eV$W+CPY)YW{KJpuhog1Y2h$~5QIrfWP_NNU34fWzgs!5ZBItQ@ z_vpeWx2ijE+Z8LpEB_xqE)Q(eZ|34w)YdR1Rz$s8^f}ITtMtwxSy?o!+!qC6kC4G% zY_|zMw<|jtVojNu;-zff4+`?Wkl&fBerW7B^*;9r#)E{)_1iu_7|2)95=_%1zO~PGrH_lb=yRUh z?4^31)`D==DFE(4fBhyr{6(FKiHY|H8TfhY>vM(WEPF^y)uc>*l+Ur`|5$VO z`ue=X@dyXA>e?@SLV}UBdk9x`mAb$axu_#H1lR+iI$Q9~;`7txWZ5h4yS-m4>^CRS zW@jT49j$M>nemJkT-99h96HjE={)8i-W%{mGjHNC>H}Zb$IU*$&$U|M+v`V|^?cP9 z76dF{yk9$6umZ2A$EapNbXbUmD>YNG*kaykYC6JGZ1){F_m4YR@+vA_hq;?;9caDz zd3k%nDoRRarKK&#JwJ-n3ix<i**==-K;(@K+}km>iE5G#-?LFxZ9%21M<%4ew1e ziV6iBR{s#)l$Difx87A?U|a0ReU{!L=mBdl8Jg}k| zAL3|!2t&c+@Heqh3Ol{OzdDEtuP7=Hq5=_#z=je|nl^-1?zTrL77G+xHJv345B(^v zB-RHaxY_T`VAT~5N3&EuPfJr|92%8r-$lLdBL!>&dcU@61Z2)0h&bd|=H?=wgZ)B? z;QL3j4PTyMWEsS?`8+>iU|<+FNC-bgi9Y*1y+o3`OT5Ss^SNGWy8zpkdcwevs}e+r zw|sZci~p`X_tDLJ+<~{2mj&AtlU$fO{qpj%q$2&Y)~5mHht{)BuuT@L3eZJ_5kFU4@b0_TW{qr$~C z@w_p+(mztWjj#qIf;`oAF(m?yjD)D(8)_2Ip1--Z1+|-0T1Z}p-3wD57?%T<%58c& zIX7n41Jw?NH{ke55jo~bzY@W}{4o ztw5RYHd&oIUA$4ma~E6K9|_~>uJwXZu|-jT>kr36h=j18od3@m%$T^exExRGo)ef# zlKatf`twWh_f`)Wy4XpJUx(yPZ7pK^#rq$B^2KqffR!Y{<2ks)*fiVV{DZFh2gN+9 zq2U+7m?stRFYc~5KDN1@1G_xa-QB0Q$H+ckjLf^}x!vY9J0IW7QVE|{JYRpm z()r-&`gQ9r82#Ef{dd*F-HuI zg2MXY4G${f?ZZMzh3B)!ij=oU>+-+J)&Ccq(w337K!g)uZ&ZcX99_{uc5|(ba4%F5Eb)xI7<6v#GZ1jF4YO8M#ifp?oB17W2_j#IgT41m z#k_XISj!(^;0FknsO!nqtiH_V6>xdax)YujAx|ex2g^@uFU69b4y6=lxSt>Ikf?tOxu1s~=x?z{&Ov4Gj$r`WF-x?X}rHO^QLE z%Nle*xJVf60oeRzcA>BSeZMC9`-caQX4t@p>*6xqXL$;QQuPqGyB{5r2dsl3+LfLp z_*Wp4kyzqbxl)qX-p`Pc=amY`lg?@&^}#T8S9on#_c`q~{(PiA^{(Z)QVQqe%JU=9 z9rcbNPXo5(Qf4~?t(o25KqY6&NJp2`ARBd~r1)Kj-Q876>ZRj1?G@Ni61PB(r=SiK zHHy^v!){DYl<@gUMX4uZ`_vy;dL_!%x{X~-*<5Q;5ekIcWQpq;?4zoxI`(BC#wq5X zYb6JgS5P=u&JpmQA%tVlRlocJ04KdB>Q}2cmI}d1g!VQxZu(0(H$=~8yZn$_75$1{ zqMJEY3j+od7kZ3|4eIAh71;CTiVu6mZ>Pj>Mo#qqhGy6kjKY+*uyw--v@~#Z#&;Ret9LG6E~x+6 zIb1@@C?;;!>V{m|FJEZN*a8|l3IA~$H1q=c75r>$Y;<&VLPE_R_VyWVUg2R)F8#aN ze0Y+Q8%6J+xh(#LVzYXh^f<;``h;DUhpe}>x!bN?qM0{_bp{jWj)XJ*bIB%=TP z9S}_{^a2S49}{)xB8c0vCE zSbqnfJw2YHSs(wgZ% zLvtNENdEtiw{ey0ddf7#@ehszRuPI{A=VuwmgSA|-}mHlT`4(^4q*2p>G%+_?v1m# z2VI_oXk|>I;jQe(e=Qv)v#?M=h`;y1dPjr9QxvSEadoyKtC1MZ_oo6M=kFy9{P(s* zyQ-vtfuOl04oKI@4UUwLC5SJ)~xOQUvDRk*rDoYF^h%wmwsdmQZ z9hsCQr`;*G0KtDvf(lk^{Hkpj-#+J z)M+GKni;Jy;Tfx6+u(x(Y16N?*#HiFiHwQ;+!sUF6Gf%b3pmfESeV-XMJwreya$3?)+*R^XWKAfv% zwf^s!>hx~N-#+n@;Edu>e|c-vXAsrvaJ~s(W=vqmM$A=3MZEbC}0!7Kq;%Q6Z3mJ=&$9<{~h*bP5 z?qo3uV7|)2!qW{EzLUlJ6+u<9-5Iu%WXtmX>FNU1;Nc)Few(@99}zpGwk;Vh;Q9F# zo8K`p!8k_63OaV)B!JzVDwbQV`ThFFiF6xQ&%i}*L&r39^g0iqq4_ zx96FjEIYJ45D>f?zCU?-OsikPg)ob)+s5xaJro#?oo#y`Ez@lUgF%gwfl_!Mz>gDY z4#g!UIwJ5~J7FbE3@PSF{7(H{gX)>QinW9;UN>VjdY7bTCkM+q%}y6gEK5TelQxu` z#euDGyr!3kL?*_@MZeq6zV@cybxIPLF@8Zx0Q|Jb)sz~R$mJN+W#w@Y{Pd~2&Im{Y z8%iz`4a-PICPCGA({TLQ5;zB|`7ia@lXGNTDF0ly!eu4^g$Z&Ss{0<42!3z3WD8yu5LJ zEatrPiE`UL$8)}CIl?fxdXV=^q`FFOSq>hf&##k(2l8a)IZPLAIdsYhlpRfGW@hRZ z7K1IkvU*4*{rq%HuP4f8sGu(v1XalDI^QEJe<8a|L!da5vLF1B;&FxgByh3XE;Xpt zk_~_K!QLL0BO6sDt`HU;p2b`YCvQm0MY!oG@3vQxbW>KY(s&f*bQAG2C10ueq|H_t z@-7$CSYM^kQbFnD+tDM35z(dQ+Srr^rPq;|=^ZJVx`57-!|QBep2p**B7bCz(xRgI zHZN0aJ*Y7r2S6;0iozs~jT!0)2?>|%@2vqsR@yPH;+Xf*Vz z@@%=@$?bV60F!P2RwKjxZayfe&LmAJDJcm!pLh1_xv0oFnbeT-V;;>$;yhJ&!L&obzSj(adEK)!7HpOlLtnJ?S`n`esN|pUktXc5d3mOiU3>+ zD^q#gE5#B)7IJZguej)8YEH;&#PNzGBSUyM&>e01p4IalszqsC%!|BsxCSskzGirK->u|M$@46%y*&ef(NO&;x$$G8Tn zG+lwqt>Xgj5fC$7YwM$eMNz4tKAfE_vX#@d9)Dyk3Q=ErnUQRnM4o=XPHVir7`_T@u%EUxj4Zmq?%3YGWg2jzbm(NrG-A%WR; zUrdg|FLu~%X}smc#3$P%&en!G_7`n8>w~?lEb7$x_yh#dr#x+z=-Bg)a1IUiR8?Pr z=(srUuXi;7ax)&(Ocfwm+Wr)sA@;Rr7|3S_e^nF~6=_s{$uwy|;IEhF>fCBs%gf8_ zykwPG^Y@TqqUsj}pd^6fv2a>q@W&@k^aY zgRn!T(YCU39mw0?MfDU-)2C-vMZPu(lq?u;V)eeVrp4Va943DmJv|G3tCWH1r&mRy zJ5#D%4dA=`<7O;xYrA*fHbaI$5<@V^^CN88qe8LmB)+m0OGL2q5gnOuCD49V~#P3k~BQJMFqE{nkHT4CY zbv2ANJVbBR4gf!)WI!|q$65Y3%V^e579PFC5*2XT zS3m3RSmpY5F7||yp5wt!39Xi(wZ_LH1q<7e3zt0Kr^f}qiOY-FV%7W=PtgQBnEA|@ zuw&?8Kbm)Xp&FN*?7l+*9vB>iR$Wa(o5iT?m)*SXF8vJKj;fDXWVp@Dh$5O#|FlbG zc-49JMYre3MhH9Zo>pzKPH!jr^>|#=klkNa=3{!OxlqS=vlKyHik;iWA z`&y?$N^)|Y>|DZ^3Lx*43NE{HRadY1L1nA4b+qWBsS!Nn2c$)r-!2bkwMwrRre|i- zMJd{KYaZYa20wo>QHB?A&-Hv1I#5i=$na?@KgNQ1P5e+V!oxI*@i=MrS>Mu1wi&u5 z$}cEbq+Kg!VYL^UJJ?VnvmY*6R?nzF;s2zk7NLjjpMyc7bGLSXa>e|54_d$xYaW%V z{N2-Gz01A~YHo+1t0=UMv@2#{@Z}>8``i#o*MTCoOZ!~7T}l<&7(eD{ZqY0OjCsC! z=K_tLoZsr^RP6Z-OYXPjP9*3g(fXKH*M54Mmv?%OrTr{HQNVVS`5j^yTqBD&d0A8O zhY7PbO{$05IWb3htu~WL3XyEjmsI}xqWu*#@zZ493^i2JHE;> z>;C%CdoNH1*WcN<66@&ISJ^QZU+#2%!=G)F3QYP)w=Z9hcTq>syH$VlyHnKyZM0Z* zZSW7lV>n?CyF72L3_Xy)b63=Kc3!ts;L0pxyO9an+}zCGMkf|Ho$AMHavug{G37kZ$t=-~NVc1hikrEonoJu|NYU}qkS}-3 znyb@z^HtIsE#MviKw_L*Km=ff%^fK^E+**D_;{(%{h2b5d=%xFS|nA};G`=qUZ#Fv z4oE`f@phP``(1j1n7O;5-dCwOAL&q7OZxH_C`BDr%LHI;Q&L%q>R**SBhTod2FQCb}FsF_%a45OuwEbc%+(MZ%&Ke)bt9 zdS3LoCu2Wsxp*Jc^cJRz%8jMeqwm_j+U`#+33<9J29O~T7GZHJbqIPHh!_|t*T+yT zJv}{rZ==nS3slr|R%N*QS-WhLoe{kPWsT$cYJP7Hc5~`4>(Wxe=pzFI8cq=aB_7n&y6emVk%qL-w4*1C-yhN2w|05I2Ema^xaGydi zeJoieE>-+Jzo{oZBh)lriKT}2P^#axNO)pocOnwvf&EtuW&r*Z^aRt7Hre+%u%U}R} z?uj5%Nf!=%x$N`&=>8?4ZtNEcJ2Qn|L!ZTKB~bj#8Qhho%GdFdkD0N$_FL1Z^qs6S zpT25Pix>9hj_4qlxpozD7M35Q5$};9b4ejYAO@3ie#8GpZEo7|hmJMt58mZ`RU;h6 ztLhbJ<=)PSUZWs|W*2{W_D()tahE8Tr61}@dIO&bh8GN_bmFWzDf&f{uvxT;im78g zk&=*H@W(fQW;ResS1pj6Mc1b}1clddI2@Nbe((EJ`l~{|sdOD*{iYqqP^hz8uMKs2 zU`c+Pgx#-21R=^Heefo{r@sl3x)VDT@J>i-W*~6q%*ix;aZbQg_wG^a^9kXjp;Kqo zsTF%i#|qowe6>rdNkc$q@^iY!`WPRO-{eGzXzBK z5Kbrr3Qn~z(C`(vBh{sj>?;fW#73PUv_k)lCG3b4RKusO8>#X`4QIhDHdS=qTjlbsV|@>-b4_w+kO?%r<)DdiW-wgGkt)yO=*`| zN1UwtYd-*j?Cn~B&*p2$4BF6|mBJVF&ZQx+>3fYH}S%##G&*Zlep&CYOJeOEuyxOWnK`j7;b!eW`3yarUU8lm;>kW^NH!M!p$PRs;3aj)ijXYGvO@NmG;KFNr^zeULEMs8tYF#v|a8APcb$*gxW})0Q#3k-{ok%%3lE ze(R5Bg8?xS;q>sXQ9`E@^x32)HoZ#B=AS=I{{*XPmw{=G2$~<89hCk~C^NI-H1RR) zNihlkT{)-t@>Va9B+WJ;vbU=NF7S-TZv9Y4oF?jJ5HqgsQV-LYn`Osp%;oDx2J z(7L&P1{exAU?@*cA9{X#oJp|!KD-M5%gV;n$hx6qr)OsMlgGK;aQ`Z)nX@;*mMakH zKW-+dP}Xt$ST{OKu{~a>Rr}>=zn-qJwwV?2@L;QEB-(>Wi!PH~aBIrn;HV z__{l%nmVl*Q98|Of7XTO8?_yOk*Zr)Uh5qeJgDo@tjxO&7b`+nBz>J(dYDSLHIq1z zlS_20ZfRJERGGX+yXyE738Sc_3?q4Qjs@w}q7lN5G)=$a4lg~WS}i7W0$R_}2EUmN z+NaM4%iap;?1jPkjd<~8FUfROXYvE#B_5KI5=u+oq=~b{@+E#K!O|(p6_CDu%SIUmBsN)$oHinb+a&5p;YJ5f?_#YViK z8yl?|fmm1jEe$ClL~}Hvti8L@%*I4NN`h!u-4`y4aF{n{lt8Izo0PyAAo0q!zo<@3 zOqdL(epFX)00brVR*(3c+@{JW+J@k+)6=!8yungTx68s9EnWNhP&}q_8Xi6*@XYTB zpvbn&yQ54XCx3gv9bPQOF+u8pdVUe}Qm^SVp6C9)aGkMDl)_%S~f!K_?rUr$e zapWatYr^?;Znv~ONFC-g;2_IeMC?RHvvK~W1~K+O3tri ztP;es$M}|bL*sAZqgs=Q7-|6pS$1dCEP2784m%?h{5DHcSR%Qz4SLlk!$1~kbdDx$ zaASAy5+N&5*zH>srHIuG;rG6}&!B818R{Scd_q6fP0@uKoLVh)M0_e#^>xS`WM!cp zt_j2WCju#tT}U6xn78;qu)9H%9VyPloDO@9&|apMvNfOhMXz?|gdFy*!JDv6`t ztY*2mU02^nT=YPj_&)icQ{N?K{F%Q`X8BrLqWy`n7uOCi*7$vLygh9?zGl{pzAwz; z@0bNA1^Ng(uJh)4At&Pb423AnA_Rv^A2{&YN$+0=4)R@4t+pAtpzH@3C=l}UeH`1a zp%GI2OQ$rA>&!jH4O=i6oKfSZ&@&cAW6dLV&*t*w&>;V9(>8iT@t;EQf04aEmu4zp$oWT!X_g+6-_m-Sdup$ zW)|O`OKZm4YD{o-y7$PmTwSMen#eCzmk_T}ko*-XDu5Qd{&NA1Q3S13^w zWnS0^O4&4#LGCZb5{F1U}Xc^V_@WMZ6SJx?h zWT{)Y)}WdAhpNdi@-ELpw^t$wZu!)SGD6Jia~ zHze$14mJ%>3ol;Y`8@P*yR3-Zn->qVr`Q3-6`%^~b5+Z)uKo>sgo|AW&9cC7X>NgFjVHx4MIzsH%r?Y8P9|FgWh%{b#WD_CmSbC6#?>dOW!aK|_c;dn ze^OPo+lZLm+R{;R1h}?1Mm>=h$Ik}$+M@SX_bIm8tZ<1H_^o&Q2ljU#V(MrFh%O^o zdst;=nold;^ZKw<##Z8`zWxphHzH)`6cG^-5-KS#x0$bsw@&(n7lvtK$C>AhoiEJB zt#0iXqxeX$FurY=1HjtfTmJ6@(lbd62PU&Zl*d8|vhe*i6|}q7fw;i04?=NcEgUi$ zBuOJ<*I|FL2+U7sbH_#x1Su`USRkF*aLu3YsN-V?_)csx(U!jS?GDo>j>2LNyxlbkxe?_>HR zWCJqG6q7E&mY5buyo0P}RK~3C1{Ruvtk~wD%NI2ZPH?7VSf&+S-&yTRr=2Z{mxQ;Od_C6yb5&llMV(JE@E`2n;Aq;-t^|_{ z+zhZ*+(ztNP)6+l?8)I|vy0*{#1Mit&%%(IU%B1gpQ9JMFV?l1SG59PKJ2WFwA_5$ zIIJ{ZX{rjO**4M}NK>h8bGPxsVE2Zc)b`pGi8x)SY>`&hSuHi3-LKrIhoMF^%XfQO zs@gnHl*z~h0)&W{zBADma;{wSI96ei$5dUyz1)dle`rE#)cn042DP zgucYMw6utoh~sLZ0Tj99SYx{bndsLM39w2V!R8___=nVPGsg<{x^cCAvw4cet0ST8s~=`sYc;`QNCHznUCmnGtau%WEm%@X;?V1I zm0t<+Z*l)AEb#nts=oS2>d3JRCu8=`Z36eqX*4Iz10xi<+2usKgyQzwGtDp#vCj3Zv3h&V&f02iy{p0w7iN39tyfPK1&|f?vJeJI6em? zfvsmfERzfH*q)D98go2P+4fvHxzMcIyq69uTjqS0Xbs%O0sv7J%#p1MP2sl2kw*jDE%H%1|+30PuFHMT2H zqp-typf<4sb{+SWM+_Can@e_zO=h_cXi&uyM_gC2v59qI(vd|PY= zcxclSm4mEZ6+`jDQU~#{V&7I(IY@gVV7pLP&JU2f-wUyLz`YC9RkqDf6A=-1w$-Qyn+H~2B_oSjz@Xtg5SXJ&e%2|@mb#f zqLYn&-<@um=~?gjfRk&n3DGvH3W=Ju3!?mlVEFUZ0tdcaZTpJ}W^k1uX`oUx)7bmp z1ia)Q+6rgjViq_yx3?r68g|zetThSxY3=zyihdG8v64R*V}v9nQu63HS+Fy~&rj37 zwtRt67ur064$!rndj2E(tR76G{1N_5K6P0UYg8@by^c?u2wpLoAMELv)h4Ip7W&R| zWNRYC-wwYhTR+TSY7a35;QXmFd9P2tn$I^!~BR2YQ|{>e3uEGxytQKx)KW1aCeZ}DT|$fIL-cQ+vJQUimZ z2TCf^-r;QyasYk-I5N4QE|$79Vs3YJX3N2bN}`E{Z^{n(p)NhlwQtJ%WxUj$y>xm4 zz5JLTxO;Ok*}`&Y{`6eeKR2vxJ=-oW1ZFJ(Rt3_g^jz<6al1HecE7SfVNA#3^9)%* zV<)Dw?6Oc!7Yv-?1gl4%OaN@9bJjY80B7uz9Q z>EYF9P(D8hq=_K<(Fo^v<7b5wL@V~moZpRIfF!|5<0?xkIEt!5^$XrR#XpA==V7+_ z!wk&W^I0jaXUSelLU9idewiJWiXc^AIDzE885YIZ??a_;#zUx05WT8VB#Cn?SjV{ikSPQ3R$Ivd6=zV5emU`A-EwLzqCl4*S=!j3oN#&=B0MnB*JuKjw3Zv z^OHDXDFZm_R6d8y27CEk*R|fVqvgiV869MFQuug9#PuJ{u6FM7diI~#vc^6HNySg^ z8w&ZQ2IPn7b`u!>h+~z_T~N$6gf7}j?BbSDW@6CBbyG1CzaHvWJ?;xJakdfQWfzZf z1USe&euK^<0sak5ow6sM<0ZeqpL6#pcw#wW9TDc3^Du z>+ij*SuGk8T$jDr-FJw|ICLX%!EJ!6BK}*KGQ=rk+hJD=b`ulaU38>|55AmDpB-rG zgLyydC%{5GOlMaz7SCr_3dJ`av4~lBMl&GS!~9CHKmJ%B{9LO&U^~WJTW04Q9HfgS zTBH4O<&8UoE@>|M(JC5$D`0#;a>hd6e6t?@8_n@KO^D9J|Fxnp<>>IFO;@*K5*G?I zJS>6?5Mi=cVA6#20c9q^qy=nBP7u#5qITz2^jWvr;^4=H@Awo|Z^DJ#y$BP!JN5N($kyC8#kDBo+t}qJ^XLWC+AwAzsR#;rrNCN3@YwSNPpmK_WaikgRun z2=>QXLaAle&JEy#Ia)6#fFf^y7@LUu<(OqdA^xzytQ}4`o1ldJn}ZW1zVti_KqO%< zN$aAl_`Rj%ApIw`qr!YZ=9}O*5}7HXWj5jmzso41-`YJ65W$fOv5(GErfD%d+5X9- z`827zHB>8ii9xG>Ny1~)YA5ip-9*+zx?$*e%s{F8Uc;E6oTQ$kWK{4(hi_|#=nuy& zUh$zFM_sy@SxL=S%IcwDhqSvwDv>rDt5gvNitH>a$anuq*CJUONoE!mC8$F)fhVgc znI8G-g%ku8A(~hXhbeyM zcS{xw$Uqr{DK>(69T531;2u~xh9xt0Dg-MfJ6?_F^j^Oc&D${=`||=I_yKr?l$;Xw z;Z4H=K%KrTV;h@iZ&`f+V(vKL4Y9lL=P>Q+)Y?l zt7j%vRefVVIUnYzm=(JCwI|{}$5d7J`F0=BHfj8=o)a#6H@hRC>ARlgg@p--5|8xv zCvke|xVzu2GYm?yP5o0j2L$jEb<&p+7NZ+N{Bqlp$R$8`&8j0kO*k8nJ!Z*S;8zJ|S;fR@5{BczTo zfhJ>I!jt(O$1+kv1R4L|T7$c>?yBznbw5+aPh)#3pNBJ`MDdF9aJt@hg^~>dOH~iw zMk+H|YVX9^IN{lCZ-$TH9b-JERG%j^=IzD$lTsls_w@jU zOfIqdT|~FILQs9nyXuqgZ4bwHu<9xBeU4q5}%P*qRVSsy2;CN97M6+%Jz7naESZS55%^ z*&pCu0P4xYT`{|{c8+UaUTrm&g|sPk+YIlQ*C(}YG3bIV?TBoxz!P_c##ISlAAyrK z)YUHmuyL~TjOh1x4{P4*IjFq4C3>O_4G(Y55Y!;iqI;$6-o1slcDuNE(q&GmWcX^x z4rO?NW^Kf-e`u&>;~Ml4-B2S&^6tL*KyW+vxp`3+&}JeALLWt+&o%~rB+~a# zr;zl?m!eC}DyIn>^{oQHdKyX7V+ha|j-J#3@K+1$A%z=#8k*FO2(*{f=E`EZO*?G% z;b?0ofj#XrTOQ<2fT}rcPeV`RasHYjb|N=3^G|Xj-r7*Ab1)Log#5oHrhSc(M@seA z?lgcfd+9X`%gD$uO4E}R?b)p-ug3Jk0(@*c@g~p9ccFkRPbFiy%Bl_(*%hE^>%Hpq z5as5&CRQhkfSDX|&FuaW>*mHy9`{fe{Ojr2sky5yB@Fs~vMP(t`f%F#h%x@rF8?EM z1$4UjH5Z<2{}F%&L`Ne3FLiKFN!tsG{e=I@g#)BR_`B~WoImt||2qa7m&TWbojvk@ zd`Qj!gUEqPfm!UoqTE*~SfjS@udk4|t3E^0@gb0TsvEs`i5Y>6xoVv!RLFt<6)X2% z-1M~py5V^LURElaT($F^D4-=oq0Mv6?0>0^UA?&n64%y&SwaAL^WKyli>zuQ+ds-? zmlp4b8@9y{WB>CpU+b%c)jBE^{;&6D(20m-|4}dlgJ~Jwb~4n^{WA@)#+dbP9|zI! zVU_>!nQpFz#0zb!|LSG|V|r~76n@L9{P2GV(tm1s?Tdw*1UV0-CBQ>FpPUTZGHGwm z$;Oof?l6#P+np8`et!FJ!7q&gVXe>`cu7HFtL?v2>}__blC!X|>_bZuoPi|WLP{N2 zZ&Ss}iWTTAckY1|Ib!Ah)+RJ0L_KOJD7_mmyeZ=NS4!HiVnel0#bjjl>YC4wbD{hL zk^E~2XYB`9=`PEsFCOo&_NTe&=%l*ybEjr!6XFwq{;reiQRkaQXXn@ByIf52;v@Jj zC;F<YoMl<^8ufY^Tgc2!Ql*~p~28D?dQAqa3R}y(a!`TB{dYL z#{u>@HwTy1-fV7+CXNZbah96q3G@wtJ&r2wuTQkrUR9#A1Li>RGKaI_2gmMp+Jvu2 zb9$|#z-uAs>0G2pin4mK-Qn(R{fUN_UQ9|#PDguTak2MB8H7UERW6WjCzY>3d>68Q z9x4@tuDNCcFlbjJE3+A*UOIt`fENA;6NBB}Z(gz^>v!QjkbNUzQB1TpNXyjbR#w_S zFN*+OaVw3F)j$Um3!kLn;-rbG>2Qm&pfI3_t0*dp?+fs)1axF3ofkvZ;cq`F(Em00 z5TQ!k;J=LCU-h!ETXEe?tRK*vdVbM-G*{^`yiiXsk&9r`@Oe@je|;9hO2^-zc%boc z^yOvCiw3-de%zKEeglK2FXHfkT$$h^3lhbQpy9872aqh&oY=X%SU zmY!4K=iD{{J8W`MUFXfdaiEdoSVjgh5RpzcRqONT?`7VQ=i&P07kU zeGXuWMdGgHWws5LkG(8oeCOxqHc6apLPBIulLabT>Z#ug3JZS&a_&>{KYDHJ@dE>M z#2wj%Fu+e!@P3p2@+He$)6s9eq_A-AZm;g~9;>i$<})B698Rf!xLga?5U{dI=Cgi! zxIHb^sbxup?hL2!dyJ&Y&+6uM9DP^}U!}@;pbBML16ne1P{W(R&eIxF!M~bZjFX!d z7O<8<&u94&9~1Qq&FpY2!_(JdT~pBh?Uq9Q3cG1SED#ZInUqt1@*Di+uv8=j*uDcMjV_3;fU5w>uv6%LpWb zhFxw6y25RiT7zw;vl^DpCr`S3GSVP)_C8vppQr)7#phokH*flmq(1-v&boeNX!Jx= z%ft5I8X)N?$kzF!ug`a{tT09ttuG7+ye4hakw%p! z^M{jp9d^gQ;8wJM0c$sYLWCE-oBIk(`8Q)iVFy=oG4)p2CB1P!ZbU>QEEI=33|u+! zIq|?nm^%Zo+iwbC+68@ts4{O^z8JfZ;C4ifaTCa-hKxn62ZqEt#bW&;ONvlonlR|AW+_4Z%y)XFki{1LohXl*^?%}<6@@6nG^rmudC z!qTGZj!G>`glBVPIq79KM}Rtf8-5-8-V6+5EmC0ZLt))w9bib z%bHHA7qrP~t@QWCnQM8&dRR~p5`KLc>M%f+Fe;_<+>gvF=LDSsnQSBp_kxKX3a`Re zzWF4ee@-zB!$tk>k+dK4+7;C>zStSHsVL}k5n`gC7g%Ui{Z|A>U1`u6O+?eV_z zhc>x6Lnkp?f!_CdY-{a}Jk%5mI zs+Q83&xS;#nix~Ln*H&Xq|B#o&q!*c1*=}O%kbzAp!f7NK8EU7xB!0I`Eaht5X5EJ zby`x1*1*?S9!QYZDf1T-Kf!+r!On zcj(slb`^zLrSw^ULN^fwBNA`z0_(JOlrN~tji!q=fPPqwH3NiNF~;wJNI|dJQNtHI zwOq^#P!kY@{1Q68`A@Hl`494z1rUMN5VgUI58f_wb`K`tUrh6JZRnA zE;DLfR8awL-5yS{X`zg%Xt}%l**|NrDz_<2^zT+jT*QwdQa~5*U-e8&%M#FZ18u#( zz}ZQgEl{bzAmg*Sw`%?{J_Ixvv6H&2`T7U{Eh7OfJhD-wZo6Y^#)F-o;9B=>Q<6Ua z6cboXt~zTLLGD`kHu`6o9TO$`5S9Vr@JAmVrUcJnq!*G1Wct94XA}f&EAE?{YZ*=v zIFPv*x_YlpTBG`6V<{i+8nx5bC1j*J{Xxz(cWI3D;#G;CLE_I(k1hHqN!+H+M+w zr%@6bcSB@?)|khkc16gAf3HcCrSh=qjXXN8eFds@dO1zU#6;%w zp4_kod>9J<5TgV7^Kg6NaiT&8VrkN+xK#LRya!_q1TyT{l%F;56b6LTRmQ9;slN%Y;ZNUyo<0EGp?oyH(zt(d zxg$EefRCbn`c=)IKbEMlXM@%70zV*Ra8R~HySbdSo~v;_0s++STpj@SfcAn;ZwmFHxo!*MqfTU z5gatJ{`01!u+UWpn(Mu7QhHjN=bg(V$W{QB>Tu!e_H1)TJahf$%rS!b7mZ<)MLiD{ zVuUDpm<4&o_gPC=)QWdsNl^sC!^5#5KQ`(argynO9MdcJU%tru@>mJsbm!x)wiT^%|C;VZPIT9O>>h3|^myA5E52uU(!VDmD za|VmVxOMK0a0=U{qw+Uk7{JJhkxG{O89oYG3M&QvL3P(r@?pOZ99Qs4zuvD_RERYs zt!+5sZP+ufcvyHAxMO2PmVl^;PATo~BEzfIeEMLg{`1wbz}0vB*7GZm)w|<|vWL!Q zAd-p$;xGIs=5JTlTKWRC`5utC$|{ZzNkUJf3mPS@RCszMA7T@Tbt+uyZJiDQ7{sDa z#N+fDLH+ehlqene{&Fw+=5cRRY5zd4DJ>>Cn#Jp(4&T1+xZxl#tkp90tDdA^*BnfG zXpaF6%kifYdyJ2ww|eBmoAtRQ#Oai9gXHtfr=+=Jy=(QkzxAyAsffa74~|wxlRKK- zPXvPf|fUGV3(R3-!lxS>Ih999&6$x#K*Qye;qk?m5si2saQd3}fsgq+C#< zh;SClL)FA=or)EP&sExRSG4>W8~w^1Y~?=$GK)SIfqb zd#tDryMuI?n80}-`KhqN%i0lyCzx6T(O?0gG~7nZeT$Cf&R@^Zh4>ByL?E8d5U_~Q z*%m#U3?!a$wLf0^lKy%B<5{DhK~+C&qjZ{-?bM`d)O!%a82gShJS>aaM!fD?GEp>d zzZ%UDTCFkhDatG#&9V)W@;3uy2@fFLylB`Q8$ zb17$QLyr3EBk}W}3i?u61r7T|$x9s7Vjw{=XxcjLvjnR1{sdg+@Pm8tH^~+N&OwhN zvmrT;$K$dvKi@QZxsL_2#Q7u<;~F}MJU_*=h)l1bg&3%b# zbrA!+VZOf|NNZ=GIzH>syzA`l4gj=RsR7jAA7ZX0%*)1`%F7=g%=3T#9kJPlxmR{M zh);-*M;v`(E>_~==^q?U2buKWzxQT&y@y$j{2Gm_bbtZ zTXr5*X1<7*f}G zFmC%?w48QJL1H4y0Y;;yKB)CxkBt?fNIMiTjw98sw!&y!lVVqCyskwzi=KH9!Po_F z3X*{4O0Ok5u3jz@){t-CP(SQ*kb#Sta5uyTnl6_^2pHtcgGH@;gnjjW;V;o|boyb4 z2q1|J0@tPJy`?g&&o(GQ?0JXdPza)msS+7tbg#p?7S4ncy;{$fUcoYSmLM&kMAr9X zYhPOKs(t*5|K#N#>k_$&5S zA?<C&ZR};<#l^))%)c2J-j8MaOxiV&0=<1j(SCSqX}q*Me=FYPZ1VLQ!Vst9!}og2 zZF;Wnyf?{P28j;)g8yWrY9^6?(TNKK#-|$c<2sI$lQ6k?^#kJxZ0jJ8eyu&$6g|9c=*oz z3Sbo43R9C)Os0l0Pe;lcm~~T|8?V2SBkLa-X#t76tEsWOyE_oG@hE1j{aN6+_{-yt zi{onaJhF(-)wKH8tWRwGuY|J#W~+_u1yZXH4eIWXW)6<(mrHn&s-*Kj$tddaU@@>1 zX2>(LJ6sQ*TFgM&Hv=5C*9^4LCCQzEgYisykfVDlhm+W6C_h=s7|QmnYYP|FFMVEK~WOv7>`nY0D-|uxj-MQ zu8Oys{YsO>B1i5HG68p+&feP2A2v;f$QwB;?x}V^J7)TTj#So7J3_Yh=FAl)?cZ$- z%G_YnS(sgbva+&TxxJs)`FPrU;@1mKkmk#W%2A<<{Oc9Z-sOe!)}7_+qm$8VNkMNn zWGEvMT}?H$P?3iQ>**hQr|f!q@#70GLlVXPLC--Is5o_TkeG%};_W?{2*6>X zslOyv<3=?Ox4iNPE4$G zK+Ev{>nKq$K=wk9mT@yipULR{16!O$oZ3A^^e3^!e%4DKb8%x-rl)DOiVwc5ynaK|By~zdu@$ z;r2M6l4E9`uOIx}2@ck#mF6$)+uPeS)6>n3PmirlRX1R<0F|VkxjfR{f(jgj)z^=I z9I)XXPS>)O8?ry5zTvV{toPswnSftB&;D@LI(%<_p65IO1Y2nQ_fr{97VF=>wG7@_8LFwpq;HSUk8$Ga z{$oUfX}=}MO6+;rk86}#4NJi1_5f;1=j(wfe~%WQZ_@?v1($9fkeJiC9Yt*wWkfb2 z1)tuePfh(kB$A%ukLkWc*+Gk(9Vo`O_+sW(Z_zf7tC7Co{;ohRMNPGZ_qY9MDc)(* z=Q@Q|p_RY$7B__8(z@E>2{jY{2Vg}Q*>h*9&UGM=UTD3S6^z4qKI1_F!cFVL|hNg}rqGy~D z<*OJW>`dg1XjxHcK&~N1smIH44FZ)ux{l~^06%t)kgvv_B1Min7L}OE$l98m3#=Bq zr8;mF_cdinj0)hgQ=9$cp^*tcq!l9U=EhWGwW;MY#3|UYL?>;NtOeviAHC4%r|2bE zl1z*hlYH2A2?9iI#3u5Tt#3C8LE*zN+up->}zm)xb#u2mHicdX0lqwe;LcL@9^ zrC%DG4#)bjs8@8YOI*M0t@#`+Zk$h3P;d4|`o$!rCxdC;hvUHM_xgv-XKXt*kx`;I zbqPGPw!ydaFTvSF|LyzEz?(uDyu%?oVyUqAo3|e3bLdPrwHL9Uy z$O0E^nqVJmxPo`*N_=%KsbZ$vE3GYY5!2S8$_F{)ouhx#w?XWJL*L7p7 z|EFBS>~tDVN~pry2>QD3LGj_@8`4^Q-}6vBCwSCeHhn!^-lbGEbS;~r`xoK7`dPj6 ziO)jV;HS&-UI&3OSBc=qjW$RM8hRuiENV@PO!y8sp5LEcwKMdbr34{z6>Ml8!5P8f z>@;IQtFR9!r6hdslJ0U=a^;iuA#83{;AkjJ^HY!OK;eBEwJ+?PWRDR$ zDic?Jzz0IHSEfkZ9$H#{raue=7Ujn({eVfsZUZBW5Z}u##>>;_{>@O+a0R@8Gu-ea z5Kn`&!_vie;|O0_cM5t((8YI?$z1DF(TY&!7WhU2A;WTK3vFTv-}m{uRY6#-PvPFw zZb$a#_i6&^&umtEnFND78y#zh#etG23Rk)8caN+ih(!VmLIG5CRGba?BhCPem}UDUR4q?0(Z=G+62*3^i7wP=kyR7jR^j4HZCRg)zUl?vw zUn?;v3=?HDGwcx}`_L4Wsas83CYr*cB03i1jdQST@}MM(a~o(~Z)ER|uxlg5qY&_$ zZoN4;>)X~c6fo@@dwKN~)@pc^MZ_ zW;^g#T;>NSI%;o&H|_hO#PQmpy80>?OEh`*)g`#Khyf#bxw=1fQEkPQh#cw&Z-;{mM+R*Y%S?I^X?O zD&KD2X=B z%yF$~U)`oRV-jOT#hu}I*S3f`f~1}^oOVX(C#zMFB*>}b*IT=zzXgkytMl@xPMtKn zGD3nbo%cWisd;~ZKC>wsb3Phcyl@N{5NMoP*(sB!co3LZ0j_8Q+A*0a&&y0lgQ zt{elE`D^elkB%S==g)n`HOm2uTLOEP2Jeg zK(!zFhe`=U*nV_yaJoL6B-Y~-NDbmu!50U(&KA2C9rFf83v22+?u`DMXTO|MQ_6vM zb>uFms`3A1BuO{qkAO8>_HDM9lly#l(n8#TKyitlRG1KW#!+7~LYK(Bwa`q&#!PHX zNJ!wZH`=9}t8?7EZoL+uh2NrPg^sRh^dO@U*4%tu&<{?%JP|C51f1N^M#i{$zvxxQ zZ!?6IK-2urc+0X(D~Vg^-o<*Mptu3M|W)a$cpoGO1b!7 z!i$!xl`(sJsWXA}=eiz2(x7I#9IQ*w@Q);o7$v~{{%@LVzLHX^1Hx45E>1IvJ*MkH zJeS2^LgmmEgJ&;IP4j>KUGA^HodN1%@VI2-cKG&DwYWBr-FBNKOW}Jwk)uay?QHdltG%5W*y8Jo*sSCQHi6k_eAZe0|v*JkK#L`?9&B58ZqeX-X5`BzypDFPX#tL~^B zEs+vUZI0eaOb=I7$JW@NJ4(1nf?qHODY)LWTN zpSOn~D#Ftp{MZ6a*=ohF8?nbC_5b@%!28aoiO8BM^hzQ-vy~3}zn=z=fN%dEGgN4* z>`Lr^zM~yKabN@C>X+&Z+VJm(ME#B)6}^9DkM_r?{k&|C%P`=df03r%86~z=X^H=O z+c7@i&NNwm0w@~k#x;+P4llqwY9r$tcxQ`Ou~n0=~K{wGA0Jw9<&0_3{6Hbz5LV*j)GJ!*#ZAaq$qh zjvhor*ybh!H||J*F$n6S{5L&}ZG>8dBvLeOp0L|-hD&}SJwba%p$eN*5u3jJ9wL^T z1W~1+cEwDm>;vs|coXc9*YJ;hU{sxjA(iP3mA=$Gcs%4F8F~J558Yf?)~@BPp|yX|Mj}YgaM)Xp9xAan1xrV zgtM7Y;De>Jf6q9mth{G9>EzIt-pyvTuDd*0b^p%>grs=?_!JTnQj%e}*!t`p!aHl3 zz-RDck@O?|-$Hv{Hu8(75-5s&Y4s{Y%+DPH>ttd}=0$AP!2%W73=BatXCdOtwCjy; zD_-jC4pLo7)8nKkSZ89N{8Pomn+Ie*h}0G{)UscDUOWvlwQi(0nk<>5OwG(_q;mg+ zYF~THbOh6L{eMVBB1MQPmOk#2-3K$X>6gO>o6{ko1zyISUn$}!Ul5w`Facm?^Fa%1 zz9I)j^ksm70r%eP+plz-ZvY38n@hpPb!~57hGemaDdvahZw`vaoP=-qN)0M!@*Y;% zZ5P1BncBcP98pS<|M>Oh-XV{(Itis2D5d}x!I$_G5l;JZ$+_kWLNXhWm4PtoEx0ry z;sYXqysTKi5DImsmNR6EaB$`51UjuesbpjFQ382`RN4pFya{A|x8@=ud!O(6LR z@2|1{_z7XdqbtJXvCy>3T^tnTQ(xF=r^cfEC)Ggrwq@=LnNZ0XWmcz zam-f|xVi)YMCNXnCWeH2706#7_lhT{rrKb?lO}dAJg?5xh!G$Cv7y;2bLmGcm>3gt zv4-|7v!j&%aVUG0QU7!%#ae@#ayy~*uIzfIwQ;ZBLSs(E#6(T!Rs|a#c)gyHq?S+H zq>MmHyhGcVFdxr5#aB0htHFUYUF(!6a)79$l!VhAi%}B9xGXhbg}xRvAF^C5?0l`5 zO+vJxpJ?Dx5NI)urynIDBGIKSBkNy_*yu4M|AN-swZwMH&-&p6>)iedX@b&yKA6lay;> zJ~#DZMxmQ^KeXq=UCa~3hZa!iaMGiMR z-uoWmGtEYrcW6khAtbWZZ_0Q=# zlYIquM&McxwL-c-VL4KSABI-?9@$DfH5o4N1@xDriHD-Fg zt>RMiCU(hS+)Q<7&#$~og|)lQ`<;a|y}drtFh&?3bgM@9il$nri- z*6x?L2)_MqMpKL3Y>X`JakDIJ>6*p2s8%B&#J0UI9fU7IX#K&{Coj;sJvW}SCkgeD zyhoGf?UaDtmGcNf2=U9D$dL@!^of^m^ngu8WUmBaZN~GVjdNwg>QPY!9=qk~0>>GL zb`E;l6(R?EPF#A}d-^?^JDNpEm_q!T92qwD6hqec;l{!%quJFK=@HAK{r0 zgN`Jkf5?SvF`kQc*syNJ2gO>Mg+2eb*qJEtb&P?6KuQ#3Z7#;#N&VNfIGJ-N&)YTtG)sjx8v-yHU|k zM<_*cFNuWB&p?w~1o!2M6bGXU1Zf2}Bn7( zF}HO@zmQo=g}V($0#m96W|!H$>!{s6f%(^jBVkUw`rfi>=w45ifhYA}Y8ro)lsqnX zz-(}pFoLZmE-voTbj^|Q0boi@WfN8GX21I9@@V9uC>LfPerRWwozanhpoW(j5c$EzdOz>-} z#8~G|@dZec>!t__%^m0nkbX!xNR-he`4I>kQFy6iB7ZQimtLjeerj=p9YreI4pY*%Vw|y=z#%Y)Vl%Jo7yr#C}q=j{4=>YRV4XB^5#Pg9MoLb7DBh< z13yE7tpb@_OzlkZ)9&qa!{0Ldwn%B4A2${mcQJ>q0IM?#HDVI_DlO0EAEiy|7sJWb zw?>iO8b-#NJ-4$*^(x9s9MvzD3YT`a5F0jnC3WsKzGDzO2Z{{BveLN}0klrZ^OE~2 z*BO2G(M@Qt(ACtWk7akn(PCC(h!N3J0Qt#=3w=DZA6z3?$EAkNx*O~5<0RfavX^1- z{rX=1l3PL~lyc=E}SzV%@uMl7N zP>e^EMe@nt1i?vU%f8US7OvOl6J1Av_aM@=uP%%)v-k(Sfc9|;F=ZBTaJ8%a`e{t= zJXV?&k(`7TLmfELn#2@qFx^#yq>n$02W6-BS=|(-!XO!q_rrxa=TCvx+^FYx%eW2J zEM1wzYKxe@nnw=peX5_jR!|~kG5E|!>#f^6gbKXdr)T9m%Id{KcP0?9;+QGTE)y?+ zX2kMtDc_}B2bYN_`Y#Zg62TShD|FG zWEcw!p|9gxmXz+@Ieg2sVe{lr_xU_FbxEHk=j+3G9w?BfupDUKbT9b6xdF%2O|Es> z!E$X`wU}Hyqt|T-hwQ7{5APAfZrVXUDtvA4f?558C@($Pc>{NTm@kXW5XxQs&!DFr zWL!&_3R;=A-_%;xF^djqdFGVoQsRB$Z_dPC&urEb)t6&S8MZzdbOB?Mj!5a0t}qro zv~cwC4m_&u+&K(5aZ;;k+zNO^sOtbDTHIjVDhNa&%r>lU#z0Y2raT-qv3Kp^CiGix za;t)ibjie`z0Lb3{g= znUS1kv_U>e40|ZXKMUr5yB2X;a5{UZi!i;J4>$~f6R4bA!of0i3UOYJ4^A*>0iN)5 z?;SE&81MG2slW~O0FR|Ng3zGeI0<#6@!FcsASK$T(4~&G?v-V0AHg!Dre@Fko_K=c zukP|gyxe?r-@70#c?v!raWGE=?Dc3G%y$J8Zf7SYc4m7(o8rDRvDu8}0j@bQ5zXO! zr$;VU&T=n_c(&}|Ir0<3EWCzmn>6%G-8~yyb9eD%8EKjc ze#pg;^g&=r=f|0_#BohOt)a1FOh0Lt1d|W$#}%@JD*}xfp8HC;`rMlKqC+V@ehRHzb=5W_I+jYxJ*TI!plKB8v=Q zNhJ@mMrRq(iQrB<$5VUto4kvm-bs&kGkM$G5e366!NVaKAwW$LhMSNHTPl&=a9X<@LcL zuCIao4vF+t&@`Wp@n)N6^)jZqF0cN+1I-v8X>GLJ2(KTa%@t1!H4m2r3NPa8Kt$+w z2W(a!h#sr%py>2A=BPO6hlE)q8dB65g2hXm3P=Im8j>1LU}ph})X zAwYq6Ib9*spioKPt%*mz5JXTpUCzNfhMjXFA>{4H{pHnrH+W$qzf3sIOubTQkz#T3 z3kIqh>sNKK(UcC9r-L^?14$8}UK5`yJP;yO-XZXY+Q3-&4n;peN|&h_7ng^xF+~KIZF54S&sv9GS6j5(foT26xSqmszELA^ zuk%4AYVTUdM))<`l`v$pn@n3n8H@-t2CWG!zk?#)&t)C3iAbxQ2FdTZ)c9cKyzQYV zIk1{X^^FMoupAodH$W2<`)c4F^V%_!^L?F(dYS!T&%xcaT-TWJg z!WDkFCNz+WfjR_=K+VW6Bm{llpfQu>ZJ*c=Ms!+|hj#L6BqBA=fF^hyDVPnk3Xle< zBm))vF5E$)*Ppo22&bEHZ6utd-f%m!Mo3p-+J7Wr3=s0Z?-;k4V9RAPg~v3Bp{uC#MRdgVm+<}q8%^R&fW@+SI-)>It5f*ka+?tlri@RW7On{c0UVT?P#2=1kbo~*rbna zp;C||zT}%Xn84?d%Q#nT?7~`ka;#p)$bVhc-TO4N{GeU>v-!NgYP@v&e&=j)+^412 zsw@1S-*d$yeM;`2vLWte&EgHKrpu=}XL599hr60Ho27G|{kxBHB!u4!8(*&or!JJ> z!HYVXaxaw$Msw>|$|lf|NLZHW^)S2SW3vC5t+kieY?XyzJ@$9XJA=yno)Tcj8!e#T z@LOb=P08ZmlR_>>p)kDiW0yQ_g8%pLye1*emLir#cgbdqHJRb?v=ZJf5$6*QV-VXU zQPAk>i+%Nx)!#!ykusXUxLL=@+S=Crodp)RDQPkHGs)B4%b^$#>ygAiIE>IMZO#Vo zyd46ObC5~X(1UQt(9(?IDEN_wM)GO)$}l2*AeXs(Kl5X?BN5qzWLe?TlUVhQ(Xa*% ze`t#_%|f3?B?^n^!&CVJPI~-(0o=v2YO#@m*RZSvA;d6Q*mBZem@w%!NC!pZMKupp zjF4haJ6{E=7;#ckGo44pr$EY<6cr8V$Sp?D5+9^W)#Q9W;B7L#Wu-yOQvW;!XTyPw zrsgLRY+bE3gZu6TDj>+yEC2>;sjSaxEQYeDi>fQsIpn+!sTupu*5=A;DR!xXz=$j- zXWHFYxqnk-h&V$m)L4JtINlMW|7s9qn!@#F4{0<^gTWfv11h)EhkkLe9 z&;ts!D+2bYo795LT}@6SYw8q_8w7=LC{i^CQL#a#)x=ii!AaO#j=M7Zrcx+aw5LJ zD*Jj~SxeDKO%~?`dUbV1#(r+driekZL{j~kHo{Z0(DQi-gMiiuO1m_C=fcj6nllr@CTbF66#Ht$h$m|U2dW-i=f2$nYkoU-ijBtF)VfFhq_ z0cXI9p+(^*ik~&2A zzs`Kzcca5@WK2Vlp(_T`#8O6mhxIvPSgL&aMl;|eTyyj6@zh#049Qe~cz*r-gv$T9 z0}1n>pW)i;!izxs!QaKa1^x}e_;dDZ!W$F{{>6pT556X%cA>#LSbFc215|k&?z6jO zW#LsZnUyBIH4WbJl4+}`sAy{!WbpGvFQ+N$Ny?M>8FPb18iq9StV>W~EhFvNK`Xvz z8mOUfbU4r@5D*}~eDooi!lpvY&Ye$Ht2b!+)DLYU16-vCde148!9di?slx~5Vpc)A z!gvtL`mkTDCiUnu&5BbnP9X-#(haozJ8c@?wh>=)+d|j+`H4XU5KG|9QZYAR=@RS0 zjr;_KWU;74ali0j0@_=1-pR}zXjd^N27sJtONQ+AZ1mD9YYdU+B;aW1^DVnV90t89 z!I33`b^Sp?l}QvLO#Hf#4H)oPK_u6Nviu4MlA-w*Y4Jm4MrY(I;7t74TqVjP=|^fT znNpoUCKiY!kxiN=2ZJf(_aL5^#U-o*r*Ym1+1nM}ZRzXW&b&MVN_)y>Ya+uU0p;Pi z4Thu&cBQ%u1oy^W?AFOWO9n)8bG)@R%;Z0r`*(aJN>u#5&cr)9^G~BjS5zCk3uK%u z9F8^_Nk4dRIf-Bubj)a$ICt9qUHPKXOg@?cJMs-fN5=XDoubUEpmL4FA7r}F*`unO zZtzewh|t0Y5`(U^p6rIUq}XFgTie~Aj=oJ8e%kgE&+_WDSj!|8vhjMPrk4vQJg18G z`nea``dre5^m3I~GobvnZz$jqa)|V-^}LS1!OV2bauly~Iyc1b??P8m>0JFD?oWH{ zRwk)%ZF#UKR8J!2W*ph$1KeG!O+bEL9$hrEw?7&z8y=r6YAv&DF@@ho_##}kJTH&i zB~6cLSoPhwKgz{go-=9&gy`?D(CWf(%hMqUgbMzWX};O2A;3u}%22K0Qzfpd?1r8$ zCTTxl@I^{KDhMyoLU^|o{Gt0VJO)dadVsW$t|?KkK9klf1=w&Tvj(?e-Ky%E(E|~$ zo-J+>AJG6ZKM41WOFTL{o7_MaEo4_XGUgE&C1osFPSVLJR}qbNX_0RQa;+Mn2+8jh z8LMY^(919-U@CCC1FhSxq)$HZ)g3jN=Q9q=4h8vos4Ym$=4F=8MZ5~sB-bR$mlGaD z>Gl(PfXr=yL3)l#OC#Kw!fqBU%0({l;OFEgpG=dKt`!qO^6h2!=claT zFc$P0(K>8qA2}DcLZ_Lg!iM$qnJsBOvc!r+fsxYQy2}}AYU6CuX z;@~JKio8I!098b`A9wNlZcx0y+|oLW;{LSVQCVwIP^iz$_Y$l(2WAy*UI)Ldbe8W> z*T!GE@>y0>Ecqq|11@M5XZ%f&LeLU?PAcDhwV*B4mN{6dcgvg-!_Z=NJDwzz|0x z{1`16;{2zO<_(tP&>3!I?}us)m?A3GY<4jLmA0D*R*A_rZyIBJ^oCn4Cj#D3B@)&%Vdik!54El)iMHUqLtT;bHT@Ne z#<(V0jI21dZF|Z_IaQ_qLpXIs(J`NWtA?7v)u>Ok(>nS|>N=GBmFX2lQj{W$3+7{( zTvXEQH=>!(&_|(HpNuA&ifJhrcgfYFVK=xW_z}DKNx5M9oi=;I(ODEez>6#zdKPL2c6bkI;bR6&N-~?jt>!^x(7u6tSaH4v z@Sx2ZH9qUGcwRt_ZgjTSl~@ErCHb(KvFQ#{YKcz@HnOYCE%H0{EV#}Hx>R(VI4M30 zqqkIh@?+ZXW)8ewiTZlMymGg&X5FxHbI2!wrZxyxIwh{#=p$ZMgewQW7pN5@lN+w~Ka)Ri}#k@V$^84St*Nn=fwlQmCIUC{yKeKF@ z>edQMswi&HHd=+=#YyZ`azB1B220p|cB!lYrDQzce$@{Sbx-MSfYXB@yNuI=SL>`b zN5MPLqB9#R>t*8D7Ap2#?k$Zwib11U#m#PddR!pmx?BeN6MyNa;>HWlPV7U^=i~5E zg!-tF&i`K8&*=EI7E*xhqQaUF`ge?4V9ij&WdkFvRi}VQ8*QK{FiBGmIBT!)53RPq3@}*+W8>{|C+X4 zAMYh%Q=s6cV#4p$T9mP%1ofs6`t8Vuq(F=(Jw2}HMFJOFx};P{Ci+3b|a z;eh=~U(WS6zK3b=K9CjReb&_p-36Fs7a)o9yC)HXYEMM>a z^+T2U;JcY~yQa^b6M{Gdq{-`-TW?te_BicoSf?Z_zlkYXesRLGH)U`Ddp?*pqm8(@ zCdIRKymqp%QcDcSipj0RS&lNsqy-#ZUkgl}t!g>FF?wxI`XCc_feC%wUb1&e_y&BI zv^V#zsB)n^xoQ-mKdb~Zj|~x`tq2`|1ri)fXd6OtO-@YgqR%Pu&$s*09{5 z*i5ymwum~8{9rh0(MeP@=a(jqx`8~Vo7{EC*d)8$!)*G+c#IYn)rn8Ni_a$mzE} zWv|;`9U+mum6S~h3cKtRE{_cAAXogAvy&s?jqHw^QAc+Og{K%m7-nl|q2=H02RDrg zaV+h#(Z^lbMS<|6c|pWZ86PUsSB8k{utJ55HA~p&N4gV~1Kyo4CG4yw){S8f-XF!W zZ6}GUie^Hp>CSj+6%wq97o9OCGL}B(F}y0trL)?xe`3K2Za9>N!2U$^0+9UuLW75c zQ~^>hbSKIMO?W~LdtW~qf`CFTlXRNc&hTGTkYjRds%Z+`-$}k~=S7k3VU0y5Rjc?Z z?6C5JWN!mt7C_}lz?r^Q*Zv0-Sop4}Ises;wwg)Brw_Te-w4m>iUbJL46{K;c zvmzPWf#GNyoUs9Wzh?C2;-Ozd`W_A(n(pO1XN!3W(T;@ z0LO62WE!oGiRF?~P^M@SNP~^s^I%I2p}Wzpwi_o(?>V?Ja*7-u=aZ=DjdmDj!X0h;%E%+ zl^Wm=4qV4qM%{l2v$?vu4$KaLq|46MjvyeMht_741e08jT%T|In3?Jvia`_Zqc6Rw zjl(cH$I16`K7QYuF8=DB8hLF`f4M&F5s4bohuR4g^4i-QCr8Toq#u9~ObrMekj?rJ zbT>8#c(wblg4p=TWwW6o^#Aezi><4+yp-QjXk7Oke!@u^6;m=|h3W0Jte3l<#rv2K z>+UiI1%7>{R6yFE_GyXM4pKHq4K4;Bw^)TP@#8DiK~N^}+X*AN&2d(ebeX4!M)yn2 zdCRU{a4-_{y+IxFi^$*vu3zyAAm9s?*Y(GK4lk2(hs5F)echH-CwUVcpOf^fBpdCx z$texHE`Y^E5{{7&7Z#Ps*Ju|#MxEp$>u;Ba3N;2skzOU~Ko}Eu)g90&Im{#dxj1*q z(Uf&HViZ}Nw-u?v-Ak25M)Tbx&c*V+^O@P2Sh1a{q8YO#UML$J-te`>p;x%8lLL*n zw6>~QUH%?TZrCOeKb*F!P}MMq^=HFKfDyoTQ-~d$TXMKc*}4`#V777bewE1&amuYxk%v zZ~XoO>bf;d3r(2Kax_CRHH18_G>+ZSv_Ju1iv@cbC!IlZ#;Mz!a~d4TP3=!^ZkZ(I z&;H4GB{>P(9I6m=W0vr()AZjiMR;r_Y2#CVo|Wmf2{wJd!I!+f4+I$Y8a(}o*o2oH zojl!-o&A0_*-`xR)8O8h`z?URUIJDWi$Vj@4cRGJT<>-eQ^pJscSiI#3Dlb{ljXpP;cRivPet5Zq&&;<990C|lSir={-c9j;tdfGGz^k1+ zO#NSfAyWPS;A$`5NYV43_M-nhDW=K4{eu5N%79Y!pWpsJ;91w3|274GdE&6$e!08+ zn@4~SuF;PXrF;XY*B7DHl8Jv*<54364FkN}2lD?kXnmoi{68@wA+<3-@jik-{rmZ( z6rxQtUvVNi(kRym{y$HcPR;x$zo}h&hI~mYb z>;-)+i+)+>t@10t5b&R_`GE>?)J3W1#c<{=I@KACh{ynox=0uHRzJY?^?twiLFAJj zsd#DO`UC5qmmd`rG>n`8RNb89mL1)R3t50b=wz_mdWF zJpD{MuuTK&qCH^NOf&&fb~yVDA02dBjJNNuP8Qs{3~R8et#ZZ_LwFxddcsgGm_<%P zQ#{SKWlbgQ?CfqDQ@YBaqj~VT>|93J9g}=~6#&9Pw-(Y!2=~(gT>hCfG4W+oab8B( z>ED%riD5`HN_&I5!6lD~gfuuf*f~B8`7c(V2-S@HR&WWBVHlvr@u&HH)YvVJUz#E^ zBj9}lfx{Y*Ap8JvZM2zLAn^Sc2htN2m}GEj11k$gI`nU*L?~5{1so6DahY2W;8o_5 zxahRS#KhS4bS|?i=tzQ>YCFL(>%U1M@VnTgC#wq#7Mw-7L`Q%Qadys;naF?UT<)ti zk8{;oJf`js!w$FqN?yx>S1`8Se?_lJ5_C(j9jWW*KpLr-#;fr_#oG?}?j9q4Lvt<& z0yp6GfWx3oa-k2LRVZ5Xa2S~f3xvJF7Bhg6IV~5~le&$ulftmW$50mrC_m8c6g2;m zu73O!OHzv0>I8}_v1GJCQbZnGadGsNuM`?(iiMv7J?1DFkX{xf&%XsNcn8&+?RA6(nd5Niw5t)-)bec7E|1Kj#xT4gj|hVGx&!V6*eEo8O3 zP@OOhXinP8n(WE!fQTg1JoMY&R31u7fh(%{?f?WVDqco-fKw0PGDZsiP1J_dZ{uJF zqIzsgdtlO}V38~jGa+*H9hDFWhq#lFoKYP|;$Z%>eMCWT#>MFtbLc^h>5Ylw&LgC@R~>{Ze z@Vg}$rZg|(`OhmRgs=v+2erZlY-dh!W!$MK(vwOsW%AQM^G=-?jK!NVy~5nPMGdld z1=epx7;eQyMaiDKhXD4p0kT^gu4EIbNV<$ymNz@OiC}qKF3v*t2C|lc@+?@9b)PJs zz{4tvqO<~D3_zCVM7*G()_gJJPNOuF9f+5#0^@D+7~~CTj_TX*0aS1U`M*?eC|PUsP|0L zfD{lK;t^!(Duf=!$F)hqK^qcf7jc_6ucNTg`M(|h55y;d(gO8e)G^mA?9P6h*JsuO zU>{`!yA4h&=7_H9`0i8#ZKJU|Q+$F*z6^1Gsc9dI@ z5dPw^fkK=PEH=P~1iCqRcToc~-Fl$RWXbp|M;v}Utf&kO-bw#|eM#lJE$ zYzM4QAg^$lWIvexad@bov~PS4$Ww(h-f8vC=r=4ccPqp|VLMHwoSUcXmV}fPq-rBy zneNM!{3O^=u(^RIsoda>S8bg?NUw$ABMOGqX@|3Ka1iCHq+mq(zsnCZ*vuh1i6P4? zCIj@QA1l`&(S2z-$E#n`TMp#J1!G7!4BoIUR?|gbld+ogE{v%~oU$K(aCWMo?17EQ zE8!W`DozE5AUHOVtQgSk5E<;8fTz~tKpCKjQ3QnKf2n>A3;5DUg{k8l{#$-aa_Xqnt_-;&n_?2pC7K8A15Qw492RKXqj1%q;`}5n|)d+x? zGB?z6@JFS-uqUhWZD_pRSD^N5e-m(+Dx{;Bf|o$`Pp?WMPbV*FCs1CRo1}wYhyi66 z+3;2q9Z1%ev%<6jGN5Vekk>>G=i2dyY{-)LW84Q7{~cd0u#D%7@zs=Jy?GVC2gYL} zfL|SmYTReyRh5*Lf7dVlSxO;l^Zv7x;=gf#j0Nz5=%+`}Wq{K0ACh2Ki+_^F1>1)a z^ED`$eqaEICSAaU81f7dW%`mbP~z{6U=%ZN?lyYm546~E7Tk>90F|4&@2VkHHC2qf z^`X~Vs#EzhYiK{L_JoMROR6XRLa|8R5%~%7ogLr)+@ewGk<7v}8soU*WS8*o%#Gsn zN=vA!=Dq=-o&$S*UldISIQL~^iJN~i+Y$R0gfQTxqW&@a5bVn2zoGB%36NE1_^aP@ zw%1Gi^=C>H4`B69>Z^FtNculF;Wr3~3Q{l6eZald=( z&g!}{@YJb>B;Z6S^8GV)1Cb&TKxvhpAGm2G+pYi&0=1ooTO+;Zk%kt>kOxgdwr_8X zk&DM5B*?z&o|G_B;~GSgqDua>PtHQ0z6ER810kvL`@8-@pw#sVU@{Ht$4{Dp5PJL_ zDF1F()BqgNC-naVjtcX4MezHAo>#w1SN^ssgn0!kvLDc<$58YAm)eHEJx0e!TGtyj z>|}a+|Gy%92Vvfz#-a|PsNr|>KOBfiF z_)~cKHUSTnsITNJXdI>%04}>|H|O$kRy_;TRDqO9!LC(w$ghF z!@e(gr79IF;27rr$%ns=#~HTw6P-L94E1|#;>w^HO+bRCOgxB;Z`M$y4dL&aYd#*0 z>~oaV(9o>j^l`u-6BR)8fW!EN_3M^Flq+a!^EwV;xyXA~v_H9p04x=A-VeENK6U8S zStR#-Jj@dG-&wJbgtCl_yXvrZy+wz|!2SF7PMiB}wE0(YnU7b6)X;IgsBc^Z^ngTY zU%$6fuus>-x%SLC-yJG*!xV9uIXNhg8a$Y1e)MG}7JMG7VRt`8C;{GjW&S-%bQvLbk97nrRs@%Lki*jA97;rmQO1k(x4a!S%TB?unQ+`D=;cImS_o`)wK}1oI2^#q4e?T z*o*{!*wG(&SV^t-LD8UJrsNNZ@KDp!9s%&EBbr7fmZMo;7D|2m5+ahr$6jy8giGjf z5pxYPbmr?DiFWnjCdei=Bu0#VS{o@UlIm|YoJYAYefCg7V$?COOsFRQa7)e?#iuSX z7jiEal=EfXCYIl04P2yT)E8KFSOoUzErxoc(`c5KmdeLY2ko>7i&1JyNl8u6lv<8n z>#&oIUeD=9nibYTLyGk^E)k9ufr3An)!j^V19Z_&{MMjscLZdq!ev1n5~_(Oislib z9$x%tD*E&W(s}B1d<3}Upfbfpjo}Z83D}F1oo#hhHe8og!nPAP=fNn1AYUKHeT@EZ z%Q|Z~SM~}rnpMmPUXl5mQ1xr{ga#UhhVcei8c__n8%kU!%3Tu1)Px3A3DV&D^W_I|r%oUmo7lG3M3{qN-}kezrLCm{l3kx{x?#?}4>M1K zb++tQL@-Jm$nixjgr9?u#3XA++3+z{xWH<==s#zTwH(QlXK&3iZX!xiNoz^My87K? zWWQ$ogaf(ziGs-GkwM_g1$+#(YX_m(C3aB2!NCF3vR5-y^za_n^VvPWI2vzpBlf&+ zmY2yFgS|P2&XF`W#6VvJa=|z>JNYW2_M%^(qh-YX;}Uhf8li-<9T&1tRC6X9^-z#L z&giPvx~-6RmU%z`@{Dc~LbO}xTCR@Hj|D5x;l|EQbg-f(c9I1(6t-1}LG3a6S2Rby`g|LIKd3q(X2Kqr_%ZB8c15Tz`9rT2 zs5Kp~fe%`FS}b=Q1MpEe2C?q!lvNG_V)08D{B7SHy881S1U4981X1a{*5c>sN0X|x z>6J>hz<49tgtMEPByS;v3EfDmsg{4vvrnU*cl&4E{9d>EzL^gw^H@dO$qQh7&9C!( z@D5Tuq7>{-NTb7Q)6~HX~8Th;}gXa?Us} zQWI45)2gi{?&QT+=Yl7uqN=aDu&`FKZGmWyQ8=03o2=SU;F{C*ZZ&X`4-TrBgubch zSct`7;trh*%yQN7nK)cHtWflIg7_7oGfdM^Pl2C%@=J}2T__&qoAz<>km3+-{fiN2 z?{(zICMJdr+n_H+>o?e?Ds=!-1omwEnNlLl;h>7B<@c4dC=_-9MdYCVp?bkn)V)_R z$(Fl$9r2!RsH=tWY;JD#8@APkEe+uyV>B$(i!ggmW5VGX3C9&EI5fj#J8rrr;ol@q zcIGc!5o)zx)Mh&@X{wBO)9Olw;yypla)gxW7OqOh^z3=T68lSsLubXtaM9u!{8R@E zp|Gb&{dv0j=Cg``Rn$mtg-lRXT$QRk0J^2Ofa1?pO$5-bQtFAsi70eNUNmn_O7TD4 zU`k{O4pPh@&188TziERZ+1!i9u|BT^=00)kF>@TPDnJomy~PkPRq&0A>&g*&kgPb) z2xolJLl%y+p|8zT-=V-BFlea!V8uEH!k+{&Oy0VMzqbxRsKIRDSzKeN`A3>Iu7Xni z67>K}&>v|E?*GX5_j;9B2+;{gi~Y?30|rJ$E3X*FB#ViJ<@xRopVneL!6Tx{M!A8a z!EVsTxex>!^@{nE2bv2T7_6ZBj}xruC<1vW+9jffxCoI@9%2F6akpHl-h7=PY>j85~)xhYu@(GkcmBUt2>3NeVX6fDQuJxa|mGs}s%&))BQ6 zk@5Yi$9v+B-}=MF8D!WOV!{=Exznc?30}?}n)DPqER_ZzC&*G4`{c(WVg34sb1v$% zzZka&evbdBjW7ov!hafdH?9{my1_>*oE-5SDNsKCv-L;&|MBiYb z-z8aCEnx-!N>`0bK|dh^nbq4syM+PfB!BZ-^HQyBM#EqfCsj9JQnJnCJFnqrDG@oU z9*To4KVpkyFrU&f8d!R9+(s}yyTkBd5IEBwk{r^CqJOJ#D)}1Y+qVymhPg7dT$cOd zsD6~y2Nk7TveDRkpA5}o#*-IOnygs~lGC5MVTn2z$Th#ii~vr6hR~H(&u%b3F?8?^ zS^eh=>adOkoR7MTuRf3p;fl!5Nl1!Wb$Zr`HfJG{799fi_5cDOhen@vJgOthrRpQ} zY?t5Pc8Y;b&e_<=`(nZJCChSXbKClH>XF5GG{x;$X@I|K5K1%lTmQHKM#u4RDq$3w zA7l4in*-4xgK0l55TXdZQ$qq4D}K)7}}kKF=+FGhUS=vfov?)qHZb&MQzou%Kzc?oS8@G4J4eL%&g6M9!z8|yiy zHw-Y`*sN=`z*HWNL#P`73mKR&UyW{x zGxPN;D*T*e0mqu{^bvg42}KG^Yfbp&i>5((;>A=AAz9h4BZxx0v9FLn=skR34Urm| zZ0fIZyemS!>2;JuOS)b$IH*R6}Lop6Q)|Io7~x(YRZxlQ80c;!V0rB>1lI~5wtyA49md3SK9wLf^v7njA!yU zU?LT|Lw1cT%z^l={37yP#`_IY(DdmB0#(BVYQ2$55vzNrpau*Fy%g1+Pvg_jP=%9h z{%OxY)a)QQ3=Wb1}@rgp`302A(9JfP-U zvdk<-eV6T)+~_j_9by>BLV(<8VZ<1U);>u%Tt>@c&jerQO(MDhr958N!;d8GuvBdv z`SoODWJ638-jOw&6{azd9BR(GSr7|zQ`DJ0S-;k753mV|zc~JApI|D?!ZP zGLZ#zh&a}g!z2~~SebxTA-3mqAc9CQ-pQtY@cz~1Sk@t$ZSu;6yM_=dauUDY z-ce8t9q%QLU`dHrD+_s_rM}raXt8J$)h{SmI^Fm?s;MKkcc9FrmnWSRYcM90qFND0 zeL6n%5DSFN_t$N-_+{Z>tWlDFdeDSk= z)oVlG03-s%a^F~*S1!Qa>#>Qy`ij*h34xqo8b*m5`>gqbhiEkZk)2R~P{O9%E5|D>!0x=e7%E)`wd^Y*8iiV^?esE)JLPZYTrL%=cFkaFmVRu$Buk+h#^qKt@^~$lLUi{PPK%s1P<((m?54gEU9r>`sT-e9DA+h zb(y*<9*3Fv{nyZ8si}>G(R&vvV0-1C2jKm;_kud~89J^8cqm>%1g53Uc|i~*FRwP} z4}8PRMoHA!xto??sP(G>zW;Vk$f@;&D%(I?V*%!;DF6h$pnq_PV o=TR(pO*VBx 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 z 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 Date: Sat, 22 Jul 2023 06:41:49 +0800 Subject: [PATCH 04/34] feat: update Dockerfile for v2 --- Dockerfile | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index c81649d..650d377 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,8 @@ -ARG BASE_IMAGE +FROM docker.io/node:20.5.0-alpine3.17 - -FROM alpine:3.17.2 AS alpine-base -RUN apk add --no-cache chromium chromium-chromedriver nodejs tini \ - && adduser -u 1000 -H -D bot -# Replace cdc token to prevent begin detected -RUN sed -i s/cdc_/fan_/g /usr/bin/chromedriver -ENV CHROME_BIN=/usr/bin/chromium-browser CHROME_PATH=/usr/lib/chromium/ - - -FROM alpine-base AS alpine-font -RUN apk add --no-cache font-noto-cjk - - -FROM ${BASE_IMAGE} -ARG VARIANT -USER bot COPY dist/index.cjs /app/index.js +RUN apk add tini + ENV TZ=Asia/Taipei -ENV IMAGE_VARIANT=${VARIANT} WORKDIR /app ENTRYPOINT [ "/sbin/tini", "--", "node", "index.js" ] From 73508988d8fa81da39501899d8e35316a4ad7e7d Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 06:24:47 +0800 Subject: [PATCH 05/34] ci/cd: update CI/CD for v2 Removed unittests in CI/CD as they are not yet implemented. --- .github/workflows/publish.yml | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5af0d8f..32b4af3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,47 +9,27 @@ on: - src/** jobs: - unittests: - uses: ./.github/workflows/unittests.yml - build: - name: Build project and push image to dockerhub and ghcr - needs: - - unittests + name: Build project and push image to Dockerhub and Github Container Registry runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 + - name: Setup Node.js v20 + uses: actions/setup-node@v3 + with: + node-version: 20 - name: Setup pnpm uses: pnpm/action-setup@v2 with: run_install: true - name: Build project run: pnpm build - - name: Build kelly image - uses: wdzeng/image@v2 - with: - dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }} - dockerhub-password: ${{ secrets.DOCKERHUB_TOKEN }} - variant: kelly - platforms: linux/amd64,linux/arm64,linux/arm/v7 - build-args: | - BASE_IMAGE=alpine-base - VARIANT=kelly - repo-description: Get Shopee coins everyday - repo-license: MIT - - name: Build regular image - uses: wdzeng/image@v2 + - name: Build image + uses: wdzeng/image@v3 with: dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }} dockerhub-password: ${{ secrets.DOCKERHUB_TOKEN }} - init: false - platforms: linux/amd64,linux/arm64,linux/arm/v7 - build-args: | - BASE_IMAGE=alpine-font - VARIANT='' - repo-description: Get Shopee coins everyday - repo-license: MIT tag: name: Add tags to repository From 4fdb8536a99a71094a4c08fe69c0fbc647fa8874 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 06:28:08 +0800 Subject: [PATCH 06/34] Bump to v2.0.0-alpha.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab13ad8..6191e66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopee-coins-bot", - "version": "1.3.2", + "version": "2.0.0-alpha.0", "description": "Get Shopee coins everyday", "author": { "name": "hyperbola", From 14e22fb9584276ecf8a01ea62b8b7d667dc19175 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 07:38:13 +0800 Subject: [PATCH 07/34] fix: incorrect checkin list length for history command JSON output The settings API is returning checking list with length 8. Not sure why but this violates with our spec. --- src/api-types/settings.ts | 2 +- src/bot.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/api-types/settings.ts b/src/api-types/settings.ts index 1f01e53..575a811 100644 --- a/src/api-types/settings.ts +++ b/src/api-types/settings.ts @@ -12,7 +12,7 @@ interface Data { 'asset_setting': string 'checked_in_today': boolean 'checked_in_today_amount': number - 'checkin_list': [number, number, number, number, number, number, number] + 'checkin_list': number[] 'dataview_type': string 'deviceid': string 'devicetype': string diff --git a/src/bot.ts b/src/bot.ts index 515f905..017c68c 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -112,8 +112,13 @@ export default class ShopeeBot { throw new UserNotLoggedInError() } + if (body.data.checkin_list.length < 7) { + throw new Error('Unexpected checkin history length') + } + return { - amounts: body.data.checkin_list, + // @ts-expect-error: length of `checkin_list` is always 7 + amounts: body.data.checkin_list.slice(0, 7), checkedInToday: body.data.checked_in_today, todayIndex: body.data.today_index - 1 } From ce01cc60601c9baab217d30ca644db0f190ade91 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 07:39:42 +0800 Subject: [PATCH 08/34] Bump to v2.0.0-alpha.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6191e66..40dd5c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopee-coins-bot", - "version": "2.0.0-alpha.0", + "version": "2.0.0-alpha.1", "description": "Get Shopee coins everyday", "author": { "name": "hyperbola", From 0295dfa64ceab377703636f98e03607fda9862c5 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 08:17:24 +0800 Subject: [PATCH 09/34] fix: some unknown argument bypass --- src/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/index.ts b/src/index.ts index f07402d..f2799a3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -98,6 +98,14 @@ program cookie = readCookieFromFile(cookieOption) }) +// Disallow any unused argument. +program.hook('preAction', (_thisCommand, actionCommand) => { + if (actionCommand.args.length > 0) { + logger.error(`Unknown option: ${actionCommand.args[0]}`) + process.exit(ExitCode.INVALID_OPTIONS) + } +}) + program .command('checkin') .description('Checkin to get Shopee coins') From bfda81ece02644c615f9766a1c0e1de5450486ab Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 22 Jul 2023 08:20:52 +0800 Subject: [PATCH 10/34] fix: redundant linefeed for `history` command JSON output --- src/index.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index f2799a3..711c66f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -172,19 +172,20 @@ program process.exit(0) } - let outputResult = '' + const outputLines = [] for (let i = 0; i < 7; i++) { + let outputLine = '' const checkedIn = i < history.todayIndex || (i === history.todayIndex && history.checkedInToday) - outputResult += checkedIn ? '✅' : '⬜' - outputResult += ' ' - outputResult += history.amounts[i]?.toFixed(2) + outputLine += checkedIn ? '✅' : '⬜' + outputLine += ' ' + outputLine += history.amounts[i]?.toFixed(2) if (i === history.todayIndex) { - outputResult += ' <' + outputLine += ' <' } - outputResult += '\n' + outputLines.push(outputLine) } - console.log(outputResult) + console.log(outputLines.join('\n')) }) program From 7ee0c5057ccf47b18270370229415dd2bfbce49c Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sun, 23 Jul 2023 15:09:35 +0800 Subject: [PATCH 11/34] build: add `non-cache` on `apk add` in Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 650d377..45a8acc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM docker.io/node:20.5.0-alpine3.17 COPY dist/index.cjs /app/index.js -RUN apk add tini +RUN apk add --no-cache tini ENV TZ=Asia/Taipei WORKDIR /app From 1e28a748f98703f5fd95a1924f18fd371880b1a4 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 00:20:29 +0800 Subject: [PATCH 12/34] docs: state that do not log out after getting cookie in instructions --- docs/how-to-get-cookie.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/how-to-get-cookie.md b/docs/how-to-get-cookie.md index fc2b608..8508dbe 100644 --- a/docs/how-to-get-cookie.md +++ b/docs/how-to-get-cookie.md @@ -14,3 +14,4 @@ 5. 複製 cookie,如上圖大紅框。Cookie 是敏感資訊,不要外流;上圖沒有打馬賽克是因為我沒有登入。 6. 將 cookie 貼到一個檔案中。注意 cookie 只會有一行。把檔案存起來。 +7. 不要登出,關掉瀏覽器。 From e2316560bf73580848900766d3505a44fed2abe6 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 00:21:40 +0800 Subject: [PATCH 13/34] Bump to v2.0.0-alpha.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40dd5c4..be0e24c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopee-coins-bot", - "version": "2.0.0-alpha.1", + "version": "2.0.0-alpha.2", "description": "Get Shopee coins everyday", "author": { "name": "hyperbola", From 481c49d6c07bb7c12a0458cf82227811adbde8ee Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 00:33:18 +0800 Subject: [PATCH 14/34] docs: fix `history` command output format instruction --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f444fe8..597730a 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ $ docker run hyperbola/shopee-coins-bot:edge history 如果你想分析 output,可以用 `--output json`,這樣印出的結果比較好分析。 ```sh -$ docker run hyperbola/shopee-coins-bot:edge history +$ docker run hyperbola/shopee-coins-bot:edge history --output json {"amounts":[0.05,0.1,0.15,0.2,0.25,0.25,0.5],"checkedInToday":true,"todayIndex":2} ``` @@ -140,7 +140,7 @@ $ docker run hyperbola/shopee-coins-bot:edge history - `.amounts` (`number[]`): 含有七個數字的陣列,分別表示七天來每天可領的蝦幣數量。 - `.checkedInToday` (`boolean`): 今天是否已經簽到。 -- `todayIndex` (`number`): 今天是七天中的第幾天;此值為 0-based,亦即 `0` 表第一天、`1` +- `.todayIndex` (`number`): 今天是七天中的第幾天;此值為 0-based,亦即 `0` 表第一天、`1` 表第二天、依此類推。 ## 姊妹機器人 From 18ef0a9f594927e7fa278b999f45cb6cb0e6d952 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 00:40:35 +0800 Subject: [PATCH 15/34] docs: state that all CLIs in demos are omitting usage of `-v` and `-c` --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 597730a..e0ff3b9 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,9 @@ docker run hyperbola/shopee-coins-bot:edge --help docker run -v "$HOME/.config/shopee:/config" hyperbola/shopee-coins-bot:edge -c /config/cookie whoami ``` +為了讀取 cookie,所有的指令都會需要搭配 `-v ` 和 +`-c `。為求精簡,以下所有範例中的指令將不列出 `-v` 和 `-c`。 + ## 簽到 使用 `checkin` 指令進行簽到。 From b883a9c9c24246555c2716223db8c7ebcd1c3f04 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 01:24:03 +0800 Subject: [PATCH 16/34] fix: output color is yellow for command `balance` --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 711c66f..4d7ef9a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -149,7 +149,7 @@ program } catch (e: unknown) { handleError(e) } - console.log(balance) + console.log('%d', balance) }) program From 83c960d7575f795bc6978d0fce43bcf701517652 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 26 Jul 2023 01:24:48 +0800 Subject: [PATCH 17/34] refact: replace loglevel with our own implementation We want that all logging messages be printed to stderr, and command results stdout, but `loglevel` outputs messages of `info` level to stdout, and there is no way to configure. Therefore implement our own logging functions. Also use `chalk` for printing colors. --- package.json | 4 ++-- pnpm-lock.yaml | 16 ++++++++-------- src/bot.ts | 5 ++--- src/index.ts | 18 +++++------------- src/log.ts | 25 +++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 src/log.ts diff --git a/package.json b/package.json index be0e24c..425f860 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "clean": "rm -rf dist" }, "dependencies": { - "commander": "^11.0.0", - "loglevel": "^1.8.1" + "chalk": "^5.3.0", + "commander": "^11.0.0" }, "devDependencies": { "@types/node": "^20.4.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd412e6..cd24b13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,12 @@ settings: excludeLinksFromLockfile: false dependencies: + chalk: + specifier: ^5.3.0 + version: 5.3.0 commander: specifier: ^11.0.0 version: 11.0.0 - loglevel: - specifier: ^1.8.1 - version: 1.8.1 devDependencies: '@types/node': @@ -952,6 +952,11 @@ packages: supports-color: 7.2.0 dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -2160,11 +2165,6 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} - engines: {node: '>= 0.6.0'} - dev: false - /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} diff --git a/src/bot.ts b/src/bot.ts index 017c68c..172e63e 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,10 +1,9 @@ -import logger from 'loglevel' - import type { CheckinResponse } from '@/api-types/checkin' import type { CoinsResponse, UnknownCoinsResponse } from '@/api-types/coins' import type { SettingsResponse } from '@/api-types/settings' import { parseCookie } from '@/cookie' import { InvalidCookieError, UserNotLoggedInError } from '@/errors' +import * as logger from '@/log' export interface CheckinHistory { amounts: [number, number, number, number, number, number, number] @@ -81,7 +80,7 @@ export default class ShopeeBot { async getBalance(): Promise { const coinsResponseBody = await this.getCoinsApiResponseBody() - logger.debug(coinsResponseBody) + logger.debug('%s', coinsResponseBody) return coinsResponseBody.coins } diff --git a/src/index.ts b/src/index.ts index 4d7ef9a..1d03e41 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,11 +3,11 @@ import fs from 'node:fs' import { Option, program } from 'commander' -import logger from 'loglevel' import ShopeeBot, { type CheckinHistory } from '@/bot' import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/errors' import ExitCode from '@/exit-code' +import * as logger from '@/log' function handleError(e: unknown): never { if (e instanceof InvalidCookieError) { @@ -27,8 +27,8 @@ function handleError(e: unknown): never { } // Unexpected error. - if (e instanceof Error) { - logger.debug(e.stack) + if (e instanceof Error && e.stack) { + logger.debug('%s', e.stack) } const errMsg: unknown = e instanceof Error ? e.message : e logger.error('Unexpected error: %s', typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg)) @@ -64,6 +64,7 @@ function readCookieFromFile(path: string): string { return cookie } +// Version number will be replaced by webpack during build. const version: string = process.env.VERSION ?? 'Development' program .name(`docker run hyperbola/shopee-coins-bot:${version}`) @@ -76,16 +77,7 @@ program // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const quietOption = thisCommand.opts().quiet if (quietOption) { - if (process.env.DEBUG) { - logger.setDefaultLevel('debug') - logger.warn('Option `--quiet` is ignored in debug mode.') - } else { - logger.setDefaultLevel('warn') - } - } else if (process.env.DEBUG) { - logger.setDefaultLevel('debug') - } else { - logger.setDefaultLevel('info') + process.env.QUIET = '1' } }) diff --git a/src/log.ts b/src/log.ts new file mode 100644 index 0000000..ef15926 --- /dev/null +++ b/src/log.ts @@ -0,0 +1,25 @@ +import chalk from 'chalk' + +function isTruthy(value: string | undefined): value is string { + return value !== undefined && value !== '' && value !== '0' && value !== 'false' +} + +export function debug(format: string, ...msg: unknown[]): void { + if (isTruthy(process.env.DEBUG)) { + console.error(chalk.blue(format), ...msg) + } +} + +export function info(format: string, ...msg: unknown[]): void { + if (isTruthy(process.env.DEBUG) || !isTruthy(process.env.QUIET)) { + console.error(format, ...msg) + } +} + +export function warn(format: string, ...msg: unknown[]): void { + console.error(chalk.yellow.bold(format), ...msg) +} + +export function error(format: string, ...msg: unknown[]): void { + console.error(chalk.red.bold(format), ...msg) +} From 74463da038cb3cf3cabf266c401194960884f211 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Fri, 28 Jul 2023 19:12:23 +0800 Subject: [PATCH 18/34] docs: add instruction about reporting issues for v2 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e0ff3b9..adccfb7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ > [!IMPORTANT] > 蝦皮簽到機器人 v2 還在實驗中,預計九月釋出。目前仍在使用的 v1 -> 請至[這裡](https://github.com/wdzeng/shopee-coins-bot/tree/main)。 +> 請至[這裡](https://github.com/wdzeng/shopee-coins-bot/tree/main)。如果你使用 v2 +> 機器人遇到任何問題,歡迎到 [Issues](https://github.com/wdzeng/shopee-coins-bot/issues) 回報! 💰💰 簽到蝦皮領蝦幣 💰💰 From 7fb0a2f673bb32836d460fd735ae9c2221359bc2 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 29 Jul 2023 19:54:56 +0800 Subject: [PATCH 19/34] refact: remove global variables in index.ts --- src/index.ts | 31 +++++++++++++++++-------------- src/utils/version.ts | 2 ++ 2 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 src/utils/version.ts diff --git a/src/index.ts b/src/index.ts index 1d03e41..eaa6acf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ import ShopeeBot, { type CheckinHistory } from '@/bot' import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/errors' import ExitCode from '@/exit-code' import * as logger from '@/log' +import { version } from '@/utils/version' function handleError(e: unknown): never { if (e instanceof InvalidCookieError) { @@ -64,8 +65,10 @@ function readCookieFromFile(path: string): string { return cookie } -// Version number will be replaced by webpack during build. -const version: string = process.env.VERSION ?? 'Development' +interface GlobalOptions { + cookieString: string +} + program .name(`docker run hyperbola/shopee-coins-bot:${version}`) .description('Give me Shopee coins!') @@ -81,13 +84,12 @@ program } }) -let cookie: string program .requiredOption('-c, --cookie ', 'path to cookie file') - .hook('preAction', (thisCommand) => { + .hook('preAction', (thisCommand, actionCommand) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const cookieOption: string = thisCommand.opts().cookie - cookie = readCookieFromFile(cookieOption) + actionCommand.opts().cookieString = readCookieFromFile(cookieOption) }) // Disallow any unused argument. @@ -102,10 +104,10 @@ program .command('checkin') .description('Checkin to get Shopee coins') .option('-f --force', 'force checkin even if already checked in', false) - .action(async (options) => { + .action(async (options: GlobalOptions & { force: boolean }) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access const force = options.force - const bot = new ShopeeBot(cookie) + const bot = new ShopeeBot(options.cookieString) let result: number | false try { @@ -133,8 +135,8 @@ program program .command('balance') .description('Get my Shopee coins balance') - .action(async () => { - const bot = new ShopeeBot(cookie) + .action(async (options: GlobalOptions) => { + const bot = new ShopeeBot(options.cookieString) let balance: number try { balance = await bot.getBalance() @@ -148,8 +150,8 @@ program .command('history') .description('Get my Shopee coins checkin history') .addOption(new Option('-o, --output [format]').choices(['raw', 'json']).default('raw')) - .action(async (options) => { - const bot = new ShopeeBot(cookie) + .action(async (options: GlobalOptions & { output: 'raw' | 'json' }) => { + const bot = new ShopeeBot(options.cookieString) let history: CheckinHistory try { history = await bot.getCheckinHistory() @@ -158,7 +160,7 @@ program } // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access - const outputFormat: 'raw' | 'json' = options.output + const outputFormat = options.output if (outputFormat === 'json') { console.log(JSON.stringify(history)) process.exit(0) @@ -183,8 +185,9 @@ program program .command('whoami') .description('Get my Shopee username') - .action(async () => { - const bot = new ShopeeBot(cookie) + .action(async (options: GlobalOptions) => { + logger.debug(options.cookieString) + const bot = new ShopeeBot(options.cookieString) let username try { username = await bot.getLoginUser() diff --git a/src/utils/version.ts b/src/utils/version.ts new file mode 100644 index 0000000..ce012c5 --- /dev/null +++ b/src/utils/version.ts @@ -0,0 +1,2 @@ +// Version number will be replaced by webpack during build. +export const version: string = process.env.VERSION ?? 'Development' From bc4bfea260fd0e984273b1b38839276c2c046f2c Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 29 Jul 2023 20:03:53 +0800 Subject: [PATCH 20/34] refact: separate CLI and internal API Also remove dependency from API to logging utility. --- package.json | 2 +- src/{ => api}/cookie.ts | 2 +- src/{ => api}/errors.ts | 0 src/{bot.ts => api/index.ts} | 12 +++++------- src/{api-types => api/types}/checkin.ts | 0 src/{api-types => api/types}/coins.ts | 0 src/{api-types => api/types}/settings.ts | 0 src/{ => cli}/exit-code.ts | 0 src/{ => cli}/index.ts | 10 +++++----- src/{ => cli}/log.ts | 0 src/{utils => cli}/version.ts | 0 webpack.config.js | 2 +- 12 files changed, 13 insertions(+), 15 deletions(-) rename src/{ => api}/cookie.ts (90%) rename src/{ => api}/errors.ts (100%) rename src/{bot.ts => api/index.ts} (92%) rename src/{api-types => api/types}/checkin.ts (100%) rename src/{api-types => api/types}/coins.ts (100%) rename src/{api-types => api/types}/settings.ts (100%) rename src/{ => cli}/exit-code.ts (100%) rename src/{ => cli}/index.ts (96%) rename src/{ => cli}/log.ts (100%) rename src/{utils => cli}/version.ts (100%) diff --git a/package.json b/package.json index 425f860..5011aff 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "type": "module", "scripts": { "build": "webpack", - "dev": "tsx src/index.ts", + "dev": "tsx src/cli/index.ts", "lint": "eslint src/ --ext .ts --fix --ignore-path .gitignore", "clean": "rm -rf dist" }, diff --git a/src/cookie.ts b/src/api/cookie.ts similarity index 90% rename from src/cookie.ts rename to src/api/cookie.ts index df0a872..c6f7c8a 100644 --- a/src/cookie.ts +++ b/src/api/cookie.ts @@ -1,4 +1,4 @@ -import { InvalidCookieError } from './errors' +import { InvalidCookieError } from '@/api/errors' export function parseCookie(cookie: string): Record { return cookie.split(';').reduce>((acc, cookieString) => { diff --git a/src/errors.ts b/src/api/errors.ts similarity index 100% rename from src/errors.ts rename to src/api/errors.ts diff --git a/src/bot.ts b/src/api/index.ts similarity index 92% rename from src/bot.ts rename to src/api/index.ts index 172e63e..62f26fa 100644 --- a/src/bot.ts +++ b/src/api/index.ts @@ -1,9 +1,8 @@ -import type { CheckinResponse } from '@/api-types/checkin' -import type { CoinsResponse, UnknownCoinsResponse } from '@/api-types/coins' -import type { SettingsResponse } from '@/api-types/settings' -import { parseCookie } from '@/cookie' -import { InvalidCookieError, UserNotLoggedInError } from '@/errors' -import * as logger from '@/log' +import { parseCookie } from '@/api/cookie' +import { InvalidCookieError, UserNotLoggedInError } from '@/api/errors' +import type { CheckinResponse } from '@/api/types/checkin' +import type { CoinsResponse, UnknownCoinsResponse } from '@/api/types/coins' +import type { SettingsResponse } from '@/api/types/settings' export interface CheckinHistory { amounts: [number, number, number, number, number, number, number] @@ -80,7 +79,6 @@ export default class ShopeeBot { async getBalance(): Promise { const coinsResponseBody = await this.getCoinsApiResponseBody() - logger.debug('%s', coinsResponseBody) return coinsResponseBody.coins } diff --git a/src/api-types/checkin.ts b/src/api/types/checkin.ts similarity index 100% rename from src/api-types/checkin.ts rename to src/api/types/checkin.ts diff --git a/src/api-types/coins.ts b/src/api/types/coins.ts similarity index 100% rename from src/api-types/coins.ts rename to src/api/types/coins.ts diff --git a/src/api-types/settings.ts b/src/api/types/settings.ts similarity index 100% rename from src/api-types/settings.ts rename to src/api/types/settings.ts diff --git a/src/exit-code.ts b/src/cli/exit-code.ts similarity index 100% rename from src/exit-code.ts rename to src/cli/exit-code.ts diff --git a/src/index.ts b/src/cli/index.ts similarity index 96% rename from src/index.ts rename to src/cli/index.ts index eaa6acf..2dcbbc4 100644 --- a/src/index.ts +++ b/src/cli/index.ts @@ -4,11 +4,11 @@ import fs from 'node:fs' import { Option, program } from 'commander' -import ShopeeBot, { type CheckinHistory } from '@/bot' -import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/errors' -import ExitCode from '@/exit-code' -import * as logger from '@/log' -import { version } from '@/utils/version' +import ShopeeBot, { type CheckinHistory } from '@/api' +import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' +import ExitCode from '@/cli/exit-code' +import * as logger from '@/cli/log' +import { version } from '@/cli/version' function handleError(e: unknown): never { if (e instanceof InvalidCookieError) { diff --git a/src/log.ts b/src/cli/log.ts similarity index 100% rename from src/log.ts rename to src/cli/log.ts diff --git a/src/utils/version.ts b/src/cli/version.ts similarity index 100% rename from src/utils/version.ts rename to src/cli/version.ts diff --git a/webpack.config.js b/webpack.config.js index 26bf66d..20ddb3f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,7 +14,7 @@ const versionPlugin = new webpack.DefinePlugin({ 'process.env.VERSION': JSON.str export default { mode: 'production', - entry: './src/index.ts', + entry: './src/cli/index.ts', output: { filename: 'index.cjs', path: outputDir, From e888b3d60a6b48ec26c6c1f7cd74e36a18d0f447 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 29 Jul 2023 20:45:16 +0800 Subject: [PATCH 21/34] build: replace webpack with esbuild --- .eslintignore | 2 +- build.cjs | 23 ++ package.json | 9 +- pnpm-lock.yaml | 868 ++++++++++++---------------------------------- webpack.config.js | 42 --- 5 files changed, 256 insertions(+), 688 deletions(-) create mode 100755 build.cjs delete mode 100644 webpack.config.js diff --git a/.eslintignore b/.eslintignore index 95bd824..ecc3fc5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ .eslintrc.cjs +build.cjs dist -webpack.config.js diff --git a/build.cjs b/build.cjs new file mode 100755 index 0000000..12c8aee --- /dev/null +++ b/build.cjs @@ -0,0 +1,23 @@ +#!/usr/bin/env node + +const fs = require('node:fs') +const path = require('node:path') + +const { build } = require('esbuild') + +const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'package.json'))) +const version = packageJson.version + +const options = { + entryPoints: ['./src/cli/index.ts'], + outfile: './dist/index.cjs', + bundle: true, + platform: 'node', + target: 'node20', + minify: true, + define: { + 'process.env.VERSION': JSON.stringify(version) + } +} + +build(options).catch(() => process.exit(1)) diff --git a/package.json b/package.json index 5011aff..15726c5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "packageManager": "pnpm@8.6.9", "type": "module", "scripts": { - "build": "webpack", + "build": "./build.cjs", "dev": "tsx src/cli/index.ts", "lint": "eslint src/ --ext .ts --fix --ignore-path .gitignore", "clean": "rm -rf dist" @@ -22,16 +22,13 @@ }, "devDependencies": { "@types/node": "^20.4.4", + "esbuild": "^0.18.17", "eslint": "^8.45.0", "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.3.4", "prettier": "^3.0.0", "ts-custom-error": "^3.3.1", - "ts-loader": "^9.4.4", - "tsconfig-paths-webpack-plugin": "^4.1.0", "tsx": "^3.12.7", - "typescript": "^5.1.6", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4" + "typescript": "^5.1.6" }, "license": "MIT" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd24b13..04ea123 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ devDependencies: '@types/node': specifier: ^20.4.4 version: 20.4.4 + esbuild: + specifier: ^0.18.17 + version: 0.18.17 eslint: specifier: ^8.45.0 version: 8.45.0 @@ -28,24 +31,12 @@ devDependencies: ts-custom-error: specifier: ^3.3.1 version: 3.3.1 - ts-loader: - specifier: ^9.4.4 - version: 9.4.4(typescript@5.1.6)(webpack@5.88.2) - tsconfig-paths-webpack-plugin: - specifier: ^4.1.0 - version: 4.1.0 tsx: specifier: ^3.12.7 version: 3.12.7 typescript: specifier: ^5.1.6 version: 5.1.6 - webpack: - specifier: ^5.88.2 - version: 5.88.2(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack@5.88.2) packages: @@ -75,11 +66,6 @@ packages: js-tokens: 4.0.0 dev: true - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true - /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: @@ -110,6 +96,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.18.17: + resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -119,6 +114,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.18.17: + resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -128,6 +132,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.18.17: + resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -137,6 +150,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.18.17: + resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -146,6 +168,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.18.17: + resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -155,6 +186,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.18.17: + resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -164,6 +204,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.18.17: + resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -173,6 +222,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.18.17: + resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -182,6 +240,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.18.17: + resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -191,6 +258,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.18.17: + resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -200,6 +276,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.18.17: + resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -209,6 +294,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.18.17: + resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -218,6 +312,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.18.17: + resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -227,6 +330,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.18.17: + resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -236,6 +348,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.18.17: + resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -245,6 +366,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.18.17: + resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -254,6 +384,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.18.17: + resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -263,6 +402,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.18.17: + resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -272,6 +420,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.18.17: + resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -281,6 +438,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.18.17: + resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -290,6 +456,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.18.17: + resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -299,6 +474,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.18.17: + resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -361,43 +545,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -431,24 +578,6 @@ packages: tslib: 2.6.0 dev: true - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.44.0 - '@types/estree': 1.0.1 - dev: true - - /@types/eslint@8.44.0: - resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} - dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 - dev: true - - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - dev: true - /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true @@ -601,165 +730,6 @@ packages: eslint-visitor-keys: 3.4.1 dev: true - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) - dev: true - - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) - dev: true - - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.88.2) - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -774,14 +744,6 @@ packages: hasBin: true dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -892,17 +854,6 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001467 - electron-to-chromium: 1.4.332 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10(browserslist@4.21.5) - dev: true - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -931,10 +882,6 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001467: - resolution: {integrity: sha512-cEdN/5e+RPikvl9AHm4uuLXxeCNq8rFsQ+lPHTfe/OtypP3WwnVVbjn+6uBV7PaFL6xUFzTh+sSCOz1rKhcO+Q==} - dev: true - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -957,11 +904,6 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: false - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} @@ -974,15 +916,6 @@ packages: escape-string-regexp: 1.0.5 dev: true - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1004,24 +937,11 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: true - /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} dev: false - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1114,10 +1034,6 @@ packages: esutils: 2.0.3 dev: true - /electron-to-chromium@1.4.332: - resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} - dev: true - /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} @@ -1126,12 +1042,6 @@ packages: tapable: 2.2.1 dev: true - /envinfo@7.10.0: - resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} - engines: {node: '>=4'} - hasBin: true - dev: true - /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -1178,10 +1088,6 @@ packages: which-typed-array: 1.1.9 dev: true - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - dev: true - /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -1236,9 +1142,34 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + /esbuild@0.18.17: + resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.17 + '@esbuild/android-arm64': 0.18.17 + '@esbuild/android-x64': 0.18.17 + '@esbuild/darwin-arm64': 0.18.17 + '@esbuild/darwin-x64': 0.18.17 + '@esbuild/freebsd-arm64': 0.18.17 + '@esbuild/freebsd-x64': 0.18.17 + '@esbuild/linux-arm': 0.18.17 + '@esbuild/linux-arm64': 0.18.17 + '@esbuild/linux-ia32': 0.18.17 + '@esbuild/linux-loong64': 0.18.17 + '@esbuild/linux-mips64el': 0.18.17 + '@esbuild/linux-ppc64': 0.18.17 + '@esbuild/linux-riscv64': 0.18.17 + '@esbuild/linux-s390x': 0.18.17 + '@esbuild/linux-x64': 0.18.17 + '@esbuild/netbsd-x64': 0.18.17 + '@esbuild/openbsd-x64': 0.18.17 + '@esbuild/sunos-x64': 0.18.17 + '@esbuild/win32-arm64': 0.18.17 + '@esbuild/win32-ia32': 0.18.17 + '@esbuild/win32-x64': 0.18.17 dev: true /escape-string-regexp@1.0.5: @@ -1403,14 +1334,6 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.0: resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1493,11 +1416,6 @@ packages: estraverse: 5.3.0 dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -1508,11 +1426,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1570,11 +1483,6 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true - /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -1701,10 +1609,6 @@ packages: is-glob: 4.0.3 dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1838,15 +1742,6 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1877,11 +1772,6 @@ packages: side-channel: 1.0.4 dev: true - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - dev: true - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -1987,13 +1877,6 @@ packages: engines: {node: '>=8'} dev: true - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2060,20 +1943,6 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.4.4 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -2115,17 +1984,6 @@ packages: minimist: 1.2.8 dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2138,11 +1996,6 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2189,18 +2042,6 @@ packages: picomatch: 2.3.1 dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2238,14 +2079,6 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true - /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -2427,13 +2260,6 @@ packages: engines: {node: '>=8.6'} dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -2466,12 +2292,6 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.1.2 - dev: true - /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -2491,13 +2311,6 @@ packages: type-fest: 0.6.0 dev: true - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.1 - dev: true - /regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -2519,23 +2332,11 @@ packages: jsesc: 0.5.0 dev: true - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true @@ -2574,10 +2375,6 @@ packages: queue-microtask: 1.2.3 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: @@ -2592,15 +2389,6 @@ packages: regexp-tree: 0.1.27 dev: true - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -2619,19 +2407,6 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2773,13 +2548,6 @@ packages: has-flag: 4.0.0 dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2798,41 +2566,6 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.18.2 - webpack: 5.88.2(webpack-cli@5.1.4) - dev: true - - /terser@5.18.2: - resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -2863,30 +2596,6 @@ packages: engines: {node: '>=14.0.0'} dev: true - /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.2): - resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.4 - typescript: 5.1.6 - webpack: 5.88.2(webpack-cli@5.1.4) - dev: true - - /tsconfig-paths-webpack-plugin@4.1.0: - resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} - engines: {node: '>=10.13.0'} - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - tsconfig-paths: 4.2.0 - dev: true - /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -2896,15 +2605,6 @@ packages: strip-bom: 3.0.0 dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: true @@ -2970,17 +2670,6 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.10(browserslist@4.21.5): - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -2994,101 +2683,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /webpack-cli@5.1.4(webpack@5.88.2): - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.3 - envinfo: 7.10.0 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.88.2(webpack-cli@5.1.4) - webpack-merge: 5.9.0 - dev: true - - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - wildcard: 2.0.1 - dev: true - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack@5.88.2(webpack-cli@5.1.4): - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.5 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-cli: 5.1.4(webpack@5.88.2) - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -3119,10 +2713,6 @@ packages: isexe: 2.0.0 dev: true - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 20ddb3f..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,42 +0,0 @@ -import fs from 'node:fs' -import path from 'node:path' -import url from 'node:url' - -import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin' -import webpack from 'webpack' - -const projectRootPath = path.resolve(path.dirname(url.fileURLToPath(import.meta.url))) -const packageJson = JSON.parse(fs.readFileSync(path.resolve(projectRootPath, 'package.json'))) -const version = packageJson.version -const outputDir = path.resolve(projectRootPath, 'dist') - -const versionPlugin = new webpack.DefinePlugin({ 'process.env.VERSION': JSON.stringify(version) }) - -export default { - mode: 'production', - entry: './src/cli/index.ts', - output: { - filename: 'index.cjs', - path: outputDir, - clean: true - }, - resolve: { - plugins: [new TsconfigPathsPlugin()], - extensions: ['.ts', '.js'] - }, - module: { - rules: [ - { - test: /\.ts$/, - use: 'ts-loader', - exclude: /node_modules/ - } - ] - }, - target: 'node', - experiments: { - topLevelAwait: true - }, - externals: ['utf-8-validate', 'bufferutil'], - plugins: [versionPlugin] -} From eb842bf1c8efd1fadddd5db1f4c374a2cc80a121 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 2 Sep 2023 21:48:41 +0800 Subject: [PATCH 22/34] feat: add more error handling about expired cookie --- src/api/errors.ts | 1 - src/api/index.ts | 37 +++++++++++++++++++++++++------------ src/api/types/checkin.ts | 2 +- src/api/types/coins.ts | 7 ------- src/api/types/settings.ts | 2 +- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/api/errors.ts b/src/api/errors.ts index 4334d17..d1e8984 100644 --- a/src/api/errors.ts +++ b/src/api/errors.ts @@ -8,7 +8,6 @@ export class UserNotLoggedInError extends CustomError { } } -// TODO: Use ShopeeError if status code is 2XX but response body contains error messages. export class ShopeeError extends CustomError { constructor( public readonly code: number, diff --git a/src/api/index.ts b/src/api/index.ts index 62f26fa..0f7fce5 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,7 +1,9 @@ +import assert from 'node:assert' + import { parseCookie } from '@/api/cookie' -import { InvalidCookieError, UserNotLoggedInError } from '@/api/errors' +import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' import type { CheckinResponse } from '@/api/types/checkin' -import type { CoinsResponse, UnknownCoinsResponse } from '@/api/types/coins' +import type { CoinsResponse } from '@/api/types/coins' import type { SettingsResponse } from '@/api/types/settings' export interface CheckinHistory { @@ -13,6 +15,21 @@ export interface CheckinHistory { export default class ShopeeBot { constructor(private readonly cookie: string) {} + private handleErrorResponse(responseData: object): void { + if ( + 'code' in responseData && + typeof responseData.code === 'number' && + 'msg' in responseData && + typeof responseData.msg === 'string' + ) { + if (responseData.code === 401) { + throw new UserNotLoggedInError() + } else if (responseData.code !== 0) { + throw new ShopeeError(responseData.code, `Shopee server: ${responseData.msg}`) + } + } + } + private async getCoinsApiResponseBody(): Promise { const url = 'https://shopee.tw/mkt/coins/api/v1/cs/coins' const fetchResult = await fetch(url, { @@ -34,16 +51,8 @@ export default class ShopeeBot { } }) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const result: UnknownCoinsResponse = await fetchResult.json() - if ('code' in result) { - if (result.code === 401) { - throw new InvalidCookieError(`Shopee server: ${result.msg}`) - } - - // Unexpected error. - throw new Error(`Shopee server: ${result.msg}`) - } - + const result: CoinsResponse = await fetchResult.json() + this.handleErrorResponse(result) return result } @@ -74,6 +83,8 @@ export default class ShopeeBot { }) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const responseBody: CheckinResponse = await fetchResult.json() + this.handleErrorResponse(responseBody) + assert('data' in responseBody) return responseBody.data.success ? responseBody.data.increase_coins : false } @@ -104,6 +115,8 @@ export default class ShopeeBot { }) // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const body: SettingsResponse = await fetchResult.json() + this.handleErrorResponse(body) + assert('data' in body) if (body.data.userid === '-1') { throw new UserNotLoggedInError() diff --git a/src/api/types/checkin.ts b/src/api/types/checkin.ts index 626421f..ffa4f51 100644 --- a/src/api/types/checkin.ts +++ b/src/api/types/checkin.ts @@ -3,7 +3,7 @@ export interface CheckinResponse { code: number msg: string - data: Data + data?: Data } export interface Data { diff --git a/src/api/types/coins.ts b/src/api/types/coins.ts index 7839e27..e128528 100644 --- a/src/api/types/coins.ts +++ b/src/api/types/coins.ts @@ -1,7 +1,5 @@ // Response from API https://shopee.tw/mkt/coins/api/v1/cs/coins -export type UnknownCoinsResponse = CoinsResponse | ErrorCoinsResponse - export interface CoinsResponse { coins: number logid: string @@ -9,8 +7,3 @@ export interface CoinsResponse { userid: string username: string } - -export interface ErrorCoinsResponse { - code: number // 401 indicated invalid cookie - msg: string -} diff --git a/src/api/types/settings.ts b/src/api/types/settings.ts index 575a811..b44ed81 100644 --- a/src/api/types/settings.ts +++ b/src/api/types/settings.ts @@ -3,7 +3,7 @@ export interface SettingsResponse { code: number msg: string - data: Data + data?: Data } interface Data { From e919e4d9c41696a8e8357cb11a9e2250a96ebf3c Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 2 Sep 2023 21:53:37 +0800 Subject: [PATCH 23/34] chore: upgrade dependencies and package manager and use nolyfill --- package.json | 34 +- pnpm-lock.yaml | 1219 +++++++++++++++++------------------------------- 2 files changed, 453 insertions(+), 800 deletions(-) diff --git a/package.json b/package.json index 15726c5..06ce521 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "url": "https://blog.hyperbola.me" }, "repository": "github:hyperbola/shopee-coins-bot", - "packageManager": "pnpm@8.6.9", + "license": "MIT", + "packageManager": "pnpm@8.7.1", "type": "module", "scripts": { "build": "./build.cjs", @@ -18,17 +19,28 @@ }, "dependencies": { "chalk": "^5.3.0", - "commander": "^11.0.0" + "commander": "^11.0.0", + "ts-custom-error": "^3.3.1" }, "devDependencies": { - "@types/node": "^20.4.4", - "esbuild": "^0.18.17", - "eslint": "^8.45.0", - "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.3.4", - "prettier": "^3.0.0", - "ts-custom-error": "^3.3.1", - "tsx": "^3.12.7", - "typescript": "^5.1.6" + "@types/node": "^20.5.8", + "esbuild": "^0.19.2", + "eslint": "^8.48.0", + "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.4.4", + "prettier": "^3.0.3", + "tsx": "^3.12.8", + "typescript": "^5.2.2" }, - "license": "MIT" + "pnpm": { + "overrides": { + "array-includes": "npm:@nolyfill/array-includes@latest", + "array.prototype.findlastindex": "npm:@nolyfill/array.prototype.findlastindex@latest", + "array.prototype.flat": "npm:@nolyfill/array.prototype.flat@latest", + "array.prototype.flatmap": "npm:@nolyfill/array.prototype.flatmap@latest", + "has": "npm:@nolyfill/has@latest", + "object.fromentries": "npm:@nolyfill/object.fromentries@latest", + "object.groupby": "npm:@nolyfill/object.groupby@latest", + "object.values": "npm:@nolyfill/object.values@latest" + } + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04ea123..dcfe99b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + array-includes: npm:@nolyfill/array-includes@latest + array.prototype.findlastindex: npm:@nolyfill/array.prototype.findlastindex@latest + array.prototype.flat: npm:@nolyfill/array.prototype.flat@latest + array.prototype.flatmap: npm:@nolyfill/array.prototype.flatmap@latest + has: npm:@nolyfill/has@latest + object.fromentries: npm:@nolyfill/object.fromentries@latest + object.groupby: npm:@nolyfill/object.groupby@latest + object.values: npm:@nolyfill/object.values@latest + dependencies: chalk: specifier: ^5.3.0 @@ -11,32 +21,32 @@ dependencies: commander: specifier: ^11.0.0 version: 11.0.0 + ts-custom-error: + specifier: ^3.3.1 + version: 3.3.1 devDependencies: '@types/node': - specifier: ^20.4.4 - version: 20.4.4 + specifier: ^20.5.8 + version: 20.5.8 esbuild: - specifier: ^0.18.17 - version: 0.18.17 + specifier: ^0.19.2 + version: 0.19.2 eslint: - specifier: ^8.45.0 - version: 8.45.0 + specifier: ^8.48.0 + version: 8.48.0 eslint-config-wdzeng: - specifier: github:wdzeng/eslint-config#semver:^0.3.4 - version: github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.1.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@5.0.0)(eslint-plugin-unicorn@47.0.0)(eslint@8.45.0)(prettier@3.0.0)(typescript@5.1.6) + specifier: github:wdzeng/eslint-config#semver:^0.4.4 + version: github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) prettier: - specifier: ^3.0.0 - version: 3.0.0 - ts-custom-error: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.0.3 + version: 3.0.3 tsx: - specifier: ^3.12.7 - version: 3.12.7 + specifier: ^3.12.8 + version: 3.12.8 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 packages: @@ -52,8 +62,8 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: true @@ -61,7 +71,7 @@ packages: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 dev: true @@ -69,26 +79,26 @@ packages: /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.6.2 dev: true - /@esbuild-kit/core-utils@3.1.0: - resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + /@esbuild-kit/core-utils@3.2.2: + resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} dependencies: - esbuild: 0.17.19 + esbuild: 0.18.20 source-map-support: 0.5.21 dev: true /@esbuild-kit/esm-loader@2.5.5: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.6.2 dev: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -96,8 +106,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.18.17: - resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -105,8 +115,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -114,8 +124,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.17: - resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -123,8 +133,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -132,8 +142,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.17: - resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -141,8 +151,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -150,8 +160,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.17: - resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -159,8 +169,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -168,8 +178,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.17: - resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -177,8 +187,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -186,8 +196,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.17: - resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -195,8 +205,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -204,8 +214,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.17: - resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -213,8 +223,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -222,8 +232,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.17: - resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -231,8 +241,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -240,8 +250,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.17: - resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -249,8 +259,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -258,8 +268,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.17: - resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -267,8 +277,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -276,8 +286,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.17: - resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -285,8 +295,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -294,8 +304,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.17: - resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -303,8 +313,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -312,8 +322,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.17: - resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -321,8 +331,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -330,8 +340,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.17: - resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -339,8 +349,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -348,8 +358,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.17: - resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -357,8 +367,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -366,8 +376,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.17: - resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -375,8 +385,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -384,8 +394,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.17: - resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -393,8 +403,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -402,8 +412,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.17: - resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -411,8 +421,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -420,8 +430,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.17: - resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -429,8 +439,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -438,8 +448,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.17: - resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -447,8 +457,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -456,8 +466,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.17: - resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -465,8 +475,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -474,8 +484,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.17: - resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -483,33 +493,28 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.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 dependencies: - eslint: 8.45.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.4.1: - resolution: {integrity: sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==} + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint-community/regexpp@4.6.0: - resolution: {integrity: sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.0 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -520,8 +525,8 @@ packages: - supports-color dev: true - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -566,12 +571,72 @@ packages: fastq: 1.15.0 dev: true + /@nolyfill/array-includes@1.0.21: + resolution: {integrity: sha512-P+SLU5wuJmHnuo1Nhy/3l4yneHm6M+WmISz5tCVGLc0rytUBRfACmneLTryh4nlobAhUulDkBL+VoldU1g3zoA==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/array.prototype.findlastindex@1.0.21: + resolution: {integrity: sha512-chPKEkDdglpJjaP8WhZSlittmV+XsHFv0CmhQVWnif3mJvpxK4/oFwrszkwP4+jXyR9njKeaUIrLKuuTsL7yjw==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/array.prototype.flat@1.0.21: + resolution: {integrity: sha512-RoyB6qmcOSuflZH+XcZAkE1aBrYIV/3qdIGk6EG1afCdZSkUUCz0PAT8h3lHdtgVh+ge82hMK2SdCur2YeNj8A==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/array.prototype.flatmap@1.0.21: + resolution: {integrity: sha512-VWUiJBWk4qDgktkeQRzrtYlQdBRnEU3vfjoQxcBmdn3vSnq7ujKCBox4cdpZe9LZK9FU9Y1L4UteyW5THat2CQ==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/has@1.0.21: + resolution: {integrity: sha512-Sf8iFaegjGp29hQVQjIc+nDR0uWqGkHsFC3jsUigFwGjpafgMaBtL++DpTU9jYAKDJEvslR1szl8qJjNGlhgcw==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/object.fromentries@1.0.21: + resolution: {integrity: sha512-q/uTyFipMOdMjKtAdPq0ufDN1glOa1FWqFGWApJ3CIhTbOqLz+ZypcS3h4sLhM91npP5PoTYma9RPbA4f0TrnA==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/object.groupby@1.0.21: + resolution: {integrity: sha512-/2hyrFMtlNspFdhp4TaQDzPPvqKTmobYY26XAxYqB/1K0eTd3bzg1KwwgNyCtTnScrsByUhIsQ9DdS5goOCluQ==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/object.values@1.0.21: + resolution: {integrity: sha512-5RPPiaknXoCnpwXZTy99Oo/sNega0wf5DsYQU6YOFa1kLhvwgc4x2/Np1F8zT7WwGE9C1POH3ZIuSMelpd79Ew==} + engines: {node: '>=12.4.0'} + dependencies: + '@nolyfill/shared': 1.0.21 + dev: true + + /@nolyfill/shared@1.0.21: + resolution: {integrity: sha512-qDc/NoaFU23E0hhiDPeUrvWzTXIPE+RbvRQtRWSeHHNmCIgYI9HS1jKzNYNJxv4jvZ/1VmM3L6rNVxbj+LBMNA==} + dev: true + /@pkgr/utils@2.4.2: resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: cross-spawn: 7.0.3 - fast-glob: 3.3.0 + fast-glob: 3.3.1 is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 @@ -586,8 +651,8 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@20.4.4: - resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} + /@types/node@20.5.8: + resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==} dev: true /@types/normalize-package-data@2.4.1: @@ -598,8 +663,8 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -609,27 +674,26 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.0 - '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/type-utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.1.0 + '@eslint-community/regexpp': 4.8.0 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.1.0(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==} + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -638,27 +702,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.1.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.45.0 - typescript: 5.1.6 + eslint: 8.48.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.1.0: - resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} + /@typescript-eslint/scope-manager@6.5.0: + resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 dev: true - /@typescript-eslint/type-utils@6.1.0(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} + /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -667,23 +731,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.45.0 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.48.0 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.1.0: - resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} + /@typescript-eslint/types@6.5.0: + resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.1.0(typescript@5.1.6): - resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -691,43 +755,43 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.1.0(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} + /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.1.6) - eslint: 8.45.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + eslint: 8.48.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.1.0: - resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} + /@typescript-eslint/visitor-keys@6.5.0: + resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.1.0 - eslint-visitor-keys: 3.4.1 + '@typescript-eslint/types': 6.5.0 + eslint-visitor-keys: 3.4.3 dev: true /acorn-jsx@5.3.2(acorn@8.10.0): @@ -776,54 +840,11 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -863,6 +884,12 @@ packages: engines: {node: '>=6'} dev: true + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -870,13 +897,6 @@ packages: run-applescript: 5.0.0 dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1005,14 +1025,6 @@ packages: engines: {node: '>=12'} dev: true - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1048,128 +1060,64 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - - /esbuild@0.18.17: - resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.17 - '@esbuild/android-arm64': 0.18.17 - '@esbuild/android-x64': 0.18.17 - '@esbuild/darwin-arm64': 0.18.17 - '@esbuild/darwin-x64': 0.18.17 - '@esbuild/freebsd-arm64': 0.18.17 - '@esbuild/freebsd-x64': 0.18.17 - '@esbuild/linux-arm': 0.18.17 - '@esbuild/linux-arm64': 0.18.17 - '@esbuild/linux-ia32': 0.18.17 - '@esbuild/linux-loong64': 0.18.17 - '@esbuild/linux-mips64el': 0.18.17 - '@esbuild/linux-ppc64': 0.18.17 - '@esbuild/linux-riscv64': 0.18.17 - '@esbuild/linux-s390x': 0.18.17 - '@esbuild/linux-x64': 0.18.17 - '@esbuild/netbsd-x64': 0.18.17 - '@esbuild/openbsd-x64': 0.18.17 - '@esbuild/sunos-x64': 0.18.17 - '@esbuild/win32-arm64': 0.18.17 - '@esbuild/win32-ia32': 0.18.17 - '@esbuild/win32-x64': 0.18.17 + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 dev: true /escape-string-regexp@1.0.5: @@ -1182,27 +1130,27 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@8.8.0(eslint@8.45.0): - resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + /eslint-config-prettier@9.0.0(eslint@8.48.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.45.0 + eslint: 8.48.0 dev: true /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 - resolve: 1.22.1 + is-core-module: 2.13.0 + resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0): + resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1210,14 +1158,13 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 - eslint: 8.45.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + eslint: 8.48.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + fast-glob: 3.3.1 get-tsconfig: 4.6.2 - globby: 13.2.2 - is-core-module: 2.11.0 + is-core-module: 2.13.0 is-glob: 4.0.3 - synckit: 0.8.5 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -1225,7 +1172,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -1246,17 +1193,28 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.45.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-es-x@7.2.0(eslint@8.48.0): + resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + eslint: 8.48.0 + dev: true + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1265,22 +1223,24 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + array-includes: /@nolyfill/array-includes@1.0.21 + array.prototype.findlastindex: /@nolyfill/array.prototype.findlastindex@1.0.21 + array.prototype.flat: /@nolyfill/array.prototype.flat@1.0.21 + array.prototype.flatmap: /@nolyfill/array.prototype.flatmap@1.0.21 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.45.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) - has: 1.0.3 - is-core-module: 2.11.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + has: /@nolyfill/has@1.0.21 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.1 - semver: 6.3.0 + object.fromentries: /@nolyfill/object.fromentries@1.0.21 + object.groupby: /@nolyfill/object.groupby@1.0.21 + object.values: /@nolyfill/object.values@1.0.21 + semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -1288,7 +1248,24 @@ packages: - supports-color dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@8.8.0)(eslint@8.45.0)(prettier@3.0.0): + /eslint-plugin-n@16.0.2(eslint@8.48.0): + resolution: {integrity: sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + builtins: 5.0.1 + eslint: 8.48.0 + eslint-plugin-es-x: 7.2.0(eslint@8.48.0) + ignore: 5.2.4 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + dev: true + + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1302,24 +1279,24 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.45.0 - eslint-config-prettier: 8.8.0(eslint@8.45.0) - prettier: 3.0.0 + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) + prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-unicorn@47.0.0(eslint@8.45.0): - resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} + /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: - eslint: '>=8.38.0' + eslint: '>=8.44.0' dependencies: - '@babel/helper-validator-identifier': 7.19.1 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@babel/helper-validator-identifier': 7.22.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.45.0 + eslint: 8.48.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -1329,33 +1306,32 @@ packages: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - safe-regex: 2.1.1 semver: 7.5.4 strip-indent: 3.0.0 dev: true - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + /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} dev: true - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - '@eslint-community/regexpp': 4.4.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -1365,9 +1341,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -1393,13 +1369,13 @@ packages: - supports-color dev: true - /espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.3 dev: true /esquery@1.5.0: @@ -1464,8 +1440,8 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /fast-glob@3.3.0: - resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1531,12 +1507,6 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1549,46 +1519,11 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - /get-tsconfig@4.6.2: resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} dependencies: @@ -1627,42 +1562,18 @@ packages: type-fest: 0.20.2 dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.0 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.0 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true @@ -1671,10 +1582,6 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1685,36 +1592,6 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -1763,41 +1640,10 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.10 - dev: true - /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -1805,22 +1651,10 @@ packages: builtin-modules: 3.3.0 dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: - has-tostringtag: 1.0.0 + has: /@nolyfill/has@1.0.21 dev: true /is-docker@2.2.1: @@ -1855,18 +1689,6 @@ packages: is-docker: 3.0.0 dev: true - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1877,20 +1699,6 @@ packages: engines: {node: '>=8'} dev: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -1901,37 +1709,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2071,10 +1848,6 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -2083,7 +1856,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.4 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true @@ -2102,34 +1875,6 @@ packages: path-key: 4.0.0 dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -2277,8 +2022,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@3.0.0: - resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} hasBin: true dev: true @@ -2316,15 +2061,6 @@ packages: hasBin: true dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - /regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true @@ -2341,11 +2077,11 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -2375,27 +2111,13 @@ packages: queue-microtask: 1.2.3 dev: true - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - dev: true - - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.27 - dev: true - /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true @@ -2419,14 +2141,6 @@ packages: engines: {node: '>=8'} dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -2436,11 +2150,6 @@ packages: engines: {node: '>=8'} dev: true - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -2475,31 +2184,6 @@ packages: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2582,19 +2266,19 @@ packages: is-number: 7.0.0 dev: true - /ts-api-utils@1.0.1(typescript@5.1.6): + /ts-api-utils@1.0.1(typescript@5.2.2): resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /ts-custom-error@3.3.1: resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} engines: {node: '>=14.0.0'} - dev: true + dev: false /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} @@ -2609,12 +2293,12 @@ packages: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: true - /tsx@3.12.7: - resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + /tsx@3.12.8: + resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: fsevents: 2.3.2 @@ -2642,29 +2326,12 @@ packages: engines: {node: '>=8'} dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: true - - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true dev: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -2683,28 +2350,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2726,31 +2371,27 @@ packages: engines: {node: '>=10'} dev: true - github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.1.0)(eslint-config-prettier@8.8.0)(eslint-import-resolver-typescript@3.5.5)(eslint-plugin-import@2.27.5)(eslint-plugin-prettier@5.0.0)(eslint-plugin-unicorn@47.0.0)(eslint@8.45.0)(prettier@3.0.0)(typescript@5.1.6): - resolution: {tarball: https://codeload.github.com/wdzeng/eslint-config/tar.gz/76b054e7f387337efc36987c0c8eccfa987e36c6} - id: github.com/wdzeng/eslint-config/76b054e7f387337efc36987c0c8eccfa987e36c6 + github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): + resolution: {tarball: https://codeload.github.com/wdzeng/eslint-config/tar.gz/3dae884ede7439e7d31165255e99c15badb58e3a} + id: github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a name: eslint-config-wdzeng - version: 0.3.4 - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 - '@typescript-eslint/parser': ^6.0.0 - eslint: ^8.45.0 - eslint-config-prettier: '>= 8.8.0' - eslint-import-resolver-typescript: '>= 3.5.5' - eslint-plugin-import: '>= 2.27.5' - eslint-plugin-prettier: ^5.0.0 - eslint-plugin-unicorn: '>= 47.0.0' - prettier: ^3.0.0 - typescript: '>= 5.1.6' - dependencies: - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.45.0)(typescript@5.1.6) - '@typescript-eslint/parser': 6.1.0(eslint@8.45.0)(typescript@5.1.6) - eslint: 8.45.0 - eslint-config-prettier: 8.8.0(eslint@8.45.0) - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.1.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) - eslint-plugin-prettier: 5.0.0(eslint-config-prettier@8.8.0)(eslint@8.45.0)(prettier@3.0.0) - eslint-plugin-unicorn: 47.0.0(eslint@8.45.0) - prettier: 3.0.0 - typescript: 5.1.6 + version: 0.4.4 + engines: {node: '>=16'} + dependencies: + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-n: 16.0.2(eslint@8.48.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3) + eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) + transitivePeerDependencies: + - '@types/eslint' + - eslint + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - prettier + - supports-color + - typescript dev: true From 4e27ba897bf40a6988c250767ee50966b58f397d Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 2 Sep 2023 22:11:59 +0800 Subject: [PATCH 24/34] refact: api types --- src/api/index.ts | 6 +++--- src/api/{types => v1-types}/coins.ts | 0 src/api/{types => v2-types}/checkin.ts | 10 ++++------ src/api/v2-types/index.ts | 12 ++++++++++++ src/api/{types => v2-types}/settings.ts | 8 +++----- 5 files changed, 22 insertions(+), 14 deletions(-) rename src/api/{types => v1-types}/coins.ts (100%) rename src/api/{types => v2-types}/checkin.ts (80%) create mode 100644 src/api/v2-types/index.ts rename src/api/{types => v2-types}/settings.ts (85%) diff --git a/src/api/index.ts b/src/api/index.ts index 0f7fce5..6921b9e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -2,9 +2,9 @@ import assert from 'node:assert' import { parseCookie } from '@/api/cookie' import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' -import type { CheckinResponse } from '@/api/types/checkin' -import type { CoinsResponse } from '@/api/types/coins' -import type { SettingsResponse } from '@/api/types/settings' +import type { CoinsResponse } from '@/api/v1-types/coins' +import type { CheckinResponse } from '@/api/v2-types/checkin' +import type { SettingsResponse } from '@/api/v2-types/settings' export interface CheckinHistory { amounts: [number, number, number, number, number, number, number] diff --git a/src/api/types/coins.ts b/src/api/v1-types/coins.ts similarity index 100% rename from src/api/types/coins.ts rename to src/api/v1-types/coins.ts diff --git a/src/api/types/checkin.ts b/src/api/v2-types/checkin.ts similarity index 80% rename from src/api/types/checkin.ts rename to src/api/v2-types/checkin.ts index ffa4f51..a7c5c4a 100644 --- a/src/api/types/checkin.ts +++ b/src/api/v2-types/checkin.ts @@ -1,12 +1,10 @@ // Response from API https://shopee.tw/mkt/coins/api/v2/checkin_new -export interface CheckinResponse { - code: number - msg: string - data?: Data -} +import type { ApiV2Response } from '@/api/v2-types' + +export type CheckinResponse = ApiV2Response -export interface Data { +interface Data { '@timestamp': Date 'check_in_day': number 'checkin_list': [number, number, number, number, number, number, number] | null diff --git a/src/api/v2-types/index.ts b/src/api/v2-types/index.ts new file mode 100644 index 0000000..3c91220 --- /dev/null +++ b/src/api/v2-types/index.ts @@ -0,0 +1,12 @@ +export type ApiV2Response = ApiV2ErrorResponse | ApiV2SuccessfulResponse + +export interface ApiV2ErrorResponse { + code: number + msg: string +} + +export interface ApiV2SuccessfulResponse { + code: 0 + msg: 'success' + data: D +} diff --git a/src/api/types/settings.ts b/src/api/v2-types/settings.ts similarity index 85% rename from src/api/types/settings.ts rename to src/api/v2-types/settings.ts index b44ed81..94251a5 100644 --- a/src/api/types/settings.ts +++ b/src/api/v2-types/settings.ts @@ -1,10 +1,8 @@ // Response from API https://shopee.tw/mkt/coins/api/v2/settings -export interface SettingsResponse { - code: number - msg: string - data?: Data -} +import type { ApiV2Response } from '@/api/v2-types' + +export type SettingsResponse = ApiV2Response interface Data { '@timestamp': Date From ff611b9c307df4327d858da8302e3ebca7e05902 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 2 Sep 2023 22:14:36 +0800 Subject: [PATCH 25/34] style: update src/cli/index.js concerning process exit styles --- .eslintrc.cjs | 11 +++++++++-- src/cli/index.ts | 2 -- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e820188..117ea9c 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -13,7 +13,14 @@ module.exports = { project: './tsconfig.json' }, rules: { - // Your custom rules go here ... 'prettier/prettier': 'warn' - } + }, + overrides: [ + { + files: ['src/cli/index.ts'], + rules: { + 'unicorn/no-process-exit': 'off', + } + } + ] } diff --git a/src/cli/index.ts b/src/cli/index.ts index 2dcbbc4..ccc1444 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1,5 +1,3 @@ -#!/usr/bin/env node - import fs from 'node:fs' import { Option, program } from 'commander' From 217aba4ab2a36e825d9276ea24d18958576a54d3 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 6 Sep 2023 01:57:16 +0800 Subject: [PATCH 26/34] docs: update README for v2 release --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index adccfb7..5defc56 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,12 @@ [![docker](https://badgen.net/badge/icon/docker?icon=docker&label=)](https://hub.docker.com/repository/docker/hyperbola/shopee-coins-bot) [![ghcr](https://badgen.net/badge/icon/ghcr/black?icon=github&label=)](https://github.com/wdzeng/shopee-coins-bot/pkgs/container/shopee-coins-bot) -> [!IMPORTANT] -> 蝦皮簽到機器人 v2 還在實驗中,預計九月釋出。目前仍在使用的 v1 -> 請至[這裡](https://github.com/wdzeng/shopee-coins-bot/tree/main)。如果你使用 v2 -> 機器人遇到任何問題,歡迎到 [Issues](https://github.com/wdzeng/shopee-coins-bot/issues) 回報! +> [!NOTE] +> 這是剛釋出的 v2 蝦皮簽到機器人。舊版的 v1 文件在[這裡](https://github.com/wdzeng/shopee-coins-bot/tree/archives/v1),已不再維護。 + +> [!NOTE] +> 如果你使用機器人遇到任何問題,歡迎到 [Issues](https://github.com/wdzeng/shopee-coins-bot/issues) +> 回報! 💰💰 簽到蝦皮領蝦幣 💰💰 From 3ac5a7affc1a630b162ff1001327f683e8c2f70d Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 6 Sep 2023 02:12:27 +0800 Subject: [PATCH 27/34] feat: replace fetch with axios Avoid depend on dom lib. --- package.json | 1 + pnpm-lock.yaml | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ src/api/index.ts | 46 +++++++++++++--------------------- tsconfig.json | 2 +- 4 files changed, 83 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 06ce521..5673848 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "clean": "rm -rf dist" }, "dependencies": { + "axios": "^1.5.0", "chalk": "^5.3.0", "commander": "^11.0.0", "ts-custom-error": "^3.3.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcfe99b..2020ae0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ overrides: object.values: npm:@nolyfill/object.values@latest dependencies: + axios: + specifier: ^1.5.0 + version: 1.5.0 chalk: specifier: ^5.3.0 version: 5.3.0 @@ -845,6 +848,20 @@ packages: engines: {node: '>=8'} dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@1.5.0: + resolution: {integrity: sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -957,6 +974,13 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} @@ -1025,6 +1049,11 @@ packages: engines: {node: '>=12'} dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1507,6 +1536,25 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1819,6 +1867,18 @@ packages: picomatch: 2.3.1 dev: true + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2028,6 +2088,10 @@ packages: hasBin: true dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} diff --git a/src/api/index.ts b/src/api/index.ts index 6921b9e..49d8188 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,5 +1,7 @@ import assert from 'node:assert' +import axios from 'axios' + import { parseCookie } from '@/api/cookie' import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' import type { CoinsResponse } from '@/api/v1-types/coins' @@ -32,10 +34,7 @@ export default class ShopeeBot { private async getCoinsApiResponseBody(): Promise { const url = 'https://shopee.tw/mkt/coins/api/v1/cs/coins' - const fetchResult = await fetch(url, { - method: 'GET', - // eslint-disable-next-line unicorn/no-null - body: null, + const response = await axios(url, { headers: { 'accept': 'application/json', 'accept-language': 'en-US,en;q=0.8', @@ -50,10 +49,8 @@ export default class ShopeeBot { 'sec-fetch-site': 'same-origin' } }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const result: CoinsResponse = await fetchResult.json() - this.handleErrorResponse(result) - return result + this.handleErrorResponse(response.data) + return response.data } async checkin(): Promise { @@ -64,9 +61,7 @@ export default class ShopeeBot { } const dfp = decodeURIComponent(cookieItems.shopee_webUnique_ccd) const requestBody = JSON.stringify({ dfp }) - const fetchResult = await fetch(checkinApiUrl, { - method: 'POST', - body: requestBody, + const response = await axios.post(checkinApiUrl, requestBody, { headers: { 'accept': 'application/json', 'accept-language': 'en-US,en;q=0.8', @@ -81,11 +76,9 @@ export default class ShopeeBot { 'sec-fetch-site': 'same-origin' } }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const responseBody: CheckinResponse = await fetchResult.json() - this.handleErrorResponse(responseBody) - assert('data' in responseBody) - return responseBody.data.success ? responseBody.data.increase_coins : false + this.handleErrorResponse(response.data) + assert('data' in response.data) + return response.data.data.success ? response.data.data.increase_coins : false } async getBalance(): Promise { @@ -95,10 +88,7 @@ export default class ShopeeBot { async getCheckinHistory(): Promise { const settingsApiUrl = 'https://shopee.tw/mkt/coins/api/v2/settings' - const fetchResult = await fetch(settingsApiUrl, { - method: 'GET', - // eslint-disable-next-line unicorn/no-null - body: null, + const response = await axios(settingsApiUrl, { headers: { 'accept': 'application/json', 'accept-language': 'en-US,en;q=0.8', @@ -113,24 +103,22 @@ export default class ShopeeBot { 'sec-fetch-site': 'same-origin' } }) - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const body: SettingsResponse = await fetchResult.json() - this.handleErrorResponse(body) - assert('data' in body) + this.handleErrorResponse(response.data) + assert('data' in response.data) - if (body.data.userid === '-1') { + if (response.data.data.userid === '-1') { throw new UserNotLoggedInError() } - if (body.data.checkin_list.length < 7) { + if (response.data.data.checkin_list.length < 7) { throw new Error('Unexpected checkin history length') } return { // @ts-expect-error: length of `checkin_list` is always 7 - amounts: body.data.checkin_list.slice(0, 7), - checkedInToday: body.data.checked_in_today, - todayIndex: body.data.today_index - 1 + amounts: response.data.data.checkin_list.slice(0, 7), + checkedInToday: response.data.data.checked_in_today, + todayIndex: response.data.data.today_index - 1 } } diff --git a/tsconfig.json b/tsconfig.json index 49fe4c1..03ebc42 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "module": "es2022", "moduleResolution": "bundler", "esModuleInterop": true, - "lib": ["ES2022", "DOM"], + "lib": ["ES2022"], "rootDir": "src", "baseUrl": ".", "paths": { From 8a6948a9a376ad069b5ea91cf0cef2ffbe29e7ab Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 6 Sep 2023 02:16:14 +0800 Subject: [PATCH 28/34] chore: update version replacement comment --- src/cli/version.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/version.ts b/src/cli/version.ts index ce012c5..34ef17a 100644 --- a/src/cli/version.ts +++ b/src/cli/version.ts @@ -1,2 +1,2 @@ -// Version number will be replaced by webpack during build. +// Version number will be replaced during build. export const version: string = process.env.VERSION ?? 'Development' From 4b3996f5dfc0a22697865f609b048bd5baab7b85 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Wed, 6 Sep 2023 02:43:13 +0800 Subject: [PATCH 29/34] refact: use @commander-js/extra-typings and split code under cli Use @commander-js/extra-typings for smarter type infer. Split error handling functions and cookie and verbosity utilities from cli/index.ts. --- .eslintrc.cjs | 2 +- package.json | 1 + pnpm-lock.yaml | 11 ++++++ src/cli/cookie.ts | 42 ++++++++++++++++++++ src/cli/error.ts | 29 ++++++++++++++ src/cli/index.ts | 97 +++++++---------------------------------------- src/cli/log.ts | 8 +++- 7 files changed, 105 insertions(+), 85 deletions(-) create mode 100644 src/cli/cookie.ts create mode 100644 src/cli/error.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 117ea9c..fd0ba9e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -17,7 +17,7 @@ module.exports = { }, overrides: [ { - files: ['src/cli/index.ts'], + files: ['src/cli/**/*.ts'], rules: { 'unicorn/no-process-exit': 'off', } diff --git a/package.json b/package.json index 5673848..2241a66 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "clean": "rm -rf dist" }, "dependencies": { + "@commander-js/extra-typings": "^11.0.0", "axios": "^1.5.0", "chalk": "^5.3.0", "commander": "^11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2020ae0..62a67b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,6 +15,9 @@ overrides: object.values: npm:@nolyfill/object.values@latest dependencies: + '@commander-js/extra-typings': + specifier: ^11.0.0 + version: 11.0.0(commander@11.0.0) axios: specifier: ^1.5.0 version: 1.5.0 @@ -79,6 +82,14 @@ packages: js-tokens: 4.0.0 dev: true + /@commander-js/extra-typings@11.0.0(commander@11.0.0): + resolution: {integrity: sha512-06ol6Kn5gPjFY6v0vWOZ84nQwyqhZdaeZCHYH3vhwewjpOEjniF1KHZxh18887G3poWiJ8qyq5pb6ANuiddfPQ==} + peerDependencies: + commander: 11.0.x + dependencies: + commander: 11.0.0 + dev: false + /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: diff --git a/src/cli/cookie.ts b/src/cli/cookie.ts new file mode 100644 index 0000000..d694111 --- /dev/null +++ b/src/cli/cookie.ts @@ -0,0 +1,42 @@ +import assert from 'node:assert' +import fs from 'node:fs' + +import { handleError } from '@/cli/error' +import ExitCode from '@/cli/exit-code' +import * as logger from '@/cli/log' + +let loadedCookie: string | undefined = undefined + +export function loadCookie(path: string): void { + let cookieContent: string + try { + cookieContent = fs.readFileSync(path, 'utf8') + } catch (e: unknown) { + handleError(e) + } + + const lines = cookieContent.split('\n') + if (lines.length === 0) { + logger.error('Cookie is empty.') + process.exit(ExitCode.INVALID_COOKIE) + } + + // @ts-expect-error: lines[1] is string + if (lines.length > 2 || (lines.length === 2 && lines[1].length > 0)) { + logger.warn('Found more than one lines in cookie file; only the first line will be read.') + } + // @ts-expect-error: lines[0] is string + const cookie: string = lines[0] + + if (cookie.length === 0) { + logger.error('Cookie is empty.') + process.exit(ExitCode.INVALID_COOKIE) + } + + loadedCookie = cookie +} + +export function getCookie(): string { + assert(loadedCookie !== undefined) + return loadedCookie +} diff --git a/src/cli/error.ts b/src/cli/error.ts new file mode 100644 index 0000000..85edcb4 --- /dev/null +++ b/src/cli/error.ts @@ -0,0 +1,29 @@ +import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' +import ExitCode from '@/cli/exit-code' +import * as logger from '@/cli/log' + +export function handleError(e: unknown): never { + if (e instanceof InvalidCookieError) { + logger.error('Invalid cookie.') + process.exit(ExitCode.INVALID_COOKIE) + } + + if (e instanceof UserNotLoggedInError) { + logger.error('You are not logged in. Is your cookie expired?') + process.exit(ExitCode.LOGIN_DENIED) + } + + if (e instanceof ShopeeError) { + logger.error('Shopee server: %s', e.message) + logger.debug('Error code: %d', e.code) + process.exit(ExitCode.UNKNOWN_ERROR) + } + + // Unexpected error. + if (e instanceof Error && e.stack) { + logger.debug('%s', e.stack) + } + const errMsg: unknown = e instanceof Error ? e.message : e + logger.error('Unexpected error: %s', typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg)) + process.exit(ExitCode.UNKNOWN_ERROR) +} diff --git a/src/cli/index.ts b/src/cli/index.ts index ccc1444..d38ec1b 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1,72 +1,12 @@ -import fs from 'node:fs' - -import { Option, program } from 'commander' +import { Option, program } from '@commander-js/extra-typings' import ShopeeBot, { type CheckinHistory } from '@/api' -import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' +import { getCookie, loadCookie } from '@/cli/cookie' +import { handleError } from '@/cli/error' import ExitCode from '@/cli/exit-code' import * as logger from '@/cli/log' import { version } from '@/cli/version' -function handleError(e: unknown): never { - if (e instanceof InvalidCookieError) { - logger.error('Invalid cookie.') - process.exit(ExitCode.INVALID_COOKIE) - } - - if (e instanceof UserNotLoggedInError) { - logger.error('You are not logged in. Is your cookie expired?') - process.exit(ExitCode.LOGIN_DENIED) - } - - if (e instanceof ShopeeError) { - logger.error('Shopee server: %s', e.message) - logger.debug('Error code: %d', e.code) - process.exit(ExitCode.UNKNOWN_ERROR) - } - - // Unexpected error. - if (e instanceof Error && e.stack) { - logger.debug('%s', e.stack) - } - const errMsg: unknown = e instanceof Error ? e.message : e - logger.error('Unexpected error: %s', typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg)) - process.exit(ExitCode.UNKNOWN_ERROR) -} - -function readCookieFromFile(path: string): string { - let cookieContent: string - try { - cookieContent = fs.readFileSync(path, 'utf8') - } catch (e: unknown) { - handleError(e) - } - - const lines = cookieContent.split('\n') - if (lines.length === 0) { - logger.error('Cookie is empty.') - process.exit(ExitCode.INVALID_COOKIE) - } - - // @ts-expect-error: lines[1] is string - if (lines.length > 2 || (lines.length === 2 && lines[1].length > 0)) { - logger.warn('Found more than one lines in cookie file; only the first line will be read.') - } - // @ts-expect-error: lines[0] is string - const cookie: string = lines[0] - - if (cookie.length === 0) { - logger.error('Cookie is empty.') - process.exit(ExitCode.INVALID_COOKIE) - } - - return cookie -} - -interface GlobalOptions { - cookieString: string -} - program .name(`docker run hyperbola/shopee-coins-bot:${version}`) .description('Give me Shopee coins!') @@ -75,19 +15,13 @@ program program .option('-q, --quiet', 'suppress output message', false) // Don't wrap .hook('preAction', (thisCommand) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const quietOption = thisCommand.opts().quiet - if (quietOption) { - process.env.QUIET = '1' - } + logger.setQuiet(thisCommand.opts().quiet) }) program .requiredOption('-c, --cookie ', 'path to cookie file') - .hook('preAction', (thisCommand, actionCommand) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const cookieOption: string = thisCommand.opts().cookie - actionCommand.opts().cookieString = readCookieFromFile(cookieOption) + .hook('preAction', (thisCommand) => { + loadCookie(thisCommand.opts().cookie) }) // Disallow any unused argument. @@ -102,10 +36,9 @@ program .command('checkin') .description('Checkin to get Shopee coins') .option('-f --force', 'force checkin even if already checked in', false) - .action(async (options: GlobalOptions & { force: boolean }) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + .action(async (options) => { const force = options.force - const bot = new ShopeeBot(options.cookieString) + const bot = new ShopeeBot(getCookie()) let result: number | false try { @@ -133,8 +66,8 @@ program program .command('balance') .description('Get my Shopee coins balance') - .action(async (options: GlobalOptions) => { - const bot = new ShopeeBot(options.cookieString) + .action(async () => { + const bot = new ShopeeBot(getCookie()) let balance: number try { balance = await bot.getBalance() @@ -148,8 +81,8 @@ program .command('history') .description('Get my Shopee coins checkin history') .addOption(new Option('-o, --output [format]').choices(['raw', 'json']).default('raw')) - .action(async (options: GlobalOptions & { output: 'raw' | 'json' }) => { - const bot = new ShopeeBot(options.cookieString) + .action(async (options) => { + const bot = new ShopeeBot(getCookie()) let history: CheckinHistory try { history = await bot.getCheckinHistory() @@ -157,7 +90,6 @@ program handleError(e) } - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access const outputFormat = options.output if (outputFormat === 'json') { console.log(JSON.stringify(history)) @@ -183,9 +115,8 @@ program program .command('whoami') .description('Get my Shopee username') - .action(async (options: GlobalOptions) => { - logger.debug(options.cookieString) - const bot = new ShopeeBot(options.cookieString) + .action(async () => { + const bot = new ShopeeBot(getCookie()) let username try { username = await bot.getLoginUser() diff --git a/src/cli/log.ts b/src/cli/log.ts index ef15926..51cecd7 100644 --- a/src/cli/log.ts +++ b/src/cli/log.ts @@ -1,5 +1,11 @@ import chalk from 'chalk' +let quiet = false + +export function setQuiet(value: boolean): void { + quiet = value +} + function isTruthy(value: string | undefined): value is string { return value !== undefined && value !== '' && value !== '0' && value !== 'false' } @@ -11,7 +17,7 @@ export function debug(format: string, ...msg: unknown[]): void { } export function info(format: string, ...msg: unknown[]): void { - if (isTruthy(process.env.DEBUG) || !isTruthy(process.env.QUIET)) { + if (isTruthy(process.env.DEBUG) || !quiet) { console.error(format, ...msg) } } From 3cf17dc548597850dcb7b8ad8f3198dd7c7f7aae Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 30 Sep 2023 22:50:31 +0800 Subject: [PATCH 30/34] refact: improve error handling --- src/api/errors.ts | 68 +++++++++- src/api/index.ts | 171 ++++++++++++------------ src/api/{v2-types => types}/checkin.ts | 9 +- src/api/types/coins.ts | 10 ++ src/api/types/index.ts | 28 ++++ src/api/{v2-types => types}/settings.ts | 9 +- src/api/v1-types/coins.ts | 9 -- src/api/v2-types/index.ts | 12 -- src/cli/cookie.ts | 5 +- src/cli/error.ts | 14 +- 10 files changed, 214 insertions(+), 121 deletions(-) rename src/api/{v2-types => types}/checkin.ts (69%) create mode 100644 src/api/types/coins.ts create mode 100644 src/api/types/index.ts rename src/api/{v2-types => types}/settings.ts (73%) delete mode 100644 src/api/v1-types/coins.ts delete mode 100644 src/api/v2-types/index.ts diff --git a/src/api/errors.ts b/src/api/errors.ts index d1e8984..08c4406 100644 --- a/src/api/errors.ts +++ b/src/api/errors.ts @@ -1,14 +1,29 @@ +import { AxiosError } from 'axios' import { CustomError } from 'ts-custom-error' +import type { V2ResponseData, V2SuccessfulResponseData } from '@/api/types' + +/** + * Ther error is thrown when a user provides invalid cookie. An invalid cookie means the cookie + * string itself cannot be parsed or contains unexpected token. + */ export class InvalidCookieError extends CustomError {} +/** + * The error is thrown when a user does not login. This often happens when the cookie provided is + * expired or the authentication information in it is rejected by the Shopee backend. + */ export class UserNotLoggedInError extends CustomError { constructor() { super('User is not logged in.') } } -export class ShopeeError extends CustomError { +/** + * The error is thrown when the Shopee backend return 2XX status code, but with unexpected response + * data. + */ +export class UnexpectedResponseError extends CustomError { constructor( public readonly code: number, msg: string @@ -16,3 +31,54 @@ export class ShopeeError extends CustomError { super(msg) } } + +/** + * Handles the error thrown by Axios. If the error is an AxiosError, it will check the status code. + */ +export function handleErrorResponse(e: unknown): never { + if (e instanceof AxiosError) { + const statusCode = e.response?.status + if (statusCode === 401 || statusCode === 403) { + throw new UserNotLoggedInError() + } + } + + // Unknown error. Just throw it. It is caller's responsibility to handle it and display + // human-readable messages. + throw e +} + +/** + * Validates the data returns from the v2 API. If the data is not valid, it will throw an error. + */ +export function validateV2ApiResponseData( + responseData: V2ResponseData +): asserts responseData is V2SuccessfulResponseData { + if ( + typeof responseData === 'object' && + 'code' in responseData && + typeof responseData.code === 'number' && + 'msg' in responseData && + typeof responseData.msg === 'string' + ) { + if (responseData.code === 401 || responseData.code === 403) { + throw new UserNotLoggedInError() + } else if (responseData.code !== 0) { + throw new UnexpectedResponseError(responseData.code, `Shopee backend: ${responseData.msg}`) + } + + if ( + 'data' in responseData && + typeof responseData.data === 'object' && + responseData.data !== null && + 'userid' in responseData.data && + responseData.data.userid === '-1' + ) { + // Sometimes the backend returns 2XX even if the user is not logged in. Instead, it set -1 as + // the user ID. + throw new UserNotLoggedInError() + } + } + + // The response data is good. +} diff --git a/src/api/index.ts b/src/api/index.ts index 49d8188..963f6e2 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,12 +1,15 @@ -import assert from 'node:assert' - -import axios from 'axios' +import axios, { type AxiosResponse } from 'axios' import { parseCookie } from '@/api/cookie' -import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' -import type { CoinsResponse } from '@/api/v1-types/coins' -import type { CheckinResponse } from '@/api/v2-types/checkin' -import type { SettingsResponse } from '@/api/v2-types/settings' +import { + InvalidCookieError, + UnexpectedResponseError, + handleErrorResponse, + validateV2ApiResponseData +} from '@/api/errors' +import type { CheckinResponseData } from '@/api/types/checkin' +import type { CoinsResponseData } from '@/api/types/coins' +import type { SettingsResponseData } from '@/api/types/settings' export interface CheckinHistory { amounts: [number, number, number, number, number, number, number] @@ -17,42 +20,35 @@ export interface CheckinHistory { export default class ShopeeBot { constructor(private readonly cookie: string) {} - private handleErrorResponse(responseData: object): void { - if ( - 'code' in responseData && - typeof responseData.code === 'number' && - 'msg' in responseData && - typeof responseData.msg === 'string' - ) { - if (responseData.code === 401) { - throw new UserNotLoggedInError() - } else if (responseData.code !== 0) { - throw new ShopeeError(responseData.code, `Shopee server: ${responseData.msg}`) - } + private async getCoinsApiResponseBody(): Promise { + const url = 'https://shopee.tw/mkt/coins/api/v1/cs/coins' + const headers = { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'cookie': this.cookie, + 'pragma': 'no-cache', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' } - } - private async getCoinsApiResponseBody(): Promise { - const url = 'https://shopee.tw/mkt/coins/api/v1/cs/coins' - const response = await axios(url, { - headers: { - 'accept': 'application/json', - 'accept-language': 'en-US,en;q=0.8', - 'cache-control': 'no-cache', - 'cookie': this.cookie, - 'pragma': 'no-cache', - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin' - } - }) - this.handleErrorResponse(response.data) - return response.data + try { + const response = await axios(url, { headers }) + return response.data + } catch (e: unknown) { + handleErrorResponse(e) + } } + /** + * Do checkin. + * + * @returns the amount of coins you get, or `false` if you have already checked in today. + */ async checkin(): Promise { const checkinApiUrl = 'https://shopee.tw/mkt/coins/api/v2/checkin_new' const cookieItems = parseCookie(this.cookie) @@ -61,57 +57,69 @@ export default class ShopeeBot { } const dfp = decodeURIComponent(cookieItems.shopee_webUnique_ccd) const requestBody = JSON.stringify({ dfp }) - const response = await axios.post(checkinApiUrl, requestBody, { - headers: { - 'accept': 'application/json', - 'accept-language': 'en-US,en;q=0.8', - 'cache-control': 'no-cache', - 'content-type': 'application/json;charset=UTF-8', - 'cookie': this.cookie, - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin' - } - }) - this.handleErrorResponse(response.data) - assert('data' in response.data) + + let response + const headers = { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'content-type': 'application/json;charset=UTF-8', + 'cookie': this.cookie, + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' + } + try { + response = await axios.post(checkinApiUrl, requestBody, { headers }) + } catch (e: unknown) { + handleErrorResponse(e) + } + + validateV2ApiResponseData(response.data) return response.data.data.success ? response.data.data.increase_coins : false } + /** + * Get your balance of coins. + * + * @returns the balance of coins. + */ async getBalance(): Promise { - const coinsResponseBody = await this.getCoinsApiResponseBody() - return coinsResponseBody.coins + const data = await this.getCoinsApiResponseBody() + return data.coins } async getCheckinHistory(): Promise { const settingsApiUrl = 'https://shopee.tw/mkt/coins/api/v2/settings' - const response = await axios(settingsApiUrl, { - headers: { - 'accept': 'application/json', - 'accept-language': 'en-US,en;q=0.8', - 'cache-control': 'no-cache', - 'cookie': this.cookie, - 'pragma': 'no-cache', - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin' - } - }) - this.handleErrorResponse(response.data) - assert('data' in response.data) + const headers = { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.8', + 'cache-control': 'no-cache', + 'cookie': this.cookie, + 'pragma': 'no-cache', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin' + } - if (response.data.data.userid === '-1') { - throw new UserNotLoggedInError() + let response: AxiosResponse + try { + response = await axios(settingsApiUrl, { headers }) + } catch (e: unknown) { + handleErrorResponse(e) } + validateV2ApiResponseData(response.data) + if (response.data.data.checkin_list.length < 7) { - throw new Error('Unexpected checkin history length') + // Unexpected checkin history length. + throw new UnexpectedResponseError(response.data.code, 'Unexpected checkin history length.') } return { @@ -123,10 +131,7 @@ export default class ShopeeBot { } async getLoginUser(): Promise { - const body = await this.getCoinsApiResponseBody() - if (body.userid === '-1') { - throw new UserNotLoggedInError() - } - return body.username + const data = await this.getCoinsApiResponseBody() + return data.username } } diff --git a/src/api/v2-types/checkin.ts b/src/api/types/checkin.ts similarity index 69% rename from src/api/v2-types/checkin.ts rename to src/api/types/checkin.ts index a7c5c4a..cf9b68c 100644 --- a/src/api/v2-types/checkin.ts +++ b/src/api/types/checkin.ts @@ -1,8 +1,9 @@ -// Response from API https://shopee.tw/mkt/coins/api/v2/checkin_new +import type { V2ResponseData } from '@/api/types' -import type { ApiV2Response } from '@/api/v2-types' - -export type CheckinResponse = ApiV2Response +/** + * The checkin API (https://shopee.tw/mkt/coins/api/v2/checkin_new) response data type. + */ +export type CheckinResponseData = V2ResponseData interface Data { '@timestamp': Date diff --git a/src/api/types/coins.ts b/src/api/types/coins.ts new file mode 100644 index 0000000..8b911f2 --- /dev/null +++ b/src/api/types/coins.ts @@ -0,0 +1,10 @@ +/** + * The coins API (https://shopee.tw/mkt/coins/api/v1/cs/coins) successful response data type. + */ +export interface CoinsResponseData { + coins: number + logid: string + ts: number + userid: string + username: string +} diff --git a/src/api/types/index.ts b/src/api/types/index.ts new file mode 100644 index 0000000..36baffc --- /dev/null +++ b/src/api/types/index.ts @@ -0,0 +1,28 @@ +/** + * The v1 API response data type. + */ +export type V1ResponseData = D | ErrorResponseData + +/** + * The v2 API response data type. + */ +export type V2ResponseData = V2SuccessfulResponseData | ErrorResponseData + +/** + * Error data type when the API returns non-successful response in v1 or v2 API. This happens when + * the status code is 2XX or 4XX. + */ +export interface ErrorResponseData { + code: number // Non-zero. + msg: string // A string other than 'success'. +} + +/** + * Data type when the API returns successful response in v2 API. This assures the status code is + * 2XX. + */ +export interface V2SuccessfulResponseData { + code: 0 + msg: 'success' + data: D +} diff --git a/src/api/v2-types/settings.ts b/src/api/types/settings.ts similarity index 73% rename from src/api/v2-types/settings.ts rename to src/api/types/settings.ts index 94251a5..c86c7bf 100644 --- a/src/api/v2-types/settings.ts +++ b/src/api/types/settings.ts @@ -1,8 +1,9 @@ -// Response from API https://shopee.tw/mkt/coins/api/v2/settings +import type { V2ResponseData } from '@/api/types' -import type { ApiV2Response } from '@/api/v2-types' - -export type SettingsResponse = ApiV2Response +/** + * The settings API (https://shopee.tw/mkt/coins/api/v2/settings) response data type. + */ +export type SettingsResponseData = V2ResponseData interface Data { '@timestamp': Date diff --git a/src/api/v1-types/coins.ts b/src/api/v1-types/coins.ts deleted file mode 100644 index e128528..0000000 --- a/src/api/v1-types/coins.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Response from API https://shopee.tw/mkt/coins/api/v1/cs/coins - -export interface CoinsResponse { - coins: number - logid: string - ts: number - userid: string - username: string -} diff --git a/src/api/v2-types/index.ts b/src/api/v2-types/index.ts deleted file mode 100644 index 3c91220..0000000 --- a/src/api/v2-types/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type ApiV2Response = ApiV2ErrorResponse | ApiV2SuccessfulResponse - -export interface ApiV2ErrorResponse { - code: number - msg: string -} - -export interface ApiV2SuccessfulResponse { - code: 0 - msg: 'success' - data: D -} diff --git a/src/cli/cookie.ts b/src/cli/cookie.ts index d694111..7923837 100644 --- a/src/cli/cookie.ts +++ b/src/cli/cookie.ts @@ -1,4 +1,3 @@ -import assert from 'node:assert' import fs from 'node:fs' import { handleError } from '@/cli/error' @@ -37,6 +36,8 @@ export function loadCookie(path: string): void { } export function getCookie(): string { - assert(loadedCookie !== undefined) + if (loadedCookie === undefined) { + throw new Error('Please load cookie first.') + } return loadedCookie } diff --git a/src/cli/error.ts b/src/cli/error.ts index 85edcb4..0100891 100644 --- a/src/cli/error.ts +++ b/src/cli/error.ts @@ -1,10 +1,15 @@ -import { InvalidCookieError, ShopeeError, UserNotLoggedInError } from '@/api/errors' +import { InvalidCookieError, UnexpectedResponseError, UserNotLoggedInError } from '@/api/errors' import ExitCode from '@/cli/exit-code' import * as logger from '@/cli/log' export function handleError(e: unknown): never { + if (e instanceof Error && e.stack) { + logger.debug('%s', e.stack) + } + if (e instanceof InvalidCookieError) { logger.error('Invalid cookie.') + logger.error(e.message) process.exit(ExitCode.INVALID_COOKIE) } @@ -13,16 +18,13 @@ export function handleError(e: unknown): never { process.exit(ExitCode.LOGIN_DENIED) } - if (e instanceof ShopeeError) { - logger.error('Shopee server: %s', e.message) + if (e instanceof UnexpectedResponseError) { + logger.error('Shopee backend: %s', e.message) logger.debug('Error code: %d', e.code) process.exit(ExitCode.UNKNOWN_ERROR) } // Unexpected error. - if (e instanceof Error && e.stack) { - logger.debug('%s', e.stack) - } const errMsg: unknown = e instanceof Error ? e.message : e logger.error('Unexpected error: %s', typeof errMsg === 'string' ? errMsg : JSON.stringify(errMsg)) process.exit(ExitCode.UNKNOWN_ERROR) From 16111e7519295538407bf79e05ae674e87d2e88f Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 30 Sep 2023 22:52:07 +0800 Subject: [PATCH 31/34] chore: upgrade dependencies and default package manager --- package.json | 12 +- pnpm-lock.yaml | 329 +++++++++++++++++++++++-------------------------- 2 files changed, 163 insertions(+), 178 deletions(-) diff --git a/package.json b/package.json index 2241a66..b6e74e2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "repository": "github:hyperbola/shopee-coins-bot", "license": "MIT", - "packageManager": "pnpm@8.7.1", + "packageManager": "pnpm@8.8.0", "type": "module", "scripts": { "build": "./build.cjs", @@ -19,18 +19,18 @@ }, "dependencies": { "@commander-js/extra-typings": "^11.0.0", - "axios": "^1.5.0", + "axios": "^1.5.1", "chalk": "^5.3.0", "commander": "^11.0.0", "ts-custom-error": "^3.3.1" }, "devDependencies": { - "@types/node": "^20.5.8", - "esbuild": "^0.19.2", - "eslint": "^8.48.0", + "@types/node": "^20.8.0", + "esbuild": "^0.19.4", + "eslint": "^8.50.0", "eslint-config-wdzeng": "github:wdzeng/eslint-config#semver:^0.4.4", "prettier": "^3.0.3", - "tsx": "^3.12.8", + "tsx": "^3.13.0", "typescript": "^5.2.2" }, "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62a67b8..3fc532f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,8 +19,8 @@ dependencies: specifier: ^11.0.0 version: 11.0.0(commander@11.0.0) axios: - specifier: ^1.5.0 - version: 1.5.0 + specifier: ^1.5.1 + version: 1.5.1 chalk: specifier: ^5.3.0 version: 5.3.0 @@ -33,23 +33,23 @@ dependencies: devDependencies: '@types/node': - specifier: ^20.5.8 - version: 20.5.8 + specifier: ^20.8.0 + version: 20.8.0 esbuild: - specifier: ^0.19.2 - version: 0.19.2 + specifier: ^0.19.4 + version: 0.19.4 eslint: - specifier: ^8.48.0 - version: 8.48.0 + specifier: ^8.50.0 + version: 8.50.0 eslint-config-wdzeng: specifier: github:wdzeng/eslint-config#semver:^0.4.4 - version: github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2) + version: github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.50.0)(prettier@3.0.3)(typescript@5.2.2) prettier: specifier: ^3.0.3 version: 3.0.3 tsx: - specifier: ^3.12.8 - version: 3.12.8 + specifier: ^3.13.0 + version: 3.13.0 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -90,27 +90,6 @@ packages: commander: 11.0.0 dev: false - /@esbuild-kit/cjs-loader@2.4.2: - resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} - dependencies: - '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.6.2 - dev: true - - /@esbuild-kit/core-utils@3.2.2: - resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} - dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader@2.5.5: - resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} - dependencies: - '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.6.2 - dev: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -120,8 +99,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.2: - resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + /@esbuild/android-arm64@0.19.4: + resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -138,8 +117,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.2: - resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + /@esbuild/android-arm@0.19.4: + resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -156,8 +135,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.2: - resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + /@esbuild/android-x64@0.19.4: + resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -174,8 +153,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.2: - resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + /@esbuild/darwin-arm64@0.19.4: + resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -192,8 +171,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.2: - resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + /@esbuild/darwin-x64@0.19.4: + resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -210,8 +189,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.2: - resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + /@esbuild/freebsd-arm64@0.19.4: + resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -228,8 +207,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.2: - resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + /@esbuild/freebsd-x64@0.19.4: + resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -246,8 +225,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.2: - resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + /@esbuild/linux-arm64@0.19.4: + resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -264,8 +243,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.2: - resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + /@esbuild/linux-arm@0.19.4: + resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -282,8 +261,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.2: - resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + /@esbuild/linux-ia32@0.19.4: + resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -300,8 +279,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.2: - resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + /@esbuild/linux-loong64@0.19.4: + resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -318,8 +297,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.2: - resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + /@esbuild/linux-mips64el@0.19.4: + resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -336,8 +315,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.2: - resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + /@esbuild/linux-ppc64@0.19.4: + resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -354,8 +333,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.2: - resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + /@esbuild/linux-riscv64@0.19.4: + resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -372,8 +351,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.2: - resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + /@esbuild/linux-s390x@0.19.4: + resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -390,8 +369,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.2: - resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + /@esbuild/linux-x64@0.19.4: + resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -408,8 +387,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.2: - resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + /@esbuild/netbsd-x64@0.19.4: + resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -426,8 +405,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.2: - resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + /@esbuild/openbsd-x64@0.19.4: + resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -444,8 +423,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.2: - resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + /@esbuild/sunos-x64@0.19.4: + resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -462,8 +441,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.2: - resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + /@esbuild/win32-arm64@0.19.4: + resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -480,8 +459,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.2: - resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + /@esbuild/win32-ia32@0.19.4: + resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -498,8 +477,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.2: - resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + /@esbuild/win32-x64@0.19.4: + resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -507,13 +486,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.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 dependencies: - eslint: 8.48.0 + eslint: 8.50.0 eslint-visitor-keys: 3.4.3 dev: true @@ -539,13 +518,13 @@ packages: - supports-color dev: true - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + /@eslint/js@8.50.0: + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -665,8 +644,8 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@20.5.8: - resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==} + /@types/node@20.8.0: + resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} dev: true /@types/normalize-package-data@2.4.1: @@ -677,7 +656,7 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -689,13 +668,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.5.0 - '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.5.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -706,7 +685,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.5.0(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -721,7 +700,7 @@ packages: '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.50.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -735,7 +714,7 @@ packages: '@typescript-eslint/visitor-keys': 6.5.0 dev: true - /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.5.0(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -746,9 +725,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.50.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.50.0 ts-api-utils: 1.0.1(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -781,19 +760,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.5.0(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/types': 6.5.0 '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) - eslint: 8.48.0 + eslint: 8.50.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -863,8 +842,8 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /axios@1.5.0: - resolution: {integrity: sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==} + /axios@1.5.1: + resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 @@ -1130,34 +1109,34 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.2: - resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + /esbuild@0.19.4: + resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.2 - '@esbuild/android-arm64': 0.19.2 - '@esbuild/android-x64': 0.19.2 - '@esbuild/darwin-arm64': 0.19.2 - '@esbuild/darwin-x64': 0.19.2 - '@esbuild/freebsd-arm64': 0.19.2 - '@esbuild/freebsd-x64': 0.19.2 - '@esbuild/linux-arm': 0.19.2 - '@esbuild/linux-arm64': 0.19.2 - '@esbuild/linux-ia32': 0.19.2 - '@esbuild/linux-loong64': 0.19.2 - '@esbuild/linux-mips64el': 0.19.2 - '@esbuild/linux-ppc64': 0.19.2 - '@esbuild/linux-riscv64': 0.19.2 - '@esbuild/linux-s390x': 0.19.2 - '@esbuild/linux-x64': 0.19.2 - '@esbuild/netbsd-x64': 0.19.2 - '@esbuild/openbsd-x64': 0.19.2 - '@esbuild/sunos-x64': 0.19.2 - '@esbuild/win32-arm64': 0.19.2 - '@esbuild/win32-ia32': 0.19.2 - '@esbuild/win32-x64': 0.19.2 + '@esbuild/android-arm': 0.19.4 + '@esbuild/android-arm64': 0.19.4 + '@esbuild/android-x64': 0.19.4 + '@esbuild/darwin-arm64': 0.19.4 + '@esbuild/darwin-x64': 0.19.4 + '@esbuild/freebsd-arm64': 0.19.4 + '@esbuild/freebsd-x64': 0.19.4 + '@esbuild/linux-arm': 0.19.4 + '@esbuild/linux-arm64': 0.19.4 + '@esbuild/linux-ia32': 0.19.4 + '@esbuild/linux-loong64': 0.19.4 + '@esbuild/linux-mips64el': 0.19.4 + '@esbuild/linux-ppc64': 0.19.4 + '@esbuild/linux-riscv64': 0.19.4 + '@esbuild/linux-s390x': 0.19.4 + '@esbuild/linux-x64': 0.19.4 + '@esbuild/netbsd-x64': 0.19.4 + '@esbuild/openbsd-x64': 0.19.4 + '@esbuild/sunos-x64': 0.19.4 + '@esbuild/win32-arm64': 0.19.4 + '@esbuild/win32-ia32': 0.19.4 + '@esbuild/win32-x64': 0.19.4 dev: true /escape-string-regexp@1.0.5: @@ -1170,13 +1149,13 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@9.0.0(eslint@8.48.0): + /eslint-config-prettier@9.0.0(eslint@8.50.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.48.0 + eslint: 8.50.0 dev: true /eslint-import-resolver-node@0.3.7: @@ -1189,7 +1168,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0): resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1198,9 +1177,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 - eslint: 8.48.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint: 8.50.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0) fast-glob: 3.3.1 get-tsconfig: 4.6.2 is-core-module: 2.13.0 @@ -1212,7 +1191,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -1233,27 +1212,27 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.50.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.48.0 + eslint: 8.50.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.2.0(eslint@8.48.0): + /eslint-plugin-es-x@7.2.0(eslint@8.50.0): resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@eslint-community/regexpp': 4.8.0 - eslint: 8.48.0 + eslint: 8.50.0 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -1263,16 +1242,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.50.0)(typescript@5.2.2) array-includes: /@nolyfill/array-includes@1.0.21 array.prototype.findlastindex: /@nolyfill/array.prototype.findlastindex@1.0.21 array.prototype.flat: /@nolyfill/array.prototype.flat@1.0.21 array.prototype.flatmap: /@nolyfill/array.prototype.flatmap@1.0.21 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 8.50.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0) has: /@nolyfill/has@1.0.21 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -1288,16 +1267,16 @@ packages: - supports-color dev: true - /eslint-plugin-n@16.0.2(eslint@8.48.0): + /eslint-plugin-n@16.0.2(eslint@8.50.0): resolution: {integrity: sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) builtins: 5.0.1 - eslint: 8.48.0 - eslint-plugin-es-x: 7.2.0(eslint@8.48.0) + eslint: 8.50.0 + eslint-plugin-es-x: 7.2.0(eslint@8.50.0) ignore: 5.2.4 is-core-module: 2.13.0 minimatch: 3.1.2 @@ -1305,7 +1284,7 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3): + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.50.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1319,24 +1298,24 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.48.0 - eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint: 8.50.0 + eslint-config-prettier: 9.0.0(eslint@8.50.0) prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): + /eslint-plugin-unicorn@48.0.1(eslint@8.50.0): resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.44.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.48.0 + eslint: 8.50.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -1363,16 +1342,16 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + /eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@eslint-community/regexpp': 4.8.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/js': 8.50.0 + '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -1570,8 +1549,8 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -1589,6 +1568,12 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2368,15 +2353,15 @@ packages: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: true - /tsx@3.12.8: - resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} + /tsx@3.13.0: + resolution: {integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==} hasBin: true dependencies: - '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.2.2 - '@esbuild-kit/esm-loader': 2.5.5 + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /type-check@0.4.0: @@ -2446,21 +2431,21 @@ packages: engines: {node: '>=10'} dev: true - github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.48.0)(prettier@3.0.3)(typescript@5.2.2): + github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a(eslint@8.50.0)(prettier@3.0.3)(typescript@5.2.2): resolution: {tarball: https://codeload.github.com/wdzeng/eslint-config/tar.gz/3dae884ede7439e7d31165255e99c15badb58e3a} id: github.com/wdzeng/eslint-config/3dae884ede7439e7d31165255e99c15badb58e3a name: eslint-config-wdzeng version: 0.4.4 engines: {node: '>=16'} dependencies: - '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) - eslint-config-prettier: 9.0.0(eslint@8.48.0) - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) - eslint-plugin-n: 16.0.2(eslint@8.48.0) - eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.48.0)(prettier@3.0.3) - eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.50.0)(typescript@5.2.2) + eslint-config-prettier: 9.0.0(eslint@8.50.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.50.0) + eslint-plugin-n: 16.0.2(eslint@8.50.0) + eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.50.0)(prettier@3.0.3) + eslint-plugin-unicorn: 48.0.1(eslint@8.50.0) transitivePeerDependencies: - '@types/eslint' - eslint From ff85bc33ff481fb785c95b2b71d902b6624c3416 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 30 Sep 2023 23:26:54 +0800 Subject: [PATCH 32/34] ci/cd: merge workflow unittests.yml into publish.yml Merge unittests.yml into publish.yml Only run building and tagging when pushing to main or dev branch, or when the workflow is triggered manually. Do not force pushing general version tag (vX.X.X). This help avoid to accidentally overriding existing tags. --- .github/workflows/publish.yml | 34 +++++++++++++++++++++++++++------ .github/workflows/unittests.yml | 30 ----------------------------- 2 files changed, 28 insertions(+), 36 deletions(-) delete mode 100644 .github/workflows/unittests.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 32b4af3..65dadc7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,13 +4,37 @@ on: workflow_dispatch: ~ push: branches: + - dev - main paths: - src/** + schedule: + - cron: '0 22 * * 1' # 06:00 AM +08:00 every Monday jobs: + unittests: + name: Run unittests + if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Node.js v20 + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Install pnpm and dependencies + uses: pnpm/action-setup@v2 + with: + run_install: true + - name: Run unittests + run: pnpm test + build: name: Build project and push image to Dockerhub and Github Container Registry + if: ${{ (github.event_name == 'push' && github.ref == 'refs/head/main') || github.event_name == 'workflow_dispatch' }} + needs: + - unittests runs-on: ubuntu-latest steps: - name: Checkout @@ -33,7 +57,7 @@ jobs: tag: name: Add tags to repository - if: ${{ github.event_name == 'push' }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/head/main' }} needs: - build runs-on: ubuntu-latest @@ -47,8 +71,6 @@ jobs: run: | git tag -f ${{ steps.version.outputs.major }} main git tag -f ${{ steps.version.outputs.minor }} main - git tag -f ${{ steps.version.outputs.version }} main - git push -f origin \ - ${{ steps.version.outputs.major }} \ - ${{ steps.version.outputs.minor }} \ - ${{ steps.version.outputs.version }} + git tag ${{ steps.version.outputs.version }} main + git push -f origin ${{ steps.version.outputs.major }} ${{ steps.version.outputs.minor }} + git push origin ${{ steps.version.outputs.version }} diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml deleted file mode 100644 index 123549d..0000000 --- a/.github/workflows/unittests.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Unittests - -on: - workflow_dispatch: ~ - push: - branches: - - dev - paths: - - src/** - pull_request: - branches: - - main - - dev - schedule: - - cron: '0 22 * * 1' # 06:00 AM +08:00 every Monday - workflow_call: ~ - -jobs: - unittests: - name: Run unittests - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Install pnpm and dependencies - uses: pnpm/action-setup@v2 - with: - run_install: true - - name: Run unittests - run: pnpm test From 5c789444350474f96f95dfa20217d67da31ad157 Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sat, 30 Sep 2023 23:30:57 +0800 Subject: [PATCH 33/34] chore: add fake test script Add a fake test script. This is because unittests are required when running CI/CD. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index b6e74e2..92d445f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "scripts": { "build": "./build.cjs", "dev": "tsx src/cli/index.ts", + "test": "echo Unittests are skipped.", "lint": "eslint src/ --ext .ts --fix --ignore-path .gitignore", "clean": "rm -rf dist" }, From 1f56446b4cf1ddbc04734ae63e2e2ec40a6b88eb Mon Sep 17 00:00:00 2001 From: hyperbola Date: Sun, 1 Oct 2023 00:04:58 +0800 Subject: [PATCH 34/34] Bump to v2.0.0-alpha.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 92d445f..920e058 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopee-coins-bot", - "version": "2.0.0-alpha.2", + "version": "2.0.0-alpha.3", "description": "Get Shopee coins everyday", "author": { "name": "hyperbola",