diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 4c477ebc..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,16 +0,0 @@ -- lunchable version: -- Python version: -- Operating System: - -### Description - -Describe what you were trying to get done. - -Tell us what happened, what went wrong, and what you expected to happen. - -### What I Did - -``` -Paste the command(s) you ran and the output. -If there was a crash, please include the traceback here. -``` diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml deleted file mode 100644 index 43cef5d9..00000000 --- a/.github/dependabot.yaml +++ /dev/null @@ -1,29 +0,0 @@ -version: 2 -updates: -- package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: /.github/workflows - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: /docs - schedule: - interval: monthly - labels: - - dependencies -- package-ecosystem: pip - directory: / - schedule: - interval: monthly - versioning-strategy: lockfile-only - allow: - - dependency-type: all - labels: - - dependencies diff --git a/.github/labels.yaml b/.github/labels.yaml deleted file mode 100644 index 87595b77..00000000 --- a/.github/labels.yaml +++ /dev/null @@ -1,65 +0,0 @@ -# The repository labels will be automatically configured using this file and -# the GitHub Action https://github.com/marketplace/actions/github-labeler. -- name: breaking - description: Breaking Changes - color: bfd4f2 -- name: bug - description: Something isn't working - color: d73a4a -- name: build - description: Build System and Dependencies - color: bfdadc -- name: ci - description: Continuous Integration - color: 4a97d6 -- name: dependencies - description: Pull requests that update a dependency file - color: 0366d6 -- name: documentation - description: Improvements or additions to documentation - color: 0075ca -- name: duplicate - description: This issue or pull request already exists - color: cfd3d7 -- name: enhancement - description: New feature or request - color: a2eeef -- name: github_actions - description: Pull requests that update Github_actions code - color: '000000' -- name: good first issue - description: Good for newcomers - color: 7057ff -- name: help wanted - description: Extra attention is needed - color: 008672 -- name: invalid - description: This doesn't seem right - color: e4e669 -- name: performance - description: Performance - color: '016175' -- name: python - description: Pull requests that update Python code - color: 2b67c6 -- name: question - description: Further information is requested - color: d876e3 -- name: refactoring - description: Refactoring - color: ef67c4 -- name: removal - description: Removals and Deprecations - color: 9ae7ea -- name: style - description: Style - color: c120e5 -- name: testing - description: Testing - color: b1fc6f -- name: wontfix - description: This will not be worked on - color: ffffff -- name: triage - description: This will looked at - color: 68bd3b diff --git a/.github/release-drafter.yaml b/.github/release-drafter.yaml deleted file mode 100644 index ca504b14..00000000 --- a/.github/release-drafter.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name-template: v$RESOLVED_VERSION 🌈 -tag-template: v$RESOLVED_VERSION -categories: -- title: ':boom: Breaking Changes' - label: breaking -- title: ':rocket: Features' - label: enhancement -- title: ':fire: Removals and Deprecations' - label: removal -- title: ':beetle: Fixes' - label: bug -- title: ':racehorse: Performance' - label: performance -- title: ':rotating_light: Testing' - label: testing -- title: ':construction_worker: Continuous Integration' - label: ci -- title: ':books: Documentation' - label: documentation -- title: ':hammer: Refactoring' - label: refactoring -- title: ':lipstick: Style' - label: style -- title: ':package: Dependencies' - labels: - - dependencies - - build -exclude-labels: -- skip-changelog -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' -change-title-escapes: \<*_& -template: | - ## Changes - - $CHANGES diff --git a/.github/semantic_release/package-lock.json b/.github/semantic_release/package-lock.json deleted file mode 100644 index 15442d1a..00000000 --- a/.github/semantic_release/package-lock.json +++ /dev/null @@ -1,12494 +0,0 @@ -{ - "name": "semantic_release", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.7", - "semantic-release": "^21.0.1", - "semantic-release-gitmoji": "^1.6.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", - "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.1.0.tgz", - "integrity": "sha512-+m6+376kp4gZAYtg64aXGHK2qM2LtIiZctqtbTnETdUaD7OSuX7zDV5kciqw1QIN13lg9jWz039OF7NZUdYEeQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", - "dev": true, - "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.0.tgz", - "integrity": "sha512-MPKlN20dSKZ2JGV8KHNO4Y9z6xs74p5sQ2a5++5/uVme44K/5UEntIpai2n1WIrVtMlafYLdfN27BiBs2taY6g==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^16.1.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.1.tgz", - "integrity": "sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/exec": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", - "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "dev": true, - "dependencies": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.3.tgz", - "integrity": "sha512-Chbv3kX4o+y+r1X6hsqBVB8NFbSVfiNlYOqMG6o9Wc8r5Y4cjxfbaMCuJ++XAtw3YXYX/NVD05cPzBi4Orjusg==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/env-ci": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.0.0.tgz", - "integrity": "sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg==", - "dev": true, - "dependencies": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^16.14 || >=18" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/env-ci/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dev": true, - "dependencies": { - "semver-regex": "^4.0.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/gitmojis": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/gitmojis/-/gitmojis-3.13.4.tgz", - "integrity": "sha512-TRYhqnD36Xs9GHuATVRmo7hzBb+6wXYC0zxBFvLs3nma7N1WQGWW2vPTQ0+3GsGcPwSp0XVGfe3Besn4a6ip5Q==", - "dev": true - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/issue-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.5.tgz", - "integrity": "sha512-0SYs9lz1ND7V3+Lz6EbsnUdZ4OxjQOHbaIKdWd8OgsbZ2hCC2ZeiXMEaBEPEVBaILW+huFA0pJ1YME+52iZI5g==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.8", - "@npmcli/config": "^6.1.6", - "@npmcli/map-workspaces": "^3.0.3", - "@npmcli/package-json": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.0.5", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.1", - "glob": "^9.3.2", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.0", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.16", - "libnpmexec": "^5.0.16", - "libnpmfund": "^4.0.16", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.3", - "libnpmpack": "^5.0.16", - "libnpmpublish": "^7.1.3", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.0", - "minimatch": "^7.4.6", - "minipass": "^4.2.8", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.4", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.1", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "read-package-json": "^6.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.5.0", - "ssri": "^10.0.3", - "tar": "^6.1.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.2.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^7.4.2", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "6.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^9.3.1", - "minimatch": "^7.4.2", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^7.4.6" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "17.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^9.3.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "3.8.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "9.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^7.4.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.11.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^7.4.2", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "4.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.16", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "7.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.0.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "11.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "7.4.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "4.2.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "10.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "14.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "15.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.6.3", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^9.3.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.5.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/sigstore": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.13", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.13", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.1.tgz", - "integrity": "sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA==", - "dev": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^9.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/semantic-release-gitmoji": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/semantic-release-gitmoji/-/semantic-release-gitmoji-1.6.4.tgz", - "integrity": "sha512-mPkeKGKXlqKhWrlzi3mgRogTKnzOJAakrCdfBrgpG7z7WiP8sZ6pZP5Su+IJbj1RWbNBier/isVzvwE5RhozbQ==", - "dev": true, - "dependencies": { - "dateformat": "^3.0.3", - "debug": "^4.3.2", - "emoji-regex": "^9.2.2", - "git-url-parse": "^13.0.0", - "gitmojis": "^3.13.4", - "handlebars": "^4.7.6", - "issue-regex": "^3.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.mergewith": "^4.6.2", - "lodash.uniq": "^4.5.0", - "node-emoji": "^1.11.0" - }, - "peerDependencies": { - "semantic-release": "<22" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/semantic-release/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "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.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0" - } - }, - "@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dev": true, - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", - "dev": true, - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.1.0.tgz", - "integrity": "sha512-+m6+376kp4gZAYtg64aXGHK2qM2LtIiZctqtbTnETdUaD7OSuX7zDV5kciqw1QIN13lg9jWz039OF7NZUdYEeQ==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dev": true, - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", - "dev": true, - "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - } - }, - "@octokit/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.0.tgz", - "integrity": "sha512-MPKlN20dSKZ2JGV8KHNO4Y9z6xs74p5sQ2a5++5/uVme44K/5UEntIpai2n1WIrVtMlafYLdfN27BiBs2taY6g==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^16.1.0" - } - }, - "@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - } - } - }, - "@pnpm/npm-conf": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.1.tgz", - "integrity": "sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==", - "dev": true, - "requires": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - } - }, - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - }, - "@semantic-release/exec": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", - "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - } - }, - "@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - } - }, - "@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "dev": true, - "requires": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - } - }, - "@semantic-release/npm": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.3.tgz", - "integrity": "sha512-Chbv3kX4o+y+r1X6hsqBVB8NFbSVfiNlYOqMG6o9Wc8r5Y4cjxfbaMCuJ++XAtw3YXYX/NVD05cPzBi4Orjusg==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^8.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "requires": { - "type-fest": "^1.0.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "env-ci": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.0.0.tgz", - "integrity": "sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg==", - "dev": true, - "requires": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "dependencies": { - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dev": true, - "requires": { - "semver-regex": "^4.0.5" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "requires": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "requires": { - "git-up": "^7.0.0" - } - }, - "gitmojis": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/gitmojis/-/gitmojis-3.13.4.tgz", - "integrity": "sha512-TRYhqnD36Xs9GHuATVRmo7hzBb+6wXYC0zxBFvLs3nma7N1WQGWW2vPTQ0+3GsGcPwSp0XVGfe3Besn4a6ip5Q==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true - }, - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "requires": { - "protocols": "^2.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "issue-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true - }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dev": true, - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - } - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "npm": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.5.tgz", - "integrity": "sha512-0SYs9lz1ND7V3+Lz6EbsnUdZ4OxjQOHbaIKdWd8OgsbZ2hCC2ZeiXMEaBEPEVBaILW+huFA0pJ1YME+52iZI5g==", - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.8", - "@npmcli/config": "^6.1.6", - "@npmcli/map-workspaces": "^3.0.3", - "@npmcli/package-json": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.0.5", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.1", - "glob": "^9.3.2", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.0", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.16", - "libnpmexec": "^5.0.16", - "libnpmfund": "^4.0.16", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.3", - "libnpmpack": "^5.0.16", - "libnpmpublish": "^7.1.3", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.0", - "minimatch": "^7.4.6", - "minipass": "^4.2.8", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.4", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.1", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "read-package-json": "^6.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.5.0", - "ssri": "^10.0.3", - "tar": "^6.1.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "@npmcli/arborist": { - "version": "6.2.8", - "bundled": true, - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^7.4.2", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/config": { - "version": "6.1.6", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/disparity-colors": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/map-workspaces": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^9.3.1", - "minimatch": "^7.4.2", - "read-package-json-fast": "^3.0.0" - } - }, - "@npmcli/metavuln-calculator": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/package-json": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "which": "^3.0.0" - } - }, - "@npmcli/query": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@npmcli/run-script": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - } - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "bundled": true, - "dev": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@tufjs/canonical-json": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "@tufjs/models": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^7.4.6" - } - }, - "abbrev": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true, - "dev": true - }, - "bin-links": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "bundled": true, - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.0.5", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^9.3.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "6.0.1", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "defaults": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "depd": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "diff": { - "version": "5.1.0", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "events": { - "version": "3.3.0", - "bundled": true, - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "bundled": true, - "dev": true - }, - "fs-minipass": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "gauge": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "9.3.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true, - "dev": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "6.1.1", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "ignore-walk": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^7.4.2" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ini": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true, - "dev": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.11.0", - "bundled": true, - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "just-diff": { - "version": "6.0.2", - "bundled": true, - "dev": true - }, - "just-diff-apply": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "libnpmaccess": { - "version": "7.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmdiff": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^7.4.2", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - } - }, - "libnpmexec": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - } - }, - "libnpmfund": { - "version": "4.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8" - } - }, - "libnpmhook": { - "version": "9.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmorg": { - "version": "5.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmpack": { - "version": "5.0.16", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^6.2.8", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - } - }, - "libnpmpublish": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.0.0", - "ssri": "^10.0.1" - } - }, - "libnpmsearch": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmteam": { - "version": "5.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmversion": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.18.3", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.0", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minimatch": { - "version": "7.4.6", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.8", - "bundled": true, - "dev": true - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "ms": { - "version": "2.1.3", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true, - "dev": true - }, - "node-gyp": { - "version": "9.3.1", - "bundled": true, - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "cacache": { - "version": "16.1.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "7.1.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.1.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "10.1.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "7.0.4", - "bundled": true, - "dev": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "7.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-registry-fetch": { - "version": "14.0.4", - "bundled": true, - "dev": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-user-validate": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "7.0.1", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "15.1.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-scurry": { - "version": "1.6.3", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "bundled": true, - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "process": { - "version": "0.11.10", - "bundled": true, - "dev": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-call-limit": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "read": "^2.0.0" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "read": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~1.0.0" - } - }, - "read-cmd-shim": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "read-package-json": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "^9.3.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "7.5.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true, - "dev": true - }, - "sigstore": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - } - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.2.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "bundled": true, - "dev": true - }, - "ssri": { - "version": "10.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.13", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "treeverse": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "tuf-js": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "@tufjs/models": "1.0.3", - "make-fetch-happen": "^11.0.1" - } - }, - "unique-filename": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "requires": { - "protocols": "^2.0.0" - } - }, - "parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "requires": { - "parse-path": "^7.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true - }, - "lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true - }, - "normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - } - }, - "type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "dependencies": { - "read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semantic-release": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.1.tgz", - "integrity": "sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^9.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "semantic-release-gitmoji": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/semantic-release-gitmoji/-/semantic-release-gitmoji-1.6.4.tgz", - "integrity": "sha512-mPkeKGKXlqKhWrlzi3mgRogTKnzOJAakrCdfBrgpG7z7WiP8sZ6pZP5Su+IJbj1RWbNBier/isVzvwE5RhozbQ==", - "dev": true, - "requires": { - "dateformat": "^3.0.3", - "debug": "^4.3.2", - "emoji-regex": "^9.2.2", - "git-url-parse": "^13.0.0", - "gitmojis": "^3.13.4", - "handlebars": "^4.7.6", - "issue-regex": "^3.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.mergewith": "^4.6.2", - "lodash.uniq": "^4.5.0", - "node-emoji": "^1.11.0" - } - }, - "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "dev": true, - "requires": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "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.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } -} diff --git a/.github/semantic_release/package.json b/.github/semantic_release/package.json deleted file mode 100644 index 7f4b489a..00000000 --- a/.github/semantic_release/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "devDependencies": { - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.7", - "semantic-release": "^21.0.1", - "semantic-release-gitmoji": "^1.6.4" - } -} diff --git a/.github/semantic_release/release_notes.hbs b/.github/semantic_release/release_notes.hbs deleted file mode 100644 index e6d68c2b..00000000 --- a/.github/semantic_release/release_notes.hbs +++ /dev/null @@ -1,93 +0,0 @@ -{{#if compareUrl}} -# [v{{nextRelease.version}}]({{compareUrl}}) ({{datetime "UTC:yyyy-mm-dd"}}) -{{else}} -# v{{nextRelease.version}} ({{datetime "UTC:yyyy-mm-dd"}}) -{{/if}} - -{{#with commits}} - -{{#if boom}} -## 💥 Breaking Changes -{{#each boom}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if sparkles}} -## ✨ New Features -{{#each sparkles}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if bug}} -## 🐛 Bug Fixes -{{#each bug}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if ambulance}} -## 🚑 Critical Hotfixes -{{#each ambulance}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if lock}} -## 🔒 Security Issues -{{#each lock}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if arrow_up}} -## ⬆️ Dependency Upgrade -{{#each arrow_up}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if memo}} -## 📝️ Documentation -{{#each memo}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if construction_worker}} -## 👷 CI/CD -{{#each construction_worker}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if white_check_mark}} -## 🧪️ Add / Update / Pass Tests -{{#each white_check_mark}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if test_tube}} -## 🧪️ Add Failing Tests -{{#each test_tube}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if recycle}} -## ♻️Refactoring -{{#each recycle}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{#if truck}} -## 🚚 Moving/Renaming -{{#each truck}} -- {{> commitTemplate}} -{{/each}} -{{/if}} - -{{/with}} diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml deleted file mode 100644 index 58b58648..00000000 --- a/.github/workflows/docker.yaml +++ /dev/null @@ -1,43 +0,0 @@ -name: Docker CI/CD - -on: - pull_request: - branches: ['**'] - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/docker.yaml - - Dockerfile -jobs: - docker-ci-test: - runs-on: ubuntu-latest - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Declare Version Variable - run: | - PACKAGE_VERSION=$(hatch version) - PACKAGE_NAME=$(hatch project metadata | jq -r .name) - echo PACKAGE_VERSION=${PACKAGE_VERSION} >> $GITHUB_ENV - echo PACKAGE_NAME=${PACKAGE_NAME} >> $GITHUB_ENV - - name: Docker Image Building and Publishing - id: docker_build - uses: docker/build-push-action@v5 - with: - push: false - tags: juftin/${{ env.PACKAGE_NAME }}:latest diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml deleted file mode 100644 index 42edd792..00000000 --- a/.github/workflows/labeler.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Labeler - -on: - push: - branches: - - main - issues: - types: [opened] - pull_request: - types: - - opened - - reopened - - synchronize - - labeled - - unlabeled - branches: - - main - -jobs: - label-sync: - if: github.event_name == 'push' - runs-on: ubuntu-latest - steps: - - name: Check out the repository - uses: actions/checkout@v3 - - name: Run Labeler - uses: crazy-max/ghaction-github-labeler@v4.0.0 - with: - yaml-file: .github/labels.yaml - skip-delete: false - dry-run: false - - apply-triage-label: - if: github.event_name == 'issues' - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v6 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['triage'] - }) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index 27d62785..00000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Lint - -on: - pull_request: - branches: ['**'] - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up Python Environment - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Lint - id: lint - continue-on-error: true - run: | - echo "::add-matcher::.github/workflows/matchers/flake8.json" - hatch run lint:style - echo "::remove-matcher owner=flake8::" - - name: Type Checking - id: check - continue-on-error: true - run: | - echo "::add-matcher::.github/workflows/matchers/mypy.json" - hatch run lint:typing - echo "::remove-matcher owner=mypy::" - - name: Raise Errors For Failures - if: | - steps.lint.outcome != 'success' || - steps.check.outcome != 'success' - run: | - echo "Lint: ${{ steps.lint.outcome }}" - echo "Check: ${{ steps.check.outcome }}" - exit 1 diff --git a/.github/workflows/matchers/flake8.json b/.github/workflows/matchers/flake8.json deleted file mode 100644 index 52f94e05..00000000 --- a/.github/workflows/matchers/flake8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "flake8", - "pattern": [ - { - "regexp": "^(.*?):(\\d+):(\\d+): (.*)$", - "file": 1, - "line": 2, - "column": 3, - "message": 4 - } - ] - } - ] -} diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json deleted file mode 100644 index c1e81a9e..00000000 --- a/.github/workflows/matchers/mypy.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "mypy", - "pattern": [ - { - "regexp": "^(.+):(\\d+):\\s(error|warning|note):\\s(.+)$", - "file": 1, - "line": 2, - "severity": 3, - "message": 4 - } - ] - } - ] -} diff --git a/.github/workflows/matchers/python.json b/.github/workflows/matchers/python.json deleted file mode 100644 index 9c3095c0..00000000 --- a/.github/workflows/matchers/python.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "python", - "pattern": [ - { - "regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$", - "file": 1, - "line": 2 - }, - { - "regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$", - "message": 2 - } - ] - } - ] -} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml deleted file mode 100644 index 20d083db..00000000 --- a/.github/workflows/publish.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: Publishing - -on: - release: - types: - - published - -jobs: - pypi-publish: - name: PyPI - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - environment: - name: pypi - url: https://pypi.org/p/lunchable - permissions: - id-token: write - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip - python -m pip install -q hatch pre-commit - hatch --version - - name: Build package - run: | - hatch build - - name: Publish package on PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - - docker-hub-publish: - name: docker-hub - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - name: Declare Version Variable - run: | - PACKAGE_VERSION=$(hatch version) - PACKAGE_NAME=$(hatch project metadata | jq -r .name) - echo PACKAGE_VERSION=${PACKAGE_VERSION} >> $GITHUB_ENV - echo PACKAGE_NAME=${PACKAGE_NAME} >> $GITHUB_ENV - - name: Docker Image Building and Publishing - id: docker_build - uses: docker/build-push-action@v5 - with: - push: true - tags: juftin/${{ env.PACKAGE_NAME }}:latest,juftin/${{ env.PACKAGE_NAME }}:${{ env.PACKAGE_VERSION }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index f6b45290..00000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,78 +0,0 @@ -name: Release -on: - push: - branches: [main, next, beta, alpha, '*.x'] -jobs: - release: - name: Release - if: github.repository_owner == 'juftin' - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - steps: - - name: Check out the repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Setup Node.js - uses: actions/setup-node@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - python -m pip install -q "${{ github.workspace }}" - hatch --version - - name: Release - run: hatch run gen:release - env: - GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - GIT_AUTHOR_NAME: github-actions[bot] - GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com - GIT_COMMITTER_NAME: github-actions[bot] - GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com - - github-pages-publish: - runs-on: ubuntu-latest - needs: release - if: github.ref == 'refs/heads/main' && github.repository_owner == 'juftin' - permissions: - pages: write - id-token: write - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Checkout Latest Changes - uses: actions/checkout@v4 - with: - ref: ${{ github.ref }} - fetch-depth: 0 - - name: Set up Python Environment - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install Hatch - run: | - python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit - python -m pip install -q "${{ github.workspace }}" - hatch --version - - name: Create Virtual Environment - run: hatch env create docs - - name: Build Site - run: hatch run docs:build - - name: Setup GitHub Pages - uses: actions/configure-pages@v4 - - name: Upload Artifact - uses: actions/upload-pages-artifact@v3 - with: - path: site/ - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml deleted file mode 100644 index 69728cf9..00000000 --- a/.github/workflows/tests.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: Tests - -on: - push: - branches: - - main - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/tests.yaml - pull_request: - branches: ['**'] - paths: - - lunchable/** - - pyproject.toml - - .github/workflows/tests.yaml - schedule: - - cron: 0 12 1 * * - workflow_dispatch: -jobs: - test-suite: - runs-on: ubuntu-latest - strategy: - fail-fast: true - matrix: - include: - - {name: Python 3.12, python: '3.12'} - - {name: Python 3.11, python: '3.11'} - - {name: Python 3.10, python: '3.10'} - - {name: Python 3.9, python: '3.9'} - - {name: Python 3.8, python: '3.8'} - concurrency: - group: ${{ github.workflow }}-${{ matrix.python }}-${{ github.ref }} - cancel-in-progress: true - steps: - - name: Set up Github Workspace - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set up Python Environment ${{ matrix.python }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - name: Install Hatch - run: | - python -m pip install -q --upgrade pip wheel - python -m pip install -q hatch pre-commit - hatch --version - - name: Test Suite - run: | - echo "::add-matcher::.github/workflows/matchers/python.json" - hatch run +py=${{ matrix.python }} all:cov --cov-report=xml tests - echo "::remove-matcher owner=python::" - env: - VCR_RECORD_MODE: none - - name: Upload coverage reports to Codecov - if: matrix.python == '3.11' - uses: codecov/codecov-action@v3 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f96ebf94..049eefe8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,19 +34,3 @@ repos: PULL_REQUEST_TEMPLATE.md| .github/semantic_release/release_notes.hbs ) - -- repo: local - hooks: - - id: format - name: format - description: Runs Code Auto-Formatters - entry: hatch run lint:fmt - language: system - pass_filenames: false - - id: lint - name: lint - description: Runs Code Linters - entry: hatch run lint:style - language: system - pass_filenames: false - require_serial: false diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 9c6f02dd..00000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -ARG BASE_IMAGE -FROM ${BASE_IMAGE:-python:3.11-slim} - -MAINTAINER Justin Flannery "juftin@juftin.com" - -RUN apt-get update && apt-get install -y jq && apt-get clean - -COPY README.md /tmp/project/README.md -COPY pyproject.toml /tmp/project/pyproject.toml -COPY lunchable /tmp/project/lunchable -COPY requirements.txt /tmp/project/requirements.txt - -RUN pip install "/tmp/project[plugins]" \ - --constraint /tmp/project/requirements.txt && \ - rm -rf /tmp/project - -SHELL ["/bin/bash", "-c"] - -RUN _LUNCHABLE_COMPLETE=bash_source lunchable > ${HOME}/.lunchable-complete.bash && \ - echo "[[ ! -f ${HOME}/.lunchable-complete.bash ]] || source ${HOME}/.lunchable-complete.bash" >> /root/.bashrc - -CMD ["lunchable", "--help"] diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 1042738e..00000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: '3.7' -services: - lunchable: - container_name: lunchable - image: juftin/lunchable:latest - environment: - LUNCHMONEY_ACCESS_TOKEN: ${LUNCHMONEY_ACCESS_TOKEN} - SPLITWISE_CONSUMER_KEY: ${SPLITWISE_CONSUMER_KEY:-} - SPLITWISE_CONSUMER_SECRET: ${SPLITWISE_CONSUMER_SECRET:-} - SPLITWISE_API_KEY: ${SPLITWISE_API_KEY:-} - PUSHOVER_USER_KEY: ${PUSHOVER_USER_KEY:-} - command: lunchable plugins pushlunch notify --continuous --interval 60 diff --git a/docs/cli.md b/docs/cli.md deleted file mode 100644 index a7c4a7a4..00000000 --- a/docs/cli.md +++ /dev/null @@ -1,12 +0,0 @@ -# lunchable CLI - -```bash exec="on" source="above" result="markdown" -lunchable --help -``` - -::: mkdocs-click - :module: lunchable._cli - :command: cli - :prog_name: lunchable - :style: table - :list_subcommands: True diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 0f03bad3..00000000 --- a/docs/contributing.md +++ /dev/null @@ -1,189 +0,0 @@ -# Contributing - -## Environment Setup - -> TIP: **pipx** -> -> This documentaion uses [pipx] to -> install and manage non-project command line tools like `hatch` and -> `pre-commit`. If you don't already have `pipx` installed, make sure to -> see their [documentation](https://pypa.github.io/pipx/installation/). -> If you prefer not to use `pipx`, you can use `pip` instead. - -1. Install [hatch](https://hatch.pypa.io/latest/) - - ```shell - pipx install hatch - ``` - - > NOTE: **pre-commit** - > - > Hatch will attempt to set up pre-commit hooks for you using - > [pre-commit]. If you don't already, - > make sure to install pre-commit as well: `pipx install pre-commit` - -2. Build the Virtual Environment - - ```shell - hatch env create - ``` - -3. If you need to, you can link a hatch virtual environment to your IDE. - They can be located by name with the `env find` command: - - ```shell - hatch env find test - ``` - -4. Activate the Virtual Environment - - ```shell - hatch shell - ``` - -## Using Hatch - -### Hatch Cheat Sheet - -| Command Description | Command | Notes | -| ------------------------------ | --------------------------- | ---------------------------------------------------------- | -| Run Tests | `hatch run cov` | Runs tests with `pytest` and `coverage` | -| Run Formatting | `hatch run lint:fmt` | Runs `ruff` code formatter | -| Run Linting | `hatch run lint:all` | Runs `ruff` and `mypy` linters / type checkers | -| Run Type Checking | `hatch run lint:typing` | Runs `mypy` type checker | -| Serve the Documentation | `hatch run docs:serve` | Serve the documentation using MkDocs | -| Run the `pre-commit` Hooks | `hatch run lint:precommit` | Runs the `pre-commit` hooks on all files | - -### Hatch Explanation - -Hatch is a Python package manager. It's most basic use is as a standardized build-system. -However, hatch also has some extra features which this project takes advantage of. -These features include virtual environment management and the organization of common -scripts like linting and testing. All the operations in hatch take place in one -of its managed virtual environments. - -Hatch has a variety of environments, to see them simply ask hatch: - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show -``` - -That above command will tell you that there are five environments that -you can use: - -- `default` -- `docs` -- `gen` -- `lint` -- `test` - -Each of these environments has a set of commands that you can run. -To see the commands for a specific environment, run: - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show default -``` - -Here we can see that the `default` environment has the following commands: - -- `cov` -- `test` - -The one that we're interested in is `cov`, which will run the tests -for the project. - -```bash -hatch run cov -``` - -Since `cov` is in the default environment, we can run it without -specifying the environment. However, to run the `serve` command in the -`docs` environment, we need to specify the environment: - -```bash -hatch run docs:serve -``` - -You can see what scripts are available using the `env show` command - -```bash exec="on" result="markdown" source="tabbed-left" tabs="hatch CLI|Output" -hatch env show docs -``` - -## Committing Code - -This project uses [pre-commit] to run a set of -checks on the code before it is committed. The pre-commit hooks are -installed by hatch automatically when you run it for the first time. - -This project uses [semantic-versioning] standards, managed by [semantic-release]. -Releases for this project are handled entirely by CI/CD via pull requests being -merged into the `main` branch. Contributions follow the [gitmoji] standards -with [conventional commits]. - -While you can denote other changes on your commit messages with [gitmoji], the following -commit message emoji prefixes are the only ones to trigger new releases: - -| Emoji | Shortcode | Description | Semver | -| ----- | ------------- | --------------------------- | ------ | -| 💥 | \:boom\: | Introduce breaking changes. | Major | -| ✨ | \:sparkles\: | Introduce new features. | Minor | -| 🐛 | \:bug\: | Fix a bug. | Patch | -| 🚑 | \:ambulance\: | Critical hotfix. | Patch | -| 🔒 | \:lock\: | Fix security issues. | Patch | - -Most features can be squash merged into a single commit on a pull-request. -When merging multiple commits, they will be summarized into a single release. - -If you're working on a new feature, your commit message might look like: - -```text -✨ New Feature Description -``` - -Bug fix commits would look like this: - -```text -🐛 Bug Fix Description -``` - -If you're working on a feature that introduces breaking changes, your -commit message might look like: - -```text -💥 Breaking Change Description -``` - -Other commits that don't trigger a release might look like this: - -```text -📝 Documentation Update Description -👷 CI/CD Update Description -🧪 Testing Changes Description -🚚 Moving/Renaming Description -⬆️ Dependency Upgrade Description -``` - -### Pre-Releases - -[semantic-release] supports pre-releases. To trigger a pre-release, you -would merge your pull request into an `alpha` or `beta` branch. - -### Specific Release Versions - -In some cases you need more advanced control around what kind of release you -need to create. If you need to release a specific version, you can do so by creating a -new branch with the version number as the branch name. For example, if the -current version is `2.3.2`, but you need to release a fix as `1.2.5`, you -would create a branch named `1.2.x` and merge your changes into that branch. - -See the [semantic-release documentation] for more information about -branch based releases and other advanced release cases. - -[pipx]: https://pypa.github.io/pipx/ -[pre-commit]: https://pre-commit.com/ -[gitmoji]: https://gitmoji.dev/ -[conventional commits]: https://www.conventionalcommits.org/en/v1.0.0/ -[semantic-release]: https://github.com/semantic-release/semantic-release -[semantic-versioning]: https://semver.org/ -[semantic-release documentation]: https://semantic-release.gitbook.io/semantic-release/usage/configuration#branches diff --git a/docs/gen_pages.py b/docs/gen_pages.py deleted file mode 100644 index af987f26..00000000 --- a/docs/gen_pages.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Generate the code reference pages and navigation. -""" - -import logging -from pathlib import Path - -import mkdocs_gen_files - -logger = logging.getLogger(__name__) - -project_dir = Path(__file__).resolve().parent.parent -source_code = project_dir.joinpath("lunchable") - -for path in sorted(source_code.rglob("*.py")): - module_path = path.relative_to(project_dir).with_suffix("") - doc_path = path.relative_to(source_code).with_suffix(".md") - full_doc_path = Path("reference", doc_path) - - parts = tuple(module_path.parts) - if parts[-1] == "__init__": - parts = parts[:-1] - doc_path = doc_path.with_name("index.md") - full_doc_path = full_doc_path.with_name("index.md") - elif parts[-1] == "__main__": - continue - with mkdocs_gen_files.open(full_doc_path, "w") as fd: - fd.write(f"# `{parts[-1]}`\n\n::: {'.'.join(parts)}") - - mkdocs_gen_files.set_edit_path(full_doc_path, path) - -# Exclude parts that are between two exact `` lines -readme_content = Path("README.md").read_text() -readme_content = "\n".join(readme_content.split("\n\n")[::2]) -with mkdocs_gen_files.open("index.md", "w") as index_file: - index_file.write(readme_content) diff --git a/docs/interacting.md b/docs/interacting.md deleted file mode 100644 index 2c2e8f35..00000000 --- a/docs/interacting.md +++ /dev/null @@ -1,73 +0,0 @@ -# LunchMoney - -The `LunchMoney` client is the main entrypoint for interacting with the Lunch Money API. -It defaults to inheriting the `LUNCHMONEY_ACCESS_TOKEN` environment variable, but can be -created with an explicit `access_token` parameter. - -```python -from lunchable import LunchMoney - -lunch = LunchMoney(access_token="xxxxxxxxxxx") -``` - -## Methods - -| HTTP Verb | Name | Description | -|-----------|--------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| GET | [get_assets](#lunchable.LunchMoney.get_assets) | Get Manually Managed Assets | -| GET | [get_budgets](#lunchable.LunchMoney.get_budgets) | Get Monthly Budgets | -| GET | [get_categories](#lunchable.LunchMoney.get_categories) | Get Spending categories | -| GET | [get_category](#lunchable.LunchMoney.get_category) | Get single category | -| GET | [get_crypto](#lunchable.LunchMoney.get_crypto) | Get Crypto Assets | -| GET | [get_plaid_accounts](#lunchable.LunchMoney.get_plaid_accounts) | Get Plaid Synced Assets | -| GET | [get_recurring_items](#lunchable.LunchMoney.get_recurring_items) | Get Recurring Items | -| GET | [get_tags](#lunchable.LunchMoney.get_tags) | Get Spending Tags | -| GET | [get_transaction](#lunchable.LunchMoney.get_transaction) | Get a Transaction by ID | -| GET | [get_transactions](#lunchable.LunchMoney.get_transactions) | Get Transactions Using Criteria | -| GET | [get_user](#lunchable.LunchMoney.get_user) | Get Personal User Details | -| POST | [insert_asset](#lunchable.LunchMoney.insert_asset) | Create a single (manually-managed) asset | -| POST | [insert_category](#lunchable.LunchMoney.insert_category) | Create a Spending Category | -| POST | [insert_category_group](#lunchable.LunchMoney.insert_category_group) | Create a Spending Category Group | -| POST | [insert_into_category_group](#lunchable.LunchMoney.insert_into_category_group) | Add to a Category Group | -| POST | [insert_transaction_group](#lunchable.LunchMoney.insert_transaction_group) | Create a Transaction Group of Two or More Transactions | -| POST | [insert_transactions](#lunchable.LunchMoney.insert_transactions) | Create One or Many Lunch Money Transactions | -| POST | [trigger_fetch_from_plaid](#lunchable.LunchMoney.trigger_fetch_from_plaid) | Trigger a Plaid Sync | -| POST | [unsplit_transactions](#lunchable.LunchMoney.unsplit_transactions) | Unsplit Transactions | -| PUT | [upsert_budget](#lunchable.LunchMoney.upsert_budget) | Upsert a Budget for a Category and Date | -| PUT | [update_asset](#lunchable.LunchMoney.update_asset) | Update a Single Asset | -| PUT | [update_category](#lunchable.LunchMoney.update_category) | Update a single category | -| PUT | [update_crypto](#lunchable.LunchMoney.update_crypto) | Update a Manual Crypto Asset | -| PUT | [update_transaction](#lunchable.LunchMoney.update_transaction) | Update a Transaction | -| DELETE | [remove_budget](#lunchable.LunchMoney.remove_budget) | Unset an Existing Budget for a Particular Category in a Particular Month | -| DELETE | [remove_category](#lunchable.LunchMoney.remove_category) | Delete a single category | -| DELETE | [remove_category_force](#lunchable.LunchMoney.remove_category_force) | Forcefully delete a single category | -| DELETE | [remove_transaction_group](#lunchable.LunchMoney.remove_transaction_group) | Delete a Transaction Group | - -## Low Level Methods - -| Name | Description | -|------------------------------------------------------------|-------------------------------------------------------| -| [request](#lunchable.LunchMoney.request) | Make an HTTP request | -| [arequest](#lunchable.LunchMoney.arequest) | Make an async HTTP request | -| [process_response](#lunchable.LunchMoney.process_response) | Process a Lunch Money response and raise any errors | -| [make_request](#lunchable.LunchMoney.make_request) | Make an HTTP request and `process` its response | -| [amake_request](#lunchable.LunchMoney.amake_request) | Make an async HTTP request and `process` its response | - -## Attributes - -| Name | Description | -|------------------------------------------------------|----------------------------------| -| [async_session](#lunchable.LunchMoney.async_session) | Authenticated Async HTTPX Client | -| [session](#lunchable.LunchMoney.session) | Authenticated HTTPX Client | - -## Class Documentation - -::: lunchable.LunchMoney - handler: python - options: - show_bases: false - allow_inspection: true - inherited_members: true - group_by_category: true - heading_level: 3 - show_source: false diff --git a/docs/plugins.md b/docs/plugins.md deleted file mode 100644 index 0762f4bb..00000000 --- a/docs/plugins.md +++ /dev/null @@ -1,206 +0,0 @@ -# Plugins - -`lunchable` plugins are Python packages outside of the `lunchable` package that -can be installed into the same environment as `lunchable` to add additional -functionality to the CLI. To install all the known plugins, and their dependencies, install -lunchable with the `plugins` extra: - -```shell -pipx install "lunchable[plugins]" -``` - -lunchable supports CLI plugins with other external packages. See below for what's been built -already. If you can't find what you're looking for, consider building it yourself and -opening a pull-request to add it to the list: - -- [PushLunch](https://github.com/juftin/lunchable-pushlunch): Push Notifications via Pushover -- [SplitLunch](https://github.com/juftin/lunchable-splitlunch): Splitwise Integration -- [PrimeLunch](https://github.com/juftin/lunchable-primelunch): Amazon Transaction Updater - -## LunchableApp - -Lunchable provides a [LunchableApp](#lunchable.plugins.LunchableApp) -class that can be used to easily build plugins, apps, -and more. Notice a few of the main attributes / methods of the `LunchableApp` class: - - attribute / method | description | type -------------------------------------------------------------------------------|--------------------------------------------------------------------------------|------------------------------------------------------- - **`lunch`** | The `LunchMoney` client | [LunchMoney](interacting.md#lunchmoney) - **`data`** ¹ | The `LunchableData` object | [LunchableData](#lunchable.plugins.app.LunchableData) - [refresh_data](#lunchable.plugins.LunchableApp.refresh_data) | Refresh all data (besides Transactions) | `method` - [refresh_transactions](#lunchable.plugins.LunchableApp.refresh_transactions) | Refresh transactions, takes same parameters as `LunchMoney.get_transactions()` | `method` - [refresh](#lunchable.plugins.LunchableApp.refresh) ² | Refresh the data for one particular model, takes **kwargs | `method` - [clear_transactions](#lunchable.plugins.LunchableApp.clear_transactions) ³ | Clear all transactions from the internal data | `method` - -> ¹ This attribute contains all of the data that is loaded from LunchMoney. It has attributes -> for `assets`, `categories`, `plaid_accounts`, `tags`, `transactions`, `crypto` and `user`. -> These attributes (except for `user`) are `dict[int, LunchableModel]` objects, where the key is -> the ID of the object and the value is the object itself. - -> ² This method refreshes all of the data for one particular model. For example, -> `refresh(AssetsObject)` will refresh the assets on the underling `data.assets` -> attribute and return a `dict[int, AssetsObject]` object. - -> ³ This the same as running `app.data.transactions.clear()` - -### An Example App - -```python -from __future__ import annotations - -from typing import Any - -from lunchable.models import AssetsObject, TransactionUpdateObject -from lunchable.plugins import LunchableApp - - -class MyCustomApp(LunchableApp): - """ - My Custom App - """ - - def do_something_with_assets(self) -> None: - """ - Do something with the assets - """ - if not self.data.assets: - # If the data hasn't been loaded yet, load it - # The following method loads all of the data besides Transactions - # (Assets, Categories, Plaid Accounts, Tags, Crypto, User) - self.refresh_data() - for asset_id, asset in self.data.assets.items(): - # Do something with the asset - print(asset_id, asset) - - def do_something_with_transactions(self) -> None: - """ - Do something with the transactions - """ - if not self.data.transactions: - # If the transactions haven't been loaded yet, load them - self.refresh_transactions(start_date="2021-01-01", end_date="2021-01-31") - # Refresh the latest assets - latest_assets: dict[int, AssetsObject] = self.refresh(model=AssetsObject) - for transaction_id, transaction in self.data.transactions.items(): - if transaction.asset_id: - asset = latest_assets[transaction.asset_id] - print(transaction_id, transaction, asset) - - def update_transaction(self, transaction_id: int, payee: str) -> dict[str, Any]: - """ - You can do anything you want with the `self - """ - update_transaction = TransactionUpdateObject(payee=payee) - response = self.lunch.update_transaction(transaction_id=transaction_id, - transaction=update_transaction) - return response - - -if __name__ == "__main__": - app = MyCustomApp(access_token="xxxxxxxx") - app.do_something_with_assets() - app.do_something_with_transactions() - app.update_transaction(transaction_id=12345, payee="New Payee") -``` - -#### Choose a subset of data to load - -If you don't want to load all of the data, you can specify which data you want to load by -specifying the `lunchable_models` attribute of the `LunchableApp` class. The following example -will only sync the `assets` and `plaid_accounts` data when the `refresh_data()` method is called: - -```python -from __future__ import annotations - -from typing import ClassVar - -from lunchable.models import AssetsObject, PlaidAccountObject, LunchableModel - -from lunchable.plugins import LunchableApp - - -class CustomApp(LunchableApp): - """ - Custom Lunchable App - - This app syncs Plaid Accounts and Assets when its `refresh_data` method - is called. - """ - - lunchable_models: ClassVar[list[type[LunchableModel]]] = [ - PlaidAccountObject, - AssetsObject, - ] - - def do_something_with_assets(self) -> None: - """ - Do something with the assets - """ - if not self.data.plaid_accounts: - self.refresh_data() - for plaid_account_id, plaid_account in self.data.plaid_accounts.items(): - print(plaid_account_id, plaid_account) -``` - -## Building a Plugin - -Plugins are built separate Python packages and are detected by lunchable via -the `lunchable.cli` entrypoint, these are -[click](https://github.com/pallets/click/) command line applications. -To add your own plugin to lunchable you'll need to add a new entrypoint to -your package. The below example shows how to do this with hatch, a modern, -standards-based Python package manager: - -```python -import click - - -@click.group -def plugin_name(): - """ - Plugin description - """ - pass - - -@plugin_name.command -def command(): - """ - Plugin description - """ - pass -``` - -```toml -[project.entry-points."lunchable.cli"] -your-package = "your_package.cli:plugin_name" -``` - -The above example will add a new `command` / `group` to the lunchable `plugins` CLI. When -your package is installed into the same environment as lunchable, your plugin will be -accessible via the `lunchable plugins` command: - -```shell -lunchable plugins plugin-name command -``` - -## API Documentation - -::: lunchable.plugins.LunchableApp - handler: python - options: - show_bases: false - allow_inspection: true - inherited_members: true - group_by_category: true - heading_level: 3 - show_source: false - -::: lunchable.plugins.app.LunchableData - handler: python - options: - show_bases: false - allow_inspection: true - group_by_category: true - heading_level: 3 - show_source: false diff --git a/docs/static/lunchable.png b/docs/static/lunchable.png deleted file mode 100644 index cd9236d7..00000000 Binary files a/docs/static/lunchable.png and /dev/null differ diff --git a/docs/usage.md b/docs/usage.md deleted file mode 100644 index 9af1537f..00000000 --- a/docs/usage.md +++ /dev/null @@ -1,128 +0,0 @@ -# Usage - -## Installation - -To use lunchable, first install it using pip: - -```shell -pip install lunchable -``` - -## Client - -The [LunchMoney](interacting.md#interacting-with-lunch-money) client is the main entrypoint -for interacting with the Lunch Money API. It defaults to inheriting the `LUNCHMONEY_ACCESS_TOKEN` -environment variable, but can be created with an explicit `access_token` parameter. - -```python -from lunchable import LunchMoney - -lunch = LunchMoney(access_token="xxxxxxx") -``` - -Read more about [Interacting with Lunch Money](interacting.md#lunchmoney) -to see what else you can do. - -# Transactions - -## Retrieve a list of [`TransactionObject`][lunchable.models.transactions.TransactionObject] - -```python -from typing import List - -from lunchable import LunchMoney -from lunchable.models import TransactionObject - -lunch = LunchMoney(access_token="xxxxxxx") -transactions: List[TransactionObject] = lunch.get_transactions( - start_date="2020-01-01", - end_date="2020-01-31" -) -``` - -## Retrieve a single transaction ([`TransactionObject`][lunchable.models.transactions.TransactionObject]) - -```python -from lunchable import LunchMoney -from lunchable.models import TransactionObject - -lunch = LunchMoney(access_token="xxxxxxx") -transaction: TransactionObject = lunch.get_transaction(transaction_id=1234) -``` - -The above code returns a TransactionObject with ID # 1234 (assuming it exists) - -## Update a transaction with a [`TransactionUpdateObject`][lunchable.models.transactions.TransactionUpdateObject] - -```python -from datetime import datetime -from typing import Any, Dict - -from lunchable import LunchMoney -from lunchable.models import TransactionUpdateObject - -lunch = LunchMoney(access_token="xxxxxxx") -transaction_note = f"Updated on {datetime.now()}" -notes_update = TransactionUpdateObject(notes=transaction_note) -response: Dict[str, Any] = lunch.update_transaction( - transaction_id=1234, - transaction=notes_update -) -``` - -## Update a [`TransactionObject`][lunchable.models.transactions.TransactionObject] with itself - -```python -from datetime import datetime, timedelta - -from lunchable import LunchMoney -from lunchable.models import TransactionObject - -lunch = LunchMoney(access_token="xxxxxxx") -transaction: TransactionObject = lunch.get_transaction(transaction_id=1234) - -transaction.notes = f"Updated on {datetime.now()}" -transaction.date = transaction.date + timedelta(days=1) -response = lunch.update_transaction( - transaction_id=transaction.id, - transaction=transaction -) -``` - -## Create a new transaction with a [`TransactionInsertObject`][lunchable.models.transactions.TransactionInsertObject] - -`transactions` can be a single [`TransactionInsertObject`][lunchable.models.transactions.TransactionInsertObject] -or a list of [`TransactionInsertObject`][lunchable.models.transactions.TransactionInsertObject]. - -```python -from lunchable import LunchMoney -from lunchable.models import TransactionInsertObject - -lunch = LunchMoney(access_token="xxxxxxx") - -new_transaction = TransactionInsertObject( - payee="Example Restaurant", - amount=120.00, - notes="Saturday Dinner" -) -new_transaction_ids = lunch.insert_transactions(transactions=new_transaction) -``` - -## Use the Lunchable CLI - -```shell -lunchable transactions get --limit 5 -``` - -## Use the Lunchable CLI via Docker - -```shell -docker pull juftin/lunchable -``` - -```shell -docker run \ - --env LUNCHMONEY_ACCESS_TOKEN=${LUNCHMONEY_ACCESS_TOKEN} \ - juftin/lunchable:latest \ - lunchable transactions get --limit 5 -``` diff --git a/lunchable/__init__.py b/lunchable/__init__.py deleted file mode 100644 index 44d6eeeb..00000000 --- a/lunchable/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Lunch Money Python SDK -""" - -from ._version import __application__, __author__, __email__, __version__ -from .exceptions import LunchMoneyError -from .models._lunchmoney import LunchMoney -from .models.transactions import ( - TransactionInsertObject, - TransactionSplitObject, - TransactionUpdateObject, -) - -__all__ = [ - "LunchMoney", - "LunchMoneyError", - "TransactionInsertObject", - "TransactionUpdateObject", - "TransactionSplitObject", - "__application__", - "__version__", - "__author__", - "__email__", -] diff --git a/lunchable/__main__.py b/lunchable/__main__.py deleted file mode 100644 index 633ef4a8..00000000 --- a/lunchable/__main__.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Lunchmoney CLI Hook -""" - -from lunchable._cli import cli - -if __name__ == "__main__": - cli() diff --git a/lunchable/_cli.py b/lunchable/_cli.py deleted file mode 100644 index ee888cbc..00000000 --- a/lunchable/_cli.py +++ /dev/null @@ -1,193 +0,0 @@ -""" -Lunchmoney CLI -""" - -import logging -import sys -from json import JSONDecodeError -from typing import Any, Dict, Optional - -import click -import httpx -from click_plugins import with_plugins -from importlib_metadata import entry_points -from pydantic_core import to_jsonable_python -from rich import print, print_json, traceback - -import lunchable -from lunchable import LunchMoney -from lunchable._config.logging_config import set_up_logging -from lunchable.models import LunchableModel - -logger = logging.getLogger(__name__) - - -class LunchMoneyContext(LunchableModel): - """ - Context Object to PAss Around CLI - """ - - debug: bool - access_token: Optional[str] - - -debug_option = click.option( - "--debug/--no-debug", default=False, help="Enable extra debugging output" -) -access_token_option = click.option( - "--access-token", - default=None, - help="LunchMoney Developer API Access Token", - envvar="LUNCHMONEY_ACCESS_TOKEN", -) - - -@click.group(invoke_without_command=True) -@click.version_option( - version=lunchable.__version__, prog_name=lunchable.__application__ -) -@access_token_option -@debug_option -@click.pass_context -def cli(ctx: click.core.Context, debug: bool, access_token: str) -> None: - """ - Interactions with Lunch Money via lunchable 🍱 - """ - ctx.obj = LunchMoneyContext(debug=debug, access_token=access_token) - traceback.install(show_locals=debug) - set_up_logging(log_level=logging.DEBUG if debug is True else logging.INFO) - if ctx.invoked_subcommand is None: - click.echo(ctx.get_help()) - - -@cli.group() -def transactions() -> None: - """ - Interact with Lunch Money transactions - """ - - -@cli.group() -def plugins() -> None: - """ - Interact with Lunchable Plugins - - Install lunchable with the "plugins" extra to get - all the known plugins - - pipx install "lunchable[plugins]" - """ - - -@transactions.command("get") -@click.option( - "--start-date", - default=None, - help="Denotes the beginning of the time period to fetch transactions for. Defaults" - "to beginning of current month. Required if end_date exists. " - "Format: YYYY-MM-DD.", -) -@click.option( - "--end-date", - default=None, - help="Denotes the end of the time period you'd like to get transactions for. " - "Defaults to end of current month. Required if start_date exists." - "Format: YYYY-MM-DD.", -) -@click.option( - "--tag-id", default=None, help="Filter by tag. Only accepts IDs, not names." -) -@click.option("--recurring-id", default=None, help="Filter by recurring expense") -@click.option("--plaid-account-id", default=None, help="Filter by Plaid account") -@click.option( - "--category-id", - default=None, - help="Filter by category. Will also match category groups.", -) -@click.option("--asset-id", default=None, help="Filter by asset") -@click.option( - "--group-id", - default=None, - help="Filter by group_id (if the transaction is part of a specific group)", -) -@click.option( - "--is-group", default=None, help="Filter by group (returns transaction groups)" -) -@click.option( - "--status", - default=None, - help="Filter by status (Can be cleared or uncleared. For recurring " - "transactions, use recurring)", -) -@click.option("--offset", default=None, help="Sets the offset for the records returned") -@click.option( - "--limit", - default=None, - help="Sets the maximum number of records to return. Note: The server will not " - "respond with any indication that there are more records to be returned. " - "Please check the response length to determine if you should make another " - "call with an offset to fetch more transactions.", -) -@click.option( - "--debit-as-negative", - default=None, - help="Pass in true if you’d like expenses to be returned as negative amounts and " - "credits as positive amounts. Defaults to false.", -) -@click.option( - "--pending", - is_flag=True, - default=None, - help="Pass in true if you’d like to include imported transactions with a pending status.", -) -@click.pass_obj -def lunchmoney_transactions( - context: LunchMoneyContext, **kwargs: Dict[str, Any] -) -> None: - """ - Retrieve Lunch Money Transactions - """ - lunch = LunchMoney(access_token=context.access_token) - transactions = lunch.get_transactions(**kwargs) # type: ignore[arg-type] - json_data = to_jsonable_python(transactions) - print_json(data=json_data) - - -@cli.command() -@click.argument("URL") -@click.option("-X", "--request", default="GET", help="Specify request command to use") -@click.option("-d", "--data", default=None, help="HTTP POST data") -@click.pass_obj -def http(context: LunchMoneyContext, url: str, request: str, data: str) -> None: - """ - Interact with the LunchMoney API - - lunchable http /v1/transactions - """ - lunch = LunchMoney(access_token=context.access_token) - if not url.startswith("http"): - url = url.lstrip("/") - url_request = f"https://dev.lunchmoney.app/{url}" - else: - url_request = url - resp = lunch.request( - method=request, - url=url_request, - content=data, - ) - try: - resp.raise_for_status() - except httpx.HTTPError: - logger.error(resp) - print(resp.text) - sys.exit(1) - try: - response = resp.json() - except JSONDecodeError: - response = resp.text - json_data = to_jsonable_python(response) - print_json(data=json_data) - - -discovered_plugins = entry_points(group="lunchable.cli") -with_plugins(discovered_plugins)(plugins) diff --git a/lunchable/_config/__init__.py b/lunchable/_config/__init__.py deleted file mode 100644 index 38dd2d76..00000000 --- a/lunchable/_config/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Lunch Money Config Namespaces and Helpers -""" - -from .api_config import APIConfig -from .file_config import FileConfig - -__all__ = ["APIConfig", "FileConfig"] diff --git a/lunchable/_config/api_config.py b/lunchable/_config/api_config.py deleted file mode 100644 index d1007acf..00000000 --- a/lunchable/_config/api_config.py +++ /dev/null @@ -1,165 +0,0 @@ -""" -API Configuration Helper -""" - -import logging -from os import getenv -from typing import Dict, List, Optional, Union -from urllib import parse - -from lunchable._version import __version__ -from lunchable.exceptions import EnvironmentVariableError, LunchMoneyError - -logger = logging.getLogger(__name__) - - -class APIConfig: - """ - Configuration Helper Class for Connecting to the Lunchmoney API - """ - - LUNCHMONEY_SCHEME: str = "https" - LUNCHMONEY_NETLOC: str = "dev.lunchmoney.app" - LUNCHMONEY_API_PATH: str = "v1" - - LUNCHMONEY_TRANSACTIONS: str = "transactions" - LUNCHMONEY_TRANSACTION_GROUPS: str = "group" - LUNCHMONEY_PLAID_ACCOUNTS: str = "plaid_accounts" - LUNCH_MONEY_RECURRING_EXPENSES: str = "recurring_expenses" - LUNCH_MONEY_RECURRING_ITEMS: str = "recurring_items" - LUNCHMONEY_BUDGET: str = "budgets" - LUNCHMONEY_ASSETS: str = "assets" - LUNCHMONEY_CATEGORIES: str = "categories" - LUNCHMONEY_TAGS: str = "tags" - LUNCHMONEY_CRYPTO: str = "crypto" - LUNCHMONEY_CRYPTO_MANUAL: str = "manual" - LUNCHMONEY_ME: str = "me" - - LUNCHMONEY_CONTENT_TYPE_HEADERS: Dict[str, str] = { - "Content-Type": "application/json" - } - - _access_token_environment_variable = "LUNCHMONEY_ACCESS_TOKEN" - - @staticmethod - def get_access_token(access_token: Optional[str] = None) -> str: - """ - Method for Resolving Access Tokens: Hardcoded -> .env File -> Env Var - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - - Returns - ------- - str - """ - if access_token is None: - logger.debug( - "Loading Lunch Money Developer API Access token from environment" - ) - access_token = getenv(APIConfig._access_token_environment_variable, None) - if access_token is None: - access_token_error_message = ( - "You must provide a Lunch Money Developer API Access Token directly or set your " - f"{APIConfig._access_token_environment_variable} environment variable." - ) - raise EnvironmentVariableError(access_token_error_message) - return access_token - - @staticmethod - def get_header(access_token: Optional[str] = None) -> Dict[str, str]: - """ - Get the header dict to pass to httpx - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - - Returns - ------- - Dict[str, str] - """ - access_token = APIConfig.get_access_token(access_token=access_token) - lunchable_header = { - "Authorization": f"Bearer {access_token}", - "User-Agent": f"lunchable/{__version__}", - } - lunchable_header.update(APIConfig.LUNCHMONEY_CONTENT_TYPE_HEADERS) - return lunchable_header - - @staticmethod - def make_url(url_path: Union[List[Union[str, int]], str, int]) -> str: - """ - Make a Lunch Money API URL using path parts - - Parameters - ---------- - url_path: Union[List[Union[str, int]], str, int] - API Components, if a list join these sequentially - - Returns - ------- - str - """ - if isinstance(url_path, str): - url_path = [url_path] - if not isinstance(url_path, List): - raise LunchMoneyError( - "You must provide a string or list of strings to construct a URL" - ) - path_set = [ - str(item).lower() - for item in url_path - if str(item).lower() != APIConfig.LUNCHMONEY_API_PATH - ] - url = APIConfig._generate_url( - scheme=APIConfig.LUNCHMONEY_SCHEME, - netloc=APIConfig.LUNCHMONEY_NETLOC, - path="/".join([APIConfig.LUNCHMONEY_API_PATH, *path_set]), - ) - return url - - @classmethod - def _generate_url( - cls, - scheme: str, - netloc: str, - path: str = "", - params: str = "", - query: str = "", - fragment: str = "", - ) -> str: - """ - Build a URL - - Parameters - ---------- - scheme: str - URL scheme specifier - netloc: str - Network location part - path: str - Hierarchical path - params: str - Parameters for last path element - query: str - Query component - fragment: str - Fragment identifier - Returns - ------- - url: str - Compiled URL - """ - url_components = { - "scheme": scheme, - "netloc": netloc, - "path": path, - "params": params, - "query": query, - "fragment": fragment, - } - return parse.urlunparse(components=tuple(url_components.values())) diff --git a/lunchable/_config/file_config.py b/lunchable/_config/file_config.py deleted file mode 100644 index 1f1e4067..00000000 --- a/lunchable/_config/file_config.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -File Path Helper -""" - -from pathlib import Path - - -class FileConfig: - """ - Configuration Namespace for File Paths - """ - - HOME_DIR = Path.home() - _file_config_module = Path(__file__).resolve() - CONFIG_DIR = _file_config_module.parent - LUNCHMONEY_DIR = CONFIG_DIR.parent - PROJECT_DIR = LUNCHMONEY_DIR.parent - DATA_DIR = LUNCHMONEY_DIR.joinpath("data") diff --git a/lunchable/_config/logging_config.py b/lunchable/_config/logging_config.py deleted file mode 100644 index 853e903c..00000000 --- a/lunchable/_config/logging_config.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Dynamic Logging Configuration -""" - -import logging -from os import getenv -from typing import Optional, Tuple, Union - -import click -from rich.console import Console -from rich.logging import RichHandler - -LOG_HANDLER = getenv("LOG_HANDLER", "rich").lower() - - -def get_log_handler( - log_level: Optional[int] = None, -) -> Tuple[logging.Handler, Union[int, str]]: - """ - Determine which logging handler should be used - - Parameters - ---------- - log_level: Optional[int] - Which logging level should be used. If none is provided the LOG_LEVEL environment - variable will be used, defaulting to "INFO". - - Returns - ------- - Tuple[logging.Handler, Union[int, str]] - """ - if log_level is None: - log_level = logging.getLevelName(getenv("LOG_LEVEL", "INFO").upper()) - rich_handler = RichHandler( - level=log_level, - rich_tracebacks=True, - omit_repeated_times=False, - show_path=False, - tracebacks_suppress=[click], - console=Console(stderr=True), - ) - httpx_logger = logging.getLogger("httpx") - if log_level != logging.DEBUG: - httpx_logger.setLevel(logging.WARNING) - python_handler = logging.StreamHandler() - python_formatter = logging.Formatter("%(asctime)s [%(levelname)8s]: %(message)s") - python_handler.setFormatter(python_formatter) - python_handler.setLevel(log_level) - _log_dict = { - "rich": rich_handler, - "python": python_handler, - } - if getenv("PYTEST_CURRENT_TEST", None) is not None: - handler = "python" - else: - handler = LOG_HANDLER - log_handler: logging.Handler = _log_dict.get(handler, rich_handler) - return log_handler, log_level - - -def set_up_logging(log_level: Optional[int] = None) -> None: - """ - Set Up a Root Logger - - Parameters - ---------- - log_level: Optional[int] - Which logging level should be used. If none is provided the LOG_LEVEL environment - variable will be used, defaulting to "INFO". - """ - log_handler, level_to_log = get_log_handler(log_level=log_level) - logging.root.handlers = [log_handler] - if isinstance(log_handler, RichHandler): - rich_formatter = logging.Formatter( - datefmt="[%Y-%m-%d %H:%M:%S]", fmt="%(message)s" - ) - logging.root.handlers[0].setFormatter(rich_formatter) - level_to_log = logging.NOTSET - logging.root.setLevel(level_to_log) diff --git a/lunchable/_version.py b/lunchable/_version.py deleted file mode 100644 index 96dc412e..00000000 --- a/lunchable/_version.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -lunchable Version file -""" - -__author__ = "Justin Flannery" -__email__ = "juftin@juftin.com" -__application__ = "lunchable" -__version__ = "1.4.1" diff --git a/lunchable/exceptions.py b/lunchable/exceptions.py deleted file mode 100644 index 6e360b80..00000000 --- a/lunchable/exceptions.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Lunchmoney Exceptions -""" - -from httpx import HTTPError - - -class LunchMoneyError(Exception): - """ - Base Exception for Lunch Money - """ - - -class EnvironmentVariableError(LunchMoneyError, EnvironmentError): - """ - Lunch Money Missing Environment Variable Error - """ - - -class LunchMoneyHTTPError(LunchMoneyError, HTTPError): - """ - Lunch Money HTTP Error - """ - - -class LunchMoneyImportError(LunchMoneyError, ImportError): - """ - Lunch Money Import Error - """ diff --git a/lunchable/models/__init__.py b/lunchable/models/__init__.py deleted file mode 100644 index 94111ad6..00000000 --- a/lunchable/models/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Lunch Money Python SDK and Associated Objects -""" - -from ._base import LunchableModel -from .assets import AssetsObject -from .budgets import BudgetObject -from .categories import CategoriesObject -from .crypto import CryptoObject -from .plaid_accounts import PlaidAccountObject -from .recurring_expenses import RecurringExpensesObject -from .tags import TagsObject -from .transactions import ( - TransactionBaseObject, - TransactionInsertObject, - TransactionObject, - TransactionSplitObject, - TransactionUpdateObject, -) -from .user import UserObject - -__all__ = [ - "AssetsObject", - "BudgetObject", - "CategoriesObject", - "CryptoObject", - "PlaidAccountObject", - "RecurringExpensesObject", - "TagsObject", - "TransactionBaseObject", - "TransactionObject", - "TransactionUpdateObject", - "TransactionInsertObject", - "TransactionSplitObject", - "UserObject", - "LunchableModel", -] diff --git a/lunchable/models/_base.py b/lunchable/models/_base.py deleted file mode 100644 index 07c6fef7..00000000 --- a/lunchable/models/_base.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Base Pydantic Object for Containers -""" - -from pydantic import BaseModel, ConfigDict - - -class LunchableModel(BaseModel): - """ - Hashable Pydantic Model - """ - - model_config = ConfigDict(extra="allow") - - def __hash__(self) -> int: - """ - Hash Method for Pydantic BaseModels - """ - return hash((type(self), *tuple(self.__dict__.values()))) diff --git a/lunchable/models/_core.py b/lunchable/models/_core.py deleted file mode 100644 index 2f1927c6..00000000 --- a/lunchable/models/_core.py +++ /dev/null @@ -1,373 +0,0 @@ -""" -Lunchmoney SDK Core -""" - -from __future__ import annotations - -from functools import cached_property -from typing import ( - Any, - AsyncIterable, - Iterable, - Mapping, - Optional, - Union, -) - -import httpx -import pydantic_core -from httpx import Client - -from lunchable._config import APIConfig -from lunchable.exceptions import LunchMoneyHTTPError - - -class LunchMoneyClient(Client): - """ - API HTTP Client - """ - - def __init__(self, access_token: str | None = None) -> None: - timeout = httpx.Timeout(connect=5, read=30, write=20, pool=5) - super().__init__(timeout=timeout) - api_headers = APIConfig.get_header(access_token=access_token) - self.headers.update(api_headers) - - -class LunchMoneyAsyncClient(httpx.AsyncClient): - """ - API Async HTTP Client - """ - - def __init__(self, access_token: str | None = None) -> None: - timeout = httpx.Timeout(connect=5, read=30, write=20, pool=5) - super().__init__(timeout=timeout) - api_headers = APIConfig.get_header(access_token=access_token) - self.headers.update(api_headers) - - -class LunchMoneyAPIClient: - """ - Core API Client Class - """ - - class Methods: - """ - HTTP Request Method Enumerations: GET, OPTIONS, HEAD, POST, PUT, PATCH, or DELETE - """ - - # This Helper Namespace Organizes and Tracks HTTP Requests by Method - GET = "GET" - OPTIONS = "OPTIONS" - HEAD = "HEAD" - POST = "POST" - PUT = "PUT" - PATCH = "PATCH" - DELETE = "DELETE" - - def __init__(self, access_token: str | None = None) -> None: - """ - Initialize a Lunch Money object with an Access Token. - - Tries to inherit from the Environment if one isn't provided - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - """ - self.access_token = APIConfig.get_access_token(access_token=access_token) - - def __repr__(self) -> str: - """ - String Representation - - Returns - ------- - str - """ - return "" - - @cached_property - def session(self) -> httpx.Client: - """ - Lunch Money HTTPX Client - - Returns - ------- - httpx.Client - """ - return LunchMoneyClient(access_token=self.access_token) - - @cached_property - def async_session(self) -> httpx.AsyncClient: - """ - Lunch Money HTTPX Async Client - - Returns - ------- - httpx.AsyncClient - """ - return LunchMoneyAsyncClient(access_token=self.access_token) - - def request( - self, - method: str, - url: Union[httpx.URL, str], - *, - content: Optional[ - Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] - ] = None, - data: Optional[Mapping[str, Any]] = None, - json: Optional[Any] = None, - params: Optional[Mapping[str, Any]] = None, - **kwargs: Any, - ) -> httpx.Response: - """ - Make an HTTP request - - This is a simple method :class:`.LunchMoney` exposes to make HTTP requests. It - has the benefit of using an existing `httpx.Client` as well as as out of the box - auth headers that are used to connect to the Lunch Money Developer API. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url: Union[httpx.URL, str] - URL for the new Request object. - content: Optional[Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]]] - Content to send in the body of the Request. - data: Optional[Mapping[str, Any]] - Dictionary, list of tuples, bytes, or file-like object to send - in the body of the Request. - json: Optional[Any] - A JSON serializable Python object to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - httpx.Response - - Examples - -------- - A recent use of this method was to delete a Tag (which isn't available via the - Developer API yet) - - ```python - import lunchable - - lunch = lunchable.LunchMoney() - - # Get All the Tags - all_tags = lunch.get_tags() - # Get All The Null Tags (a list of 1 or zero) - null_tags = [tag for tag in all_tags if tag.name in [None, ""]] - - # Create a Cookie dictionary from a browser session - cookies = {"cookie_keys": "cookie_values"} - del lunch.session.headers["authorization"] - - for null_tag in null_tags: - # use the httpx.client embedded in the class to make a request with cookies - response = lunch.request( - method=lunch.Methods.DELETE, - url=f"https://api.lunchmoney.app/tags/{null_tag.id}", - cookies=cookies - ) - # raise an error for 4XX responses - response.raise_for_status() - ``` - """ - response = self.session.request( - method=method, - url=url, - content=content, - data=data, - json=json, - params=params, - **kwargs, - ) - return response - - async def arequest( - self, - method: str, - url: Union[httpx.URL, str], - *, - content: Optional[ - Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] - ] = None, - data: Optional[Mapping[str, Any]] = None, - json: Optional[Any] = None, - params: Optional[Mapping[str, Any]] = None, - **kwargs: Any, - ) -> httpx.Response: - """ - Make an async HTTP request - - This is a simple method :class:`.LunchMoney` exposes to make HTTP requests. It - has the benefit of using an existing `httpx.Client` as well as as out of the box - auth headers that are used to connect to the Lunch Money Developer API. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url: Union[httpx.URL, str] - URL for the new Request object. - content: Optional[Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]]] - Content to send in the body of the Request. - data: Optional[Mapping[str, Any]] - Dictionary, list of tuples, bytes, or file-like object to send - in the body of the Request. - json: Optional[Any] - A JSON serializable Python object to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - httpx.Response - """ - response = self.async_session.request( - method=method, - url=url, - content=content, - data=data, - json=json, - params=params, - **kwargs, - ) - return await response - - @classmethod - def process_response(cls, response: httpx.Response) -> Any: - """ - Process a Lunch Money response and raise any errors - - This includes 200 responses that are actually errors - - Parameters - ---------- - response: httpx.Response - An HTTPX Response Object - """ - try: - response.raise_for_status() - except httpx.HTTPError as he: - raise LunchMoneyHTTPError(response.text) from he - if response.content: - returned_data = response.json() - else: - returned_data = None - if isinstance(returned_data, dict) and any( - ["error" in returned_data.keys(), "errors" in returned_data.keys()] - ): - try: - errors = returned_data["error"] - except KeyError: - errors = returned_data["errors"] - raise LunchMoneyHTTPError(errors) - return returned_data - - def make_request( - self, - method: str, - url_path: Union[list[Union[str, int]], str, int], - params: Optional[Mapping[str, Any]] = None, - payload: Optional[Any] = None, - **kwargs: Any, - ) -> Any: - """ - Make an HTTP request and `process` its response - - This method is a wrapper around :meth:`.LunchMoney.request` that - also processes the response and checks for any errors. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url_path: Union[List[Union[str, int]], str, int] - URL components to make into a URL - payload: Optional[Mapping[str, Any]] - Data to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - Any - """ - url = APIConfig.make_url(url_path=url_path) - json_safe_payload = pydantic_core.to_json(payload) if payload else None - json_safe_params = pydantic_core.to_jsonable_python(params) - response = self.request( - method=method, - url=url, - params=json_safe_params, - content=json_safe_payload, - **kwargs, - ) - data = self.process_response(response=response) - return data - - async def amake_request( - self, - method: str, - url_path: Union[list[Union[str, int]], str, int], - params: Optional[Mapping[str, Any]] = None, - payload: Optional[Any] = None, - **kwargs: Any, - ) -> Any: - """ - Make an async HTTP request and `process` its response - - This method is a wrapper around :meth:`.LunchMoney.arequest` that - also processes the response and checks for any errors. - - Parameters - ---------- - method: str - requests method: GET, OPTIONS, HEAD, POST, PUT, - PATCH, or DELETE - url_path: Union[List[Union[str, int]], str, int] - URL components to make into a URL - payload: Optional[Mapping[str, Any]] - Data to send in the body of the Request. - params: Optional[Mapping[str, Any]] - Dictionary, list of tuples or bytes to send in the query - string for the Request. - **kwargs: Any - Additional arguments to send to the request method. - - Returns - ------- - Any - """ - url = APIConfig.make_url(url_path=url_path) - json_safe_payload = pydantic_core.to_jsonable_python(payload) - json_safe_params = pydantic_core.to_jsonable_python(params) - response = await self.arequest( - method=method, - url=url, - params=json_safe_params, - data=json_safe_payload, - **kwargs, - ) - data = self.process_response(response=response) - return data diff --git a/lunchable/models/_descriptions.py b/lunchable/models/_descriptions.py deleted file mode 100644 index 836da2e7..00000000 --- a/lunchable/models/_descriptions.py +++ /dev/null @@ -1,719 +0,0 @@ -""" -Descriptions for LunchMoney Data Models - -This file contains descriptions for the data models used in the LunchMoney API. -Descriptions are seperated into a separate module to keep the code clean and -readable. -""" - - -class _AssetsDescriptions: - """ - Descriptions for Assets - """ - - type_name = """ - Primary type of the asset. Must be one of: [employee compensation, cash, vehicle, loan, - cryptocurrency, investment, other, credit, real estate] - """ - subtype_name = """ - Optional asset subtype. Examples include: [retirement, checking, savings, prepaid credit card] - """ - balance = """ - Current balance of the asset in numeric format to 4 decimal places" - """ - balance_as_of = """ - Date/time the balance was last updated in ISO 8601 extended format - """ - closed_on = """ - The date this asset was closed (optional) - """ - currency = """ - Three-letter lowercase currency code of the balance in ISO 4217 format - """ - created_at = """ - Date/time the asset was created in ISO 8601 extended format - """ - exclude_transactions = """ - If true, this asset will not show up as an option for assignment when - creating transactions manually - """ - - -class _BudgetDescriptions: - """ - Descriptions for Budget - """ - - category_group_name = "Name of the category group, if applicable" - is_income = """ - If true, this category is an income category (category properties - are set in the app via the Categories page) - """ - exclude_from_budget = """ - If true, this category is excluded from budget (category - properties are set in the app via the Categories page) - """ - exclude_from_totals = """ - If true, this category is excluded from totals (category - properties are set in the app via the Categories page) - """ - data = """ - For each month with budget or category spending data, there is a data object with the key - set to the month in format YYYY-MM-DD. For properties, see Data object below. - """ - config = """ - Object representing the category's budget suggestion configuration - """ - - -class _CategoriesDescriptions: - """ - Descriptions for Categories - """ - - name = """ - The name of the category. Must be between 1 and 40 characters. - """ - description = """ - The description of the category. Must not exceed 140 characters. - """ - is_income = """ - If true, the transactions in this category will be treated as income. - """ - exclude_from_budget = """ - If true, the transactions in this category will be excluded from the budget. - """ - exclude_from_totals = """ - If true, the transactions in this category will be excluded from totals. - """ - updated_at = """ - The date and time of when the category was last updated (in the ISO - 8601 extended format). - """ - created_at = """ - The date and time of when the category was created (in the ISO 8601 - extended format). - """ - is_group = """ - If true, the category is a group that can be a parent to other - categories. - """ - group_id = """ - The ID of a category group (or null if the category doesn't belong to - a category group). - """ - children = """ - For category groups, this will populate with the categories nested - within and include id, name, description and created_at fields. - """ - archived = """ - If true, the category is archived and not displayed in relevant - areas of the Lunch Money app. - """ - archived_on = """ - The date and time of when the category was last archived - (in the ISO 8601 extended format). - """ - order = """ - Numerical ordering of categories - """ - - -class _CryptoDescriptions: - """ - Descriptions for Crypto - """ - - id = """ - Unique identifier for a manual crypto account (no ID for synced accounts) - """ - zabo_account_id = """ - Unique identifier for a synced crypto account (no ID for manual accounts, - multiple currencies may have the same zabo_account_id) - """ - source = """ - `synced` (this account is synced via a wallet, exchange, etc.) or `manual` (this account - balance is managed manually) - """ - display_name = "Display name of the crypto asset (as set by user)" - balance_as_of = """ - Date/time the balance was last updated in ISO 8601 extended format - """ - status = """ - The current status of the crypto account. Either active or in error. - """ - created_at = """ - Date/time the asset was created in ISO 8601 extended format - """ - - -class _PlaidAccountDescriptions: - """ - Descriptions for Plaid Accounts - """ - - date_linked = """ - Date account was first linked in ISO 8601 extended format - """ - name = """ - Name of the account. Can be overridden by the user. Field is originally set by Plaid - """ - type = """ - Primary type of account. Typically one of: [credit, depository, brokerage, cash, - loan, investment]. This field is set by Plaid and cannot be altered. - """ - subtype = """ - Optional subtype name of account. This field is set by Plaid and cannot be altered - """ - mask = """ - Mask (last 3 to 4 digits of account) of account. This field is set by - Plaid and cannot be altered - """ - institution_name = """ - Name of institution associated with account. This field is set by - Plaid and cannot be altered - """ - status = """ - Denotes the current status of the account within Lunch Money. Must be one of: - active (Account is active and in good state), - inactive (Account marked inactive from user. No transactions fetched or - balance update for this account), - relink (Account needs to be relinked with Plaid), - syncing (Account is awaiting first import of transactions), - error (Account is in error with Plaid), - not found (Account is in error with Plaid), - not supported (Account is in error with Plaid) - """ - last_import = """ - Date of last imported transaction in ISO 8601 extended format (not necessarily - date of last attempted import) - """ - balance = """ - Current balance of the account in numeric format to 4 decimal places. This field is - set by Plaid and cannot be altered - """ - currency = """ - Currency of account balance in ISO 4217 format. This field is set by Plaid - and cannot be altered - """ - balance_last_update = """ - Date balance was last updated in ISO 8601 extended format. This field is set - by Plaid and cannot be altered - """ - limit = """ - Optional credit limit of the account. This field is set by Plaid and cannot be altered - """ - - -class _RecurringExpensesDescriptions: - """ - Descriptions for Recurring Expenses - """ - - id = """ - Unique identifier for recurring expense - """ - start_date = """ - Denotes when recurring expense starts occurring in ISO 8601 format. - If null, then this recurring expense will show up for all time - before end_date - """ - end_date = """ - Denotes when recurring expense stops occurring in ISO 8601 format. - If null, then this recurring expense has no set end date and will - show up for all months after start_date - """ - cadence = """ - One of: [monthly, twice a month, once a week, every 3 months, every 4 months, - twice a year, yearly] - """ - amount = """ - Amount of the recurring expense in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code for the recurring expense in ISO 4217 format - """ - description = """ - If any, represents the user-entered description of the recurring expense - """ - billing_date = """ - Expected billing date for this recurring expense for this month in ISO 8601 format - """ - type = """ - This can be one of two values: cleared (The recurring expense has been reviewed - by the user), suggested (The recurring expense is suggested by the system; - the user has yet to review/clear it) - """ - original_name = """ - If any, represents the original name of the recurring expense as - denoted by the transaction that triggered its creation - """ - source = """ - This can be one of three values: manual (User created this recurring expense - manually from the Recurring Expenses page), transaction (User created this by - converting a transaction from the Transactions page), system (Recurring expense - was created by the system on transaction import). Some older recurring expenses - may not have a source. - """ - plaid_account_id = """ - If any, denotes the plaid account associated with the creation of this " - recurring expense (see Plaid Accounts) - """ - asset_id = """ - If any, denotes the manually-managed account (i.e. asset) associated with the - creation of this recurring expense (see Assets) - """ - transaction_id = """ - If any, denotes the unique identifier for the associated transaction matching - this recurring expense for the current time period - """ - category_id = """ - If any, denotes the unique identifier for the associated category to this recurring expense - """ - - -class _SummarizedTransactionDescriptions: - """ - Descriptions for Summarized Transaction - """ - - id = """ - Unique identifier for the transaction that matched this recurring item - """ - date = """ - Date of transaction in ISO 8601 format - """ - amount = """ - Amount of the transaction in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code of the transaction in ISO 4217 format - """ - payee = """ - Payee or payer of the recurring item - """ - category_id = """ - Unique identifier of associated category - """ - recurring_id = """ - Unique identifier of associated recurring item - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency - feature is not being used, to_base and amount will be the same. - """ - - -class _RecurringItemsDescriptions: - """ - Descriptions for Recurring Items - """ - - id = """ - Unique identifier for recurring item - """ - start_date = """ - Denotes when recurring item starts occurring in ISO 8601 format. - If null, then this recurring item will show up for all time before end_date - """ - end_date = """ - Denotes when recurring item stops occurring in ISO 8601 format. - If null, then this recurring item has no set end date and will - show up for all months after start_date - """ - payee = """ - Payee or payer of the recurring item - """ - currency = """ - Three-letter lowercase currency code for the recurring item in ISO 4217 format - """ - created_by = """ - The id of the user who created this recurring item. - """ - created_at = """ - The date and time of when the recurring item was created (in the ISO 8601 - extended format). - """ - updated_at = """ - The date and time of when the recurring item was updated (in the ISO 8601 extended format). - """ - billing_date = """ - Initial date that a transaction associated with this recurring item occured. - This date is used in conjunction with values of quantity and granularity to - determine the expected dates of recurring transactions in the period. - """ - original_name = """ - If any, represents the original name of the recurring item as denoted by - the transaction that triggered its creation - """ - description = """ - If any, represents the user-entered description of the recurring item - """ - plaid_account_id = """ - If any, denotes the plaid account associated with the creation of this - recurring item (see Plaid Accounts) - """ - asset_id = """ - If any, denotes the manually-managed account (i.e. asset) associated - with the creation of this recurring item (see Assets) - """ - source = """ - This can be one of four values: - - manual: User created this recurring item manually from the Recurring Items page - - transaction: User created this by converting a transaction from the Transactions page - - system: Recurring item was created by the system on transaction import - - null: Some older recurring items may not have a source. - """ - notes = """ - If any, the user-entered notes for the recurring item - """ - amount = """ - Amount of the recurring item in numeric format to 4 decimal places. - For recurring items with flexible amounts, this is the average of the - specified min and max amounts. - """ - category_id = """ - If any, denotes the unique identifier for the associated category to this recurring item - """ - category_group_id = """ - If any, denotes the unique identifier of associated category group - """ - is_income = """ - Based on the associated category's property, denotes if the recurring transaction - is treated as income - """ - exclude_from_totals = """ - Based on the associated category's property, denotes if the recurring transaction is excluded from totals - """ - granularity = """ - The unit of time used to define the cadence of the recurring item. - One of `weeks`, `months`, `years` - """ - quantity = """ - The number of granular units between each occurrence - """ - occurrences = """ - An object which contains dates as keys and lists as values. The dates will - include all the dates in the month that a recurring item is expected, as well - as the last date in the previous period and the first date in the next period. - The value for each key is a list of Summarized Transaction Objects that matched - the recurring item for that date (if any) - """ - transactions_within_range = """ - A list of all the Summarized Transaction Objects for transactions that that - have occurred in the query month for the recurring item (if any) - """ - missing_dates_within_range = """ - A list of date strings when a recurring transaction is expected but has not (yet) occurred. - """ - date = """ - Denotes the value of the start_date query parameter, or if none was provided, the date when - the request was made. This indicates the month used by the system when populating the response. - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency feature is not being - used, to_base and amount will be the same. - """ - - -class _TransactionInsertDescriptions: - """ - Descriptions for TransactionInsertObject - """ - - date = """ - Must be in ISO 8601 format (YYYY-MM-DD). - """ - amount = """ - Numeric value of amount. i.e. $4.25 should be denoted as 4.25. - """ - category_id = """ - Unique identifier for associated category_id. Category must be associated with - the same account and must not be a category group. - """ - currency = """ - Three-letter lowercase currency code in ISO 4217 format. The code sent must exist - in our database. Defaults to user account's primary currency. - """ - asset_id = """ - Unique identifier for associated asset (manually-managed account). Asset must be - associated with the same account. - """ - recurring_id = """ - Unique identifier for associated recurring expense. Recurring expense must be associated - with the same account. - """ - status = """ - Must be either cleared or uncleared. If recurring_id is provided, the status will - automatically be set to recurring or recurring_suggested depending on the type of - recurring_id. Defaults to uncleared. - """ - external_id = """ - User-defined external ID for transaction. Max 75 characters. External IDs must be - unique within the same asset_id. - """ - tags = """ - Passing in a number will attempt to match by ID. If no matching tag ID is found, an error - will be thrown. Passing in a string will attempt to match by string. If no matching tag - name is found, a new tag will be created. - """ - - -class _TransactionUpdateDescriptions: - """ - Descriptions for TransactionUpdateObject - """ - - date = """ - Must be in ISO 8601 format (YYYY-MM-DD). - """ - category_id = """ - Unique identifier for associated category_id. Category must be associated - with the same account and must not be a category group. - """ - amount = """ - You may only update this if this transaction was not created from an automatic - import, i.e. if this transaction is not associated with a plaid_account_id - """ - currency = """ - You may only update this if this transaction was not created from an automatic - import, i.e. if this transaction is not associated with a plaid_account_id. - Defaults to user account's primary currency. - """ - asset_id = """ - Unique identifier for associated asset (manually-managed account). Asset must be - associated with the same account. You may only update this if this transaction was - not created from an automatic import, i.e. if this transaction is not associated - with a plaid_account_id - """ - recurring_id = """ - Unique identifier for associated recurring expense. Recurring expense must - be associated with the same account. - """ - status = """ - Must be either cleared or uncleared. Defaults to uncleared If recurring_id is - provided, the status will automatically be set to recurring or recurring_suggested - depending on the type of recurring_id. Defaults to uncleared. - """ - external_id = """ - User-defined external ID for transaction. Max 75 characters. External IDs must be - unique within the same asset_id. You may only update this if this transaction was - not created from an automatic import, i.e. if this transaction is not associated - with a plaid_account_id - """ - tags = """ - Passing in a number will attempt to match by ID. If no matching tag ID is found, - an error will be thrown. Passing in a string will attempt to match by string. - If no matching tag name is found, a new tag will be created. - """ - - -class _TransactionSplitDescriptions: - """ - Descriptions for TransactionSplitObject - """ - - date = "Must be in ISO 8601 format (YYYY-MM-DD)." - category_id = """ - Unique identifier for associated category_id. Category must be associated - with the same account. - """ - notes = "Transaction Split Notes." - amount = """ - Individual amount of split. Currency will inherit from parent transaction. All - amounts must sum up to parent transaction amount. - """ - - -class _TransactionDescriptions: - """ - Descriptions for TransactionObject - """ - - id = """ - Unique identifier for transaction - """ - date = """ - Date of transaction in ISO 8601 format - """ - payee = """ - Name of payee. If recurring_id is not null, this field will show the payee - of associated recurring expense instead of the original transaction payee - """ - amount = """ - Amount of the transaction in numeric format to 4 decimal places - """ - currency = """ - Three-letter lowercase currency code of the transaction in ISO 4217 format - """ - to_base = """ - The amount converted to the user's primary currency. If the multicurrency - feature is not being used, to_base and amount will be the same. - """ - category_id = """ - Unique identifier of associated category - """ - category_name = """ - Name of category associated with transaction - """ - category_group_id = """ - Unique identifier of associated category group, if any - """ - category_group_name = """ - Name of category group associated with transaction, if any - """ - is_income = """ - Based on the associated category's property, denotes if transaction is - treated as income - """ - exclude_from_budget = """ - Based on the associated category's property, denotes if transaction is - excluded from budget - """ - exclude_from_totals = """ - Based on the associated category's property, denotes if transaction is - excluded from totals - """ - created_at = """ - The date and time of when the transaction was created (in the ISO 8601 - extended format). - """ - updated_at = """ - The date and time of when the transaction was last updated (in the ISO 8601 - extended format). - """ - status = """ - One of the following: - User intervention is required to change this to recurring. - """ - is_pending = """ - Denotes if transaction is pending (not posted) - """ - notes = """ - User-entered transaction notes If recurring_id is not null, this field will - be description of associated recurring expense - """ - original_name = """ - The transactions original name before any payee name updates. For synced - transactions, this is the raw original payee name from your bank. - """ - recurring_id = """ - Unique identifier of associated recurring item - """ - recurring_payee = """ - Payee name of associated recurring item - """ - recurring_description = """ - Description of associated recurring item - """ - recurring_cadence = """ - Cadence of associated recurring item (one of `once a week`, `every 2 weeks`, - `twice a month`, `monthly`, `every 2 months`, `every 3 months`, `every 4 months`, - `twice a year`, `yearly`) - """ - recurring_type = """ - Type of associated recurring (one of `cleared`, `suggested`, `dismissed`) - """ - recurring_amount = """ - Amount of associated recurring item - """ - recurring_currency = """ - Currency of associated recurring item - """ - parent_id = """ - Exists if this is a split transaction. Denotes the transaction ID of the - original transaction. Note that the parent transaction is not returned in - this call. - """ - has_children = """ - True if this transaction is a parent transaction and is split into 2 or - more other transactions - """ - group_id = """ - Exists if this transaction is part of a group. Denotes the parent’s - transaction ID - """ - is_group = """ - True if this transaction represents a group of transactions. If so, amount - and currency represent the totalled amount of transactions bearing this - transaction’s id as their group_id. Amount is calculated based on the - user’s primary currency. - """ - asset_id = """ - Unique identifier of associated manually-managed account (see Assets) - Note: plaid_account_id and asset_id cannot both exist for a transaction - """ - asset_institution_name = """ - Institution name of associated manually-managed account - """ - asset_name = """ - Name of associated manually-managed account - """ - asset_display_name = """ - Display name of associated manually-managed account - """ - asset_status = """ - Status of associated manually-managed account (one of `active`, `closed`) - """ - plaid_account_id = """ - Unique identifier of associated Plaid account (see Plaid Accounts) Note: - plaid_account_id and asset_id cannot both exist for a transaction - """ - plaid_account_name = """ - Name of associated Plaid account - """ - plaid_account_mask = """ - Mask of associated Plaid account - """ - institution_name = """ - Institution name of associated Plaid account - """ - plaid_account_display_name = """ - Display name of associated Plaid account - """ - plaid_metadata = """ - Metadata associated with imported transaction from Plaid - """ - source = """ - Source of the transaction (one of `api`, `csv`, `manual`,`merge`,`plaid`, - `recurring`,`rule`,`user`) - """ - display_name = """ - Display name for payee for transaction based on whether or not it is - linked to a recurring item. If linked, returns `recurring_payee` field. - Otherwise, returns the `payee` field. - """ - display_notes = """ - Display notes for transaction based on whether or not it is linked to a - recurring item. If linked, returns `recurring_notes` field. Otherwise, - returns the `notes` field. - """ - account_display_name = """ - Display name for associated account (manual or Plaid). If this is a synced - account, returns `plaid_account_display_name` or `asset_display_name`. - """ - tags = """ - Array of Tag objects - """ - external_id = """ - User-defined external ID for any manually-entered or imported transaction. - External ID cannot be accessed or changed for Plaid-imported transactions. - External ID must be unique by asset_id. Max 75 characters. - """ - children = """ - Array of Transaction objects. Only exists if this transaction is a parent - transaction and is split into 2 or more other transactions. Child transactions - do not contain all of the same fields as parent transactions. - """ - formatted_date = """ - Date of transaction in user's preferred format - """ diff --git a/lunchable/models/_lunchmoney.py b/lunchable/models/_lunchmoney.py deleted file mode 100644 index 5e24deb5..00000000 --- a/lunchable/models/_lunchmoney.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Lunch Money Python Client - -This Module Leverages Class Inheritance to distribute API Methods Across a series of -clients. Ultimately, everything inherits from the -lunchable.models.core.LunchMoneyAPIClient class which facilitates interacting with -the API. - -For example: to see source code on interactions with the "transactions" API endpoint you -will refer to the TransactionsClient object. -""" - -from typing import Optional - -from .assets import AssetsClient -from .budgets import BudgetsClient -from .categories import CategoriesClient -from .crypto import CryptoClient -from .plaid_accounts import PlaidAccountsClient -from .recurring_expenses import RecurringExpensesClient -from .recurring_items import RecurringItemsClient -from .tags import TagsClient -from .transactions import TransactionsClient -from .user import UserClient - - -class LunchMoney( - AssetsClient, - BudgetsClient, - CategoriesClient, - CryptoClient, - PlaidAccountsClient, - RecurringExpensesClient, - TagsClient, - TransactionsClient, - UserClient, - RecurringItemsClient, -): - """ - Lunch Money Python Client. - - This class facilitates with connections to - the [Lunch Money Developer API](https://lunchmoney.dev/). Authenticate - with an Access Token. If an access token isn't provided one will attempt to - be inherited from a `LUNCHMONEY_ACCESS_TOKEN` environment variable. - - Examples - -------- - ```python - from typing import List - - from lunchable import LunchMoney - from lunchable.models import TransactionObject - - lunch = LunchMoney(access_token="xxxxxxx") - transactions: List[TransactionObject] = lunch.get_transactions() - ``` - """ - - def __init__(self, access_token: Optional[str] = None): - """ - Initialize a Lunch Money object with an Access Token. - - Tries to inherit from the Environment if one isn't provided - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token - """ - super(LunchMoney, self).__init__(access_token=access_token) diff --git a/lunchable/models/assets.py b/lunchable/models/assets.py deleted file mode 100644 index 2c6830eb..00000000 --- a/lunchable/models/assets.py +++ /dev/null @@ -1,251 +0,0 @@ -""" -Lunch Money - Assets - -https://lunchmoney.dev/#assets -""" - -import datetime -import logging -from typing import List, Optional, Union - -from pydantic import Field, field_validator - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _AssetsDescriptions - -logger = logging.getLogger(__name__) - - -class AssetsObject(LunchableModel): - """ - Manually Managed Asset Objects - - Assets in Lunch Money are similar to `plaid-accounts` except that they are manually managed. - - https://lunchmoney.dev/#assets-object - """ - - id: int = Field(description="Unique identifier for asset") - type_name: str = Field(description=_AssetsDescriptions.type_name) - subtype_name: Optional[str] = Field( - None, description=_AssetsDescriptions.subtype_name - ) - name: str = Field(description="Name of the asset") - display_name: Optional[str] = Field( - None, description="Display name of the asset (as set by user)" - ) - balance: float = Field(description=_AssetsDescriptions.balance) - balance_as_of: Optional[datetime.datetime] = Field( - None, description=_AssetsDescriptions.balance_as_of - ) - closed_on: Optional[datetime.date] = Field( - None, description=_AssetsDescriptions.closed_on - ) - currency: str = Field(description=_AssetsDescriptions.currency) - institution_name: Optional[str] = Field( - None, description="Name of institution holding the asset" - ) - exclude_transactions: bool = Field( - default=False, description=_AssetsDescriptions.exclude_transactions - ) - created_at: datetime.datetime = Field(description=_AssetsDescriptions.created_at) - - -class _AssetsParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-asset - """ - - type_name: Optional[str] = None - subtype_name: Optional[str] = None - name: Optional[str] = None - balance: Optional[float] = None - balance_as_of: Optional[datetime.datetime] = None - currency: Optional[str] = None - institution_name: Optional[str] = None - - @field_validator("balance", mode="before") - @classmethod - def result_check(cls, x: Union[float, int]) -> float: - """ - Check a result - """ - return round(x, 2) - - -class _AssetsParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-asset - """ - - type_name: str - subtype_name: Optional[str] = None - name: str - display_name: Optional[str] = None - balance: float - balance_as_of: Optional[datetime.datetime] = None - currency: Optional[str] = None - institution_name: Optional[str] = None - closed_on: Optional[datetime.date] = None - exclude_transactions: Optional[bool] = None - - @field_validator("balance", mode="before") - @classmethod - def result_check(cls, x: Union[float, int]) -> float: - """ - Check a result - """ - return round(x, 2) - - -class AssetsClient(LunchMoneyAPIClient): - """ - Lunch Money Assets Interactions - """ - - def get_assets(self) -> List[AssetsObject]: - """ - Get Manually Managed Assets - - Get a list of all manually-managed assets associated with the user's account. - - (https://lunchmoney.dev/#assets-object) - - Returns - ------- - List[AssetsObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=[APIConfig.LUNCHMONEY_ASSETS] - ) - assets = response_data.get(APIConfig.LUNCHMONEY_ASSETS) - asset_objects = [AssetsObject.model_validate(item) for item in assets] - return asset_objects - - def update_asset( - self, - asset_id: int, - type_name: Optional[str] = None, - subtype_name: Optional[str] = None, - name: Optional[str] = None, - balance: Optional[float] = None, - balance_as_of: Optional[datetime.datetime] = None, - currency: Optional[str] = None, - institution_name: Optional[str] = None, - ) -> AssetsObject: - """ - Update a Single Asset - - Parameters - ---------- - asset_id: int - Asset Identifier - type_name: Optional[str] - Must be one of: cash, credit, investment, other, real estate, loan, vehicle, - cryptocurrency, employee compensation - subtype_name: Optional[str] - Max 25 characters - name: Optional[str] - Max 45 characters - balance: Optional[float] - Numeric value of the current balance of the account. Do not include any special - characters aside from a decimal point! - balance_as_of: Optional[datetime.datetime] - Has no effect if balance is not defined. If balance is defined, but balance_as_of - is not supplied or is invalid, current timestamp will be used. - currency: Optional[str] - Three-letter lowercase currency in ISO 4217 format. The code sent must exist in - our database. Defaults to asset's currency. - institution_name: Optional[str] - Max 50 characters - - Returns - ------- - AssetsObject - """ - payload = _AssetsParamsPut( - type_name=type_name, - subtype_name=subtype_name, - name=name, - balance=balance, - balance_as_of=balance_as_of, - currency=currency, - institution_name=institution_name, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_ASSETS, asset_id], - payload=payload, - ) - asset = AssetsObject.model_validate(response_data) - return asset - - def insert_asset( - self, - type_name: str, - name: Optional[str] = None, - subtype_name: Optional[str] = None, - display_name: Optional[str] = None, - balance: float = 0.00, - balance_as_of: Optional[datetime.datetime] = None, - currency: Optional[str] = None, - institution_name: Optional[str] = None, - closed_on: Optional[datetime.date] = None, - exclude_transactions: Optional[bool] = None, - ) -> AssetsObject: - """ - Create a single (manually-managed) asset. - - Parameters - ---------- - type_name: Optional[str] - Must be one of: cash, credit, investment, other, real estate, loan, vehicle, - cryptocurrency, employee compensation - name: Optional[str] - Max 45 characters - subtype_name: Optional[str] - Max 25 characters - display_name: Optional[str] - Display name of the asset (as set by user) - balance: float - Numeric value of the current balance of the account. Do not include any - special characters aside from a decimal point! Defaults to `0.00` - balance_as_of: Optional[datetime.datetime] - Has no effect if balance is not defined. If balance is defined, but - balance_as_of is not supplied or is invalid, current timestamp will be used. - currency: Optional[str] - Three-letter lowercase currency in ISO 4217 format. The code sent must exist - in our database. Defaults to user's primary currency. - institution_name: Optional[str] - Max 50 characters - closed_on: Optional[datetime.date] - The date this asset was closed - exclude_transactions: bool - If true, this asset will not show up as an option for assignment when - creating transactions manually. Defaults to False - - Returns - ------- - AssetsObject - """ - payload = _AssetsParamsPost( - type_name=type_name, - subtype_name=subtype_name, - name=name, - display_name=display_name, - balance=balance, - balance_as_of=balance_as_of, - currency=currency, - institution_name=institution_name, - closed_on=closed_on, - exclude_transactions=exclude_transactions, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_ASSETS], - payload=payload, - ) - asset = AssetsObject.model_validate(response_data) - return asset diff --git a/lunchable/models/budgets.py b/lunchable/models/budgets.py deleted file mode 100644 index 54fbd666..00000000 --- a/lunchable/models/budgets.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Lunch Money - Budgets - -https://lunchmoney.dev/#budget -""" - -import datetime -import logging -from typing import Any, Dict, List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _BudgetDescriptions - -logger = logging.getLogger(__name__) - - -class BudgetDataObject(LunchableModel): - """ - Data Object within a Budget - """ - - budget_amount: Optional[float] = None - budget_currency: Optional[str] = None - budget_to_base: Optional[float] = None - spending_to_base: float = 0.00 - num_transactions: int = 0 - - -class BudgetConfigObject(LunchableModel): - """ - Budget Configuration Object - """ - - config_id: int - cadence: str - amount: Optional[float] = None - currency: Optional[str] = None - to_base: Optional[float] = None - auto_suggest: str - - -class BudgetObject(LunchableModel): - """ - Monthly Budget Per Category Object - - https://lunchmoney.dev/#budget-object - """ - - category_name: str = Field(description="Name of the category") - category_id: Optional[int] = Field( - None, description="Unique identifier for category" - ) - category_group_name: Optional[str] = Field( - None, description=_BudgetDescriptions.category_group_name - ) - group_id: Optional[int] = Field( - None, description="Unique identifier for category group" - ) - is_group: Optional[bool] = Field( - None, description="If true, this category is a group" - ) - is_income: bool = Field(description=_BudgetDescriptions.is_income) - exclude_from_budget: bool = Field( - description=_BudgetDescriptions.exclude_from_budget - ) - exclude_from_totals: bool = Field( - description=_BudgetDescriptions.exclude_from_totals - ) - data: Dict[datetime.date, BudgetDataObject] = Field( - description=_BudgetDescriptions.data - ) - config: Optional[BudgetConfigObject] = Field( - None, description=_BudgetDescriptions.config - ) - - -class BudgetParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-budget-summary - """ - - start_date: datetime.date - end_date: datetime.date - - -class BudgetParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#upsert-budget - """ - - start_date: datetime.date - category_id: int - amount: float - currency: Optional[str] = None - - -class BudgetParamsRemove(LunchableModel): - """ - https://lunchmoney.dev/#remove-budget - """ - - start_date: datetime.date - category_id: int - - -class BudgetsClient(LunchMoneyAPIClient): - """ - Lunch Money Budget Interactions - """ - - def get_budgets( - self, start_date: datetime.date, end_date: datetime.date - ) -> List[BudgetObject]: - """ - Get Monthly Budgets - - Get full details on the budgets for all categories between a certain time - period. The budgeted and spending amounts will be an aggregate across this - time period. (https://lunchmoney.dev/#plaid-accounts-object) - - Returns - ------- - List[BudgetObject] - """ - params = BudgetParamsGet(start_date=start_date, end_date=end_date).model_dump() - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - params=params, - ) - budget_objects = [BudgetObject.model_validate(item) for item in response_data] - return budget_objects - - def upsert_budget( - self, - start_date: datetime.date, - category_id: int, - amount: float, - currency: Optional[str] = None, - ) -> Optional[Dict[str, Any]]: - """ - Upsert a Budget for a Category and Date - - Use this endpoint to update an existing budget or insert a new budget for - a particular category and date. - - Note: Lunch Money currently only supports monthly budgets, so your date must - always be the start of a month (eg. 2021-04-01) - - If this is a sub-category, the response will include the updated category - group's budget. This is because setting a sub-category may also update - the category group's overall budget. - - https://lunchmoney.dev/#upsert-budget - - Parameters - ---------- - start_date : date - Start date for the budget period. Lunch Money currently only supports monthly budgets, - so your date must always be the start of a month (eg. 2021-04-01) - category_id: int - Unique identifier for the category - amount: float - Amount for budget - currency: Optional[str] - Currency for the budgeted amount (optional). If empty, will default to your primary - currency - - Returns - ------- - Optional[Dict[str, Any]] - """ - body = BudgetParamsPut( - start_date=start_date, - category_id=category_id, - amount=amount, - currency=currency, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - payload=body, - ) - - return response_data["category_group"] - - def remove_budget(self, start_date: datetime.date, category_id: int) -> bool: - """ - Unset an Existing Budget for a Particular Category in a Particular Month - - Parameters - ---------- - start_date : date - Start date for the budget period. Lunch Money currently only supports monthly budgets, - so your date must always be the start of a month (eg. 2021-04-01) - category_id: int - Unique identifier for the category - - Returns - ------- - bool - """ - params = BudgetParamsRemove( - start_date=start_date, category_id=category_id - ).model_dump() - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_BUDGET], - params=params, - ) - return response_data diff --git a/lunchable/models/categories.py b/lunchable/models/categories.py deleted file mode 100644 index 71950a4b..00000000 --- a/lunchable/models/categories.py +++ /dev/null @@ -1,488 +0,0 @@ -""" -Lunch Money - Categories - -https://lunchmoney.dev/#categories -""" - -from __future__ import annotations - -import datetime -import json -import logging -from enum import Enum -from typing import List, Optional, Union - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.exceptions import LunchMoneyError -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _CategoriesDescriptions - -logger = logging.getLogger(__name__) - - -class ModelCreateCategory(LunchableModel): - """ - https://lunchmoney.dev/#create-category - """ - - name: str - description: Optional[str] = None - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - archived: Optional[bool] = None - group_id: Optional[int] = None - - -class CategoryChild(LunchableModel): - """ - Child Entry on the Category Object - """ - - id: int - name: str = Field(min_length=1, max_length=100) - description: Optional[str] = Field(None, max_length=140) - created_at: Optional[datetime.datetime] = None - - -class CategoriesObject(LunchableModel): - """ - Lunch Money Spending Categories - - https://lunchmoney.dev/#categories-object - """ - - id: int = Field(description="A unique identifier for the category.") - name: str = Field( - min_length=1, - max_length=100, - description=_CategoriesDescriptions.name, - ) - description: Optional[str] = Field( - None, max_length=140, description=_CategoriesDescriptions.description - ) - is_income: bool = Field(description=_CategoriesDescriptions.is_income) - exclude_from_budget: bool = Field( - description=_CategoriesDescriptions.exclude_from_budget - ) - exclude_from_totals: bool = Field( - description=_CategoriesDescriptions.exclude_from_totals - ) - archived: bool = Field(False, description=_CategoriesDescriptions.archived) - archived_on: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.archived_on - ) - updated_at: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.updated_at - ) - created_at: Optional[datetime.datetime] = Field( - None, description=_CategoriesDescriptions.created_at - ) - is_group: bool = Field(description=_CategoriesDescriptions.is_group) - group_id: Optional[int] = Field(None, description=_CategoriesDescriptions.group_id) - order: Optional[int] = Field(None, description=_CategoriesDescriptions.order) - children: Optional[List[Union[CategoriesObject, CategoryChild]]] = Field( - None, - description=_CategoriesDescriptions.children, - ) - - -class _CategoriesParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-category - """ - - name: Optional[str] = Field(None, min_length=1, max_length=100) - description: Optional[str] = Field(None, max_length=140) - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - archived: Optional[bool] = None - group_id: Optional[int] = None - - -class _CategoriesParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-category-group - """ - - name: str - description: Optional[str] = None - is_income: Optional[bool] = None - exclude_from_budget: Optional[bool] = None - exclude_from_totals: Optional[bool] = None - category_ids: Optional[List[int]] = None - new_categories: Optional[List[str]] = None - - -class _CategoriesAddParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#add-to-category-group - """ - - category_ids: Optional[List[int]] = None - new_categories: Optional[List[str]] = None - - -class CategoriesFormatEnum(str, Enum): - """ - Format Enum - """ - - nested: str = "nested" - flattened: str = "flattened" - - -class _GetCategoriesParams(LunchableModel): - """ - https://lunchmoney.dev/#get-all-categories - """ - - format: Optional[CategoriesFormatEnum] = None - - -class CategoriesClient(LunchMoneyAPIClient): - """ - Lunch Money Categories Interactions - """ - - def get_categories( - self, format: str | CategoriesFormatEnum | None = None - ) -> List[CategoriesObject]: - """ - Get Spending categories - - Use this endpoint to get a list of all categories associated with the user's account. - https://lunchmoney.dev/#get-all-categories - - Parameters - ---------- - format: str | CategoriesFormatEnum | None - Can either `flattened` or `nested`. If `flattened`, returns a singular - array of categories, ordered alphabetically. If `nested`, returns - top-level categories (either category groups or categories not part - of a category group) in an array. Subcategories are nested within - the category group under the property `children`. Defaults to None - which will return a `flattened` list of categories. - - Returns - ------- - List[CategoriesObject] - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=APIConfig.LUNCHMONEY_CATEGORIES, - params=_GetCategoriesParams(format=format).model_dump(exclude_none=True), - ) - categories = response_data["categories"] - category_objects = [ - CategoriesObject.model_validate(item) for item in categories - ] - return category_objects - - def insert_category( - self, - name: str, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - archived: Optional[bool] = None, - group_id: Optional[int] = None, - ) -> int: - """ - Create a Spending Category - - Use this to create a single category - https://lunchmoney.dev/#create-category - - Parameters - ---------- - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - archived: Optional[bool] - Whether or not category should be archived. - group_id: Optional[int] - Assigns the newly-created category to an existing category group. - - Returns - ------- - int - ID of the newly created category - """ - category_body = ModelCreateCategory( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - archived=archived, - group_id=group_id, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=APIConfig.LUNCHMONEY_CATEGORIES, - payload=category_body, - ) - return response_data["category_id"] - - def get_category(self, category_id: int) -> CategoriesObject: - """ - Get single category - - Use this endpoint to get hydrated details on a single category. Note that if - this category is part of a category group, its properties (is_income, - exclude_from_budget, exclude_from_totals) will inherit from the category group. - - https://lunchmoney.dev/#get-single-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - CategoriesObject - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - ) - return CategoriesObject.model_validate(response_data) - - def remove_category(self, category_id: int) -> bool: - """ - Delete a single category - - Use this endpoint to delete a single category or category group. This will - only work if there are no dependencies, such as existing budgets for the - category, categorized transactions, categorized recurring items, etc. If - there are dependents, this endpoint will return what the dependents are - and how many there are. - - https://lunchmoney.dev/#delete-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - bool - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - ) - if response_data is not True: - raise LunchMoneyError( - f"That Category ({category_id}) has Dependents: " - f"{json.dumps(response_data, indent=4)}" - ) - return response_data - - def remove_category_force(self, category_id: int) -> bool: - """ - Forcefully delete a single category - - Use this endpoint to force delete a single category or category group and - along with it, disassociate the category from any transactions, recurring - items, budgets, etc. - - Note: it is best practice to first try the Delete Category endpoint to ensure - you don't accidentally delete any data. Disassociation/deletion of the data - arising from this endpoint is irreversible! - - https://lunchmoney.dev/#force-delete-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - - Returns - ------- - bool - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id, "force"], - ) - return response_data - - def update_category( - self, - category_id: int, - name: Optional[str] = None, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - group_id: Optional[int] = None, - archived: Optional[bool] = None, - ) -> bool: - """ - Update a single category - - Use this endpoint to update the properties for a single category or category group - - https://lunchmoney.dev/#update-category - - Parameters - ---------- - category_id : int - Id of the Lunch Money Category - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - group_id: Optional[int] - For a category, set the group_id to include it in a category group - archived: Optional[bool] - Whether or not category should be archived. - - Returns - ------- - bool - """ - payload = _CategoriesParamsPut( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - group_id=group_id, - archived=archived, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, category_id], - payload=payload, - ) - return response_data - - def insert_category_group( - self, - name: str, - description: Optional[str] = None, - is_income: Optional[bool] = None, - exclude_from_budget: Optional[bool] = None, - exclude_from_totals: Optional[bool] = None, - category_ids: Optional[List[int]] = None, - new_categories: Optional[List[str]] = None, - ) -> int: - """ - Create a Spending Category Group - - Use this endpoint to create a single category group - https://lunchmoney.dev/#create-category-group - - Parameters - ---------- - name: str - Name of category. Must be between 1 and 100 characters. - description: Optional[str] - Description of category. Must be less than 140 categories. Defaults to None. - is_income: Optional[bool] - Whether or not transactions in this category should be treated as income. - Defaults to False. - exclude_from_budget: Optional[bool] - Whether or not transactions in this category should be excluded from budgets. - Defaults to False. - exclude_from_totals: Optional[bool] - Whether or not transactions in this category should be excluded from - calculated totals. Defaults to False. - category_ids: Optional[List[int]] - Array of category_id to include in the category group. - new_categories: Optional[List[str]] - Array of strings representing new categories to create and subsequently - include in the category group. - - Returns - ------- - int - ID of the newly created category group - """ - payload = _CategoriesParamsPost( - name=name, - description=description, - is_income=is_income, - exclude_from_budget=exclude_from_budget, - exclude_from_totals=exclude_from_totals, - category_ids=category_ids, - new_categories=new_categories, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_CATEGORIES, "group"], - payload=payload, - ) - return response_data["category_id"] - - def insert_into_category_group( - self, - category_group_id: int, - category_ids: Optional[List[int]] = None, - new_categories: Optional[List[str]] = None, - ) -> CategoriesObject: - """ - Add to a Category Group - - Use this endpoint to add categories (either existing or new) to a single - category group - - https://lunchmoney.dev/#add-to-category-group - - Parameters - ---------- - category_group_id: int - Id of the Lunch Money Category Group - category_ids: Optional[List[int]] - Array of category_id to include in the category group. - new_categories: Optional[List[str]] - Array of strings representing new categories to create and subsequently - include in the category group. - - Returns - ------- - CategoriesObject - """ - payload = _CategoriesAddParamsPost( - category_ids=category_ids, new_categories=new_categories - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[ - APIConfig.LUNCHMONEY_CATEGORIES, - "group", - category_group_id, - "add", - ], - payload=payload, - ) - return CategoriesObject.model_validate(response_data) diff --git a/lunchable/models/crypto.py b/lunchable/models/crypto.py deleted file mode 100644 index ed7ba1c6..00000000 --- a/lunchable/models/crypto.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Lunch Money - Crypto - -https://lunchmoney.dev/#crypto -""" - -import datetime -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _CryptoDescriptions - -logger = logging.getLogger(__name__) - - -class CryptoObject(LunchableModel): - """ - Crypto Asset Object - - https://lunchmoney.dev/#crypto-object - """ - - id: int = Field(description=_CryptoDescriptions.id) - zabo_account_id: Optional[int] = Field( - None, description=_CryptoDescriptions.zabo_account_id - ) - source: str = Field(description=_CryptoDescriptions.source) - name: str = Field(description="Name of the crypto asset") - display_name: Optional[str] = Field( - None, description=_CryptoDescriptions.display_name - ) - balance: float = Field(description="Current balance") - balance_as_of: Optional[datetime.datetime] = Field( - None, description=_CryptoDescriptions.balance_as_of - ) - currency: Optional[str] = Field( - None, description="Abbreviation for the cryptocurrency" - ) - status: Optional[str] = Field(None, description=_CryptoDescriptions.status) - institution_name: Optional[str] = Field( - default=None, description="Name of provider holding the asset" - ) - created_at: datetime.datetime = Field(description=_CryptoDescriptions.created_at) - - -class CryptoParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-manual-crypto-asset - """ - - name: Optional[str] = None - display_name: Optional[str] = None - institution_name: Optional[str] = None - balance: Optional[float] = None - currency: Optional[str] = None - - -class CryptoClient(LunchMoneyAPIClient): - """ - Lunch Money Tag Interactions - """ - - def get_crypto(self) -> List[CryptoObject]: - """ - Get Crypto Assets - - Use this endpoint to get a list of all cryptocurrency assets associated - with the user's account. Both crypto balances from synced and manual - accounts will be returned. - - https://lunchmoney.dev/#get-all-crypto - - Returns - ------- - List[CryptoObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_CRYPTO - ) - crypto_data = response_data["crypto"] - crypto_objects = [CryptoObject.model_validate(item) for item in crypto_data] - return crypto_objects - - def update_crypto( - self, - crypto_id: int, - name: Optional[str] = None, - display_name: Optional[str] = None, - institution_name: Optional[str] = None, - balance: Optional[float] = None, - currency: Optional[str] = None, - ) -> CryptoObject: - """ - Update a Manual Crypto Asset - - Use this endpoint to update a single manually-managed crypto asset (does not include - assets received from syncing with your wallet/exchange/etc). These are denoted by - source: manual from the GET call above. - - https://lunchmoney.dev/#update-manual-crypto-asset - - Parameters - ---------- - crypto_id: int - ID of the crypto asset to update - name: Optional[str] - Official or full name of the account. Max 45 characters - display_name: Optional[str] - Display name for the account. Max 25 characters - institution_name: Optional[str] - Name of provider that holds the account. Max 50 characters - balance: Optional[float] - Numeric value of the current balance of the account. Do not include any - special characters aside from a decimal point! - currency: Optional[str] - Cryptocurrency that is supported for manual tracking in our database - - Returns - ------- - CryptoObject - """ - crypto_body = CryptoParamsPut( - name=name, - display_name=display_name, - institution_name=institution_name, - balance=balance, - currency=currency, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[ - APIConfig.LUNCHMONEY_CRYPTO, - APIConfig.LUNCHMONEY_CRYPTO_MANUAL, - crypto_id, - ], - payload=crypto_body, - ) - crypto = CryptoObject.model_validate(response_data) - return crypto diff --git a/lunchable/models/plaid_accounts.py b/lunchable/models/plaid_accounts.py deleted file mode 100644 index cef14fd8..00000000 --- a/lunchable/models/plaid_accounts.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Lunch Money - Plaid Accounts - -https://lunchmoney.dev/#plaid-accounts -""" - -from __future__ import annotations - -import datetime -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _PlaidAccountDescriptions - -logger = logging.getLogger(__name__) - - -class _PlaidFetchRequest(LunchableModel): - """ - Trigger Fetch from Plaid - - https://lunchmoney.dev/#trigger-fetch-from-plaid - """ - - start_date: Optional[datetime.date] = None - end_date: Optional[datetime.date] = None - plaid_account_id: Optional[int] = None - - -class PlaidAccountObject(LunchableModel): - """ - Assets synced from Plaid - - Similar to AssetObjects, these accounts are linked to remote sources in Plaid. - - https://lunchmoney.dev/#plaid-accounts-object - """ - - id: int = Field(description="Unique identifier of Plaid account") - date_linked: datetime.date = Field( - description=_PlaidAccountDescriptions.date_linked - ) - name: str = Field(description=_PlaidAccountDescriptions.name) - type: str = Field(description=_PlaidAccountDescriptions.type) - subtype: str = Field(description=_PlaidAccountDescriptions.subtype) - mask: Optional[str] = Field(None, description=_PlaidAccountDescriptions.mask) - institution_name: str = Field( - description=_PlaidAccountDescriptions.institution_name - ) - status: str = Field(description=_PlaidAccountDescriptions.status) - last_import: Optional[datetime.datetime] = Field( - None, description=_PlaidAccountDescriptions.last_import - ) - balance: Optional[float] = Field( - None, description=_PlaidAccountDescriptions.balance - ) - currency: str = Field(description=_PlaidAccountDescriptions.currency) - balance_last_update: datetime.datetime = Field( - description=_PlaidAccountDescriptions.balance_last_update - ) - limit: Optional[int] = Field(None, description=_PlaidAccountDescriptions.limit) - - -class PlaidAccountsClient(LunchMoneyAPIClient): - """ - Lunch Money Plaid Accounts Interactions - """ - - def get_plaid_accounts(self) -> List[PlaidAccountObject]: - """ - Get Plaid Synced Assets - - Get a list of all synced Plaid accounts associated with the user's account. - - Plaid Accounts are individual bank accounts that you have linked to Lunch Money via Plaid. - You may link one bank but one bank might contain 4 accounts. Each of these - accounts is a Plaid Account. (https://lunchmoney.dev/#plaid-accounts-object) - - Returns - ------- - List[PlaidAccountObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_PLAID_ACCOUNTS - ) - accounts = response_data.get(APIConfig.LUNCHMONEY_PLAID_ACCOUNTS) - account_objects = [PlaidAccountObject.model_validate(item) for item in accounts] - return account_objects - - def trigger_fetch_from_plaid( - self, - start_date: Optional[datetime.date] = None, - end_date: Optional[datetime.date] = None, - plaid_account_id: Optional[int] = None, - ) -> bool: - """ - Trigger Fetch from Plaid - - ** This is an experimental endpoint and parameters and/or response may change. ** - - Use this endpoint to trigger a fetch for latest data from Plaid. - - Returns true if there were eligible Plaid accounts to trigger a fetch for. Eligible - accounts are those who last_fetch value is over 1 minute ago. (Although the limit - is every minute, please use this endpoint sparingly!) - - Note that fetching from Plaid is a background job. This endpoint simply queues up - the job. You may track the plaid_last_successful_update, last_fetch and last_import - properties to verify the results of the fetch. - - Parameters - ---------- - start_date: Optional[datetime.date] - Start date for fetch (ignored if end_date is null) - end_date: Optional[datetime.date] - End date for fetch (ignored if start_date is null) - plaid_account_id: Optional[int] - Specific ID of a plaid account to fetch. If left empty, - endpoint will trigger a fetch for all eligible accounts - - Returns - ------- - bool - Returns true if there were eligible Plaid accounts to trigger a fetch for. - """ - fetch_request = _PlaidFetchRequest( - start_date=start_date, end_date=end_date, plaid_account_id=plaid_account_id - ) - response: bool = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_PLAID_ACCOUNTS, "fetch"], - data=fetch_request.model_dump(exclude_none=True), - ) - return response diff --git a/lunchable/models/recurring_expenses.py b/lunchable/models/recurring_expenses.py deleted file mode 100644 index 457b5c9b..00000000 --- a/lunchable/models/recurring_expenses.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Lunch Money - Recurring Expenses - -https://lunchmoney.dev/#recurring-expenses -""" - -import datetime -import logging -import warnings -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import _RecurringExpensesDescriptions - -logger = logging.getLogger(__name__) - - -class RecurringExpensesObject(LunchableModel): - """ - Recurring Expenses Object - - https://lunchmoney.dev/#recurring-expenses-object - """ - - id: int = Field(description=_RecurringExpensesDescriptions.id) - start_date: Optional[datetime.date] = Field( - None, description=_RecurringExpensesDescriptions.start_date - ) - end_date: Optional[datetime.date] = Field( - None, description=_RecurringExpensesDescriptions.end_date - ) - cadence: str = Field(description=_RecurringExpensesDescriptions.cadence) - payee: str = Field(description="Payee of the recurring expense") - amount: float = Field(description=_RecurringExpensesDescriptions.amount) - currency: str = Field( - max_length=3, description=_RecurringExpensesDescriptions.currency - ) - description: Optional[str] = Field( - None, description=_RecurringExpensesDescriptions.description - ) - billing_date: datetime.date = Field( - description=_RecurringExpensesDescriptions.billing_date - ) - type: str = Field(description=_RecurringExpensesDescriptions.type) - original_name: Optional[str] = Field( - None, description=_RecurringExpensesDescriptions.original_name - ) - source: str = Field(description=_RecurringExpensesDescriptions.source) - plaid_account_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.plaid_account_id - ) - asset_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.asset_id - ) - category_id: Optional[int] = Field( - None, description=_RecurringExpensesDescriptions.category_id - ) - - -class RecurringExpenseParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-recurring-expenses - """ - - start_date: datetime.date - debit_as_negative: Optional[bool] = None - - -class RecurringExpensesClient(LunchMoneyAPIClient): - """ - Lunch Money Recurring Expenses Interactions - """ - - def get_recurring_expenses( - self, - start_date: Optional[datetime.date] = None, - debit_as_negative: Optional[bool] = None, - ) -> List[RecurringExpensesObject]: - """ - Get Recurring Expenses - - **DEPRECATED** - Use [LunchMoney.get_recurring_items()][lunchable.LunchMoney.get_recurring_items] - instead. - - Retrieve a list of recurring expenses to expect for a specified period. - - Every month, a different set of recurring expenses is expected. This is because recurring - expenses can be once a year, twice a year, every 4 months, etc. - - If a recurring expense is listed as “twice a month”, then that recurring expense will be - returned twice, each with a different billing date based on when the system believes that - recurring expense transaction is to be expected. If the recurring expense is listed as - “once a week”, then that recurring expense will be returned in this list as many times as - there are weeks for the specified month. - - In the same vein, if a recurring expense that began last month is set to “Every 3 - months”, then that recurring expense will not show up in the results for this month. - - Parameters - ---------- - start_date : Optional[datetime.date] - Date to search. By default will return the first day of the current month - debit_as_negative: bool - Pass in true if you'd like expenses to be returned as negative amounts and credits as - positive amounts. - - Returns - ------- - List[RecurringExpensesObject] - """ - warnings.warn( - message=( - "`LunchMoney.get_recurring_expenses` is deprecated, " - "use `LunchMoney.get_recurring_items` instead" - ), - category=DeprecationWarning, - stacklevel=2, - ) - if start_date is None: - start_date = datetime.datetime.now().date().replace(day=1) - params = RecurringExpenseParamsGet( - start_date=start_date, debit_as_negative=debit_as_negative - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCH_MONEY_RECURRING_EXPENSES], - params=params, - ) - recurring_expenses = response_data.get(APIConfig.LUNCH_MONEY_RECURRING_EXPENSES) - recurring_expenses_objects = [ - RecurringExpensesObject.model_validate(item) for item in recurring_expenses - ] - logger.debug( - "%s RecurringExpensesObjects retrieved", len(recurring_expenses_objects) - ) - return recurring_expenses_objects diff --git a/lunchable/models/recurring_items.py b/lunchable/models/recurring_items.py deleted file mode 100644 index d77c7679..00000000 --- a/lunchable/models/recurring_items.py +++ /dev/null @@ -1,190 +0,0 @@ -""" -Lunch Money - Recurring Expenses - -https://lunchmoney.dev/#recurring-expenses -""" - -from __future__ import annotations - -import datetime -import logging -from typing import Any, Dict, List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import ( - _RecurringItemsDescriptions, - _SummarizedTransactionDescriptions, -) - -logger = logging.getLogger(__name__) - - -class SummarizedTransactionObject(LunchableModel): - """ - Summarized Transaction Object - """ - - id: int = Field(description=_SummarizedTransactionDescriptions.id) - date: datetime.date = Field(description=_SummarizedTransactionDescriptions.date) - amount: float = Field(description=_SummarizedTransactionDescriptions.amount) - currency: str = Field( - max_length=3, description=_SummarizedTransactionDescriptions.currency - ) - payee: str = Field(description=_SummarizedTransactionDescriptions.payee) - category_id: Optional[int] = Field( - None, description=_SummarizedTransactionDescriptions.category_id - ) - recurring_id: Optional[int] = Field( - None, description=_SummarizedTransactionDescriptions.recurring_id - ) - to_base: float = Field(description=_SummarizedTransactionDescriptions.to_base) - - -class RecurringItemsObject(LunchableModel): - """ - Recurring Expenses Object - """ - - id: int = Field(description=_RecurringItemsDescriptions.id) - start_date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.start_date - ) - end_date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.end_date - ) - payee: str = Field(description=_RecurringItemsDescriptions.payee) - currency: str = Field( - max_length=3, description=_RecurringItemsDescriptions.currency - ) - created_by: int = Field(description=_RecurringItemsDescriptions.created_by) - created_at: datetime.datetime = Field( - description=_RecurringItemsDescriptions.created_at - ) - updated_at: datetime.datetime = Field( - description=_RecurringItemsDescriptions.updated_at - ) - billing_date: datetime.date = Field( - description=_RecurringItemsDescriptions.billing_date - ) - original_name: Optional[str] = Field( - None, description=_RecurringItemsDescriptions.original_name - ) - description: Optional[str] = Field( - None, description=_RecurringItemsDescriptions.description - ) - plaid_account_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.plaid_account_id - ) - asset_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.asset_id - ) - source: str = Field(description=_RecurringItemsDescriptions.source) - notes: Optional[str] = Field(None, description=_RecurringItemsDescriptions.notes) - amount: float = Field(description=_RecurringItemsDescriptions.amount) - category_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.category_id - ) - category_group_id: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.category_group_id - ) - is_income: bool = Field(description=_RecurringItemsDescriptions.is_income) - exclude_from_totals: bool = Field( - description=_RecurringItemsDescriptions.exclude_from_totals - ) - granularity: str = Field(description=_RecurringItemsDescriptions.granularity) - cadence: Optional[str] = Field(None) - quantity: Optional[int] = Field( - None, description=_RecurringItemsDescriptions.quantity - ) - occurrences: Dict[datetime.date, List[SummarizedTransactionObject]] = Field( - description=_RecurringItemsDescriptions.occurrences - ) - transactions_within_range: Optional[List[SummarizedTransactionObject]] = Field( - None, description=_RecurringItemsDescriptions.transactions_within_range - ) - missing_dates_within_range: Optional[List[Any]] = Field( - None, description=_RecurringItemsDescriptions.missing_dates_within_range - ) - date: Optional[datetime.date] = Field( - None, description=_RecurringItemsDescriptions.date - ) - to_base: float = Field(description=_RecurringItemsDescriptions.to_base) - - -class RecurringItemsParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-recurring-items - """ - - start_date: datetime.date - debit_as_negative: Optional[bool] = None - - -class RecurringItemsClient(LunchMoneyAPIClient): - """ - Lunch Money Recurring Items Interactions - """ - - def get_recurring_items( - self, - start_date: Optional[datetime.date] = None, - debit_as_negative: Optional[bool] = None, - ) -> List[RecurringItemsObject]: - """ - Get Recurring Items - - Use this to retrieve a list of recurring items to expect for a specified month. - - A different set of recurring items is expected every month. These can be once a year, - twice a year, every four months, etc. - - If a recurring item is listed as “twice a month,” then the recurring item object returned - will have an occurrences attribute populated by the different billing dates the system believes - recurring transactions should occur, including the two dates in the current month, the last - transaction date prior to the month, and the next transaction date after the month. - - If the recurring item is listed as “once a week,” then the recurring item object returned will - have an occurrences object populated with as many times as there are weeks for the specified - month, along with the last transaction from the previous month and the next transaction for - the next month. - - In the same vein, if a recurring item that began last month is set to “Every 3 months”, - then that recurring item object that occurred will not include any dates for this month. - - Parameters - ---------- - start_date : Optional[datetime.date] - Date to search. Whatever your start date, the system will automatically - return recurring items expected for that month. For instance, if you - input 2020-01-25, the system will return recurring items which are to - be expected between 2020-01-01 to 2020-01-31. By default will return - the first day of the current month - debit_as_negative: bool - Pass in true if you'd like items to be returned as negative amounts - and credits as positive amounts. Defaults to false. - - Returns - ------- - List[RecurringItemsObject] - """ - if start_date is None: - start_date = datetime.datetime.now().date().replace(day=1) - params = RecurringItemsParamsGet( - start_date=start_date, debit_as_negative=debit_as_negative - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCH_MONEY_RECURRING_ITEMS], - params=params, - ) - recurring_expenses_objects = [ - RecurringItemsObject.model_validate(item) for item in response_data - ] - logger.debug( - "%s RecurringExpensesObjects retrieved", len(recurring_expenses_objects) - ) - return recurring_expenses_objects diff --git a/lunchable/models/tags.py b/lunchable/models/tags.py deleted file mode 100644 index 40362b27..00000000 --- a/lunchable/models/tags.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Lunch Money - Tags - -https://lunchmoney.dev/#tags -""" - -import logging -from typing import List, Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient - -logger = logging.getLogger(__name__) - - -class TagsObject(LunchableModel): - """ - Lunchmoney Tags object - - https://lunchmoney.dev/#tags-object - """ - - id: int = Field(description="Unique identifier for tag") - name: str = Field(description="User-defined name of tag", min_length=1) - description: Optional[str] = Field( - None, description="User-defined description of tag" - ) - archived: bool = Field( - False, - description=( - "If true, the tag will not show up when creating or " - "updating transactions in the Lunch Money app" - ), - ) - - -class TagsClient(LunchMoneyAPIClient): - """ - Lunch Money Tag Interactions - """ - - def get_tags(self) -> List[TagsObject]: - """ - Get Spending Tags - - Use this endpoint to get a list of all tags associated with the - user's account. - - https://lunchmoney.dev/#get-all-tags - - Returns - ------- - List[TagsObject] - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_TAGS - ) - tag_objects = [TagsObject.model_validate(item) for item in response_data] - return tag_objects diff --git a/lunchable/models/transactions.py b/lunchable/models/transactions.py deleted file mode 100644 index 26077120..00000000 --- a/lunchable/models/transactions.py +++ /dev/null @@ -1,963 +0,0 @@ -""" -Lunch Money - Transactions - -https://lunchmoney.dev/#transactions -""" - -import datetime -import logging -from enum import Enum -from typing import Any, Dict, List, Optional, Union - -import pydantic_core -from pydantic import Field, field_validator - -from lunchable import LunchMoneyError -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient -from lunchable.models._descriptions import ( - _TransactionDescriptions, - _TransactionInsertDescriptions, - _TransactionSplitDescriptions, - _TransactionUpdateDescriptions, -) -from lunchable.models.tags import TagsObject - -logger = logging.getLogger(__name__) - - -class TransactionBaseObject(LunchableModel): - """ - Base Model For All Transactions to Inherit From - """ - - pass - - -class TransactionInsertObject(TransactionBaseObject): - """ - Object For Creating New Transactions - - https://lunchmoney.dev/#insert-transactions - """ - - class StatusEnum(str, Enum): - """ - Status Options, must be "cleared" or "uncleared" - """ - - cleared = "cleared" - uncleared = "uncleared" - - date: datetime.date = Field(description=_TransactionInsertDescriptions.date) - amount: float = Field(description=_TransactionInsertDescriptions.amount) - category_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.category_id - ) - payee: Optional[str] = Field(None, description="Max 140 characters", max_length=140) - currency: Optional[str] = Field( - None, description=_TransactionInsertDescriptions.currency, max_length=3 - ) - asset_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.asset_id - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionInsertDescriptions.recurring_id - ) - notes: Optional[str] = Field(None, description="Max 350 characters", max_length=350) - status: Optional[StatusEnum] = Field( - None, description=_TransactionInsertDescriptions.status - ) - external_id: Optional[str] = Field( - None, description=_TransactionInsertDescriptions.external_id, max_length=75 - ) - tags: Optional[List[Union[str, int]]] = Field( - None, description=_TransactionInsertDescriptions.tags - ) - - -class TransactionUpdateObject(TransactionBaseObject): - """ - Object For Updating Existing Transactions - - https://lunchmoney.dev/#update-transaction - """ - - class StatusEnum(str, Enum): - """ - Status Options, must be "cleared" or "uncleared" - """ - - cleared = "cleared" - uncleared = "uncleared" - - date: Optional[datetime.date] = Field( - None, description=_TransactionUpdateDescriptions.date - ) - category_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.category_id - ) - payee: Optional[str] = Field(None, description="Max 140 characters", max_length=140) - amount: Optional[float] = Field( - None, description=_TransactionUpdateDescriptions.amount - ) - currency: Optional[str] = Field( - None, description=_TransactionUpdateDescriptions.currency - ) - asset_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.asset_id - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionUpdateDescriptions.recurring_id - ) - notes: Optional[str] = Field(None, description="Max 350 characters", max_length=350) - status: Optional[StatusEnum] = Field( - None, description=_TransactionUpdateDescriptions.status - ) - external_id: Optional[str] = Field( - None, description=_TransactionUpdateDescriptions.external_id - ) - tags: Optional[List[Union[int, str]]] = Field( - None, description=_TransactionUpdateDescriptions.tags - ) - - -class TransactionSplitObject(TransactionBaseObject): - """ - Object for Splitting Transactions - - https://lunchmoney.dev/#split-object - """ - - date: datetime.date = Field(description=_TransactionSplitDescriptions.date) - category_id: Optional[int] = Field( - default=None, description=_TransactionSplitDescriptions.category_id - ) - notes: Optional[str] = Field(None, description=_TransactionSplitDescriptions.notes) - amount: float = Field(description=_TransactionSplitDescriptions.amount) - - -class FullStatusEnum(str, Enum): - """ - Status Options - """ - - cleared = "cleared" - uncleared = "uncleared" - recurring = "recurring" - recurring_suggested = "recurring_suggested" - pending = "pending" - - -class TransactionChildObject(TransactionBaseObject): - """ - Child Transaction Object for Transaction Groups - """ - - id: int = Field(description=_TransactionDescriptions.id) - amount: float = Field(description=_TransactionDescriptions.amount) - payee: Optional[str] = Field(None, description=_TransactionDescriptions.payee) - date: datetime.date = Field(description=_TransactionDescriptions.date) - formatted_date: Optional[str] = Field( - None, description=_TransactionDescriptions.formatted_date - ) - notes: Optional[str] = Field(None, description=_TransactionDescriptions.notes) - currency: Optional[str] = Field(None, description=_TransactionDescriptions.currency) - asset_id: Optional[int] = Field(None, description=_TransactionDescriptions.asset_id) - plaid_account_id: Optional[int] = Field( - None, description=_TransactionDescriptions.plaid_account_id - ) - to_base: Optional[float] = Field(None, description=_TransactionDescriptions.to_base) - - -class TransactionObject(TransactionBaseObject): - """ - Universal Lunch Money Transaction Object - - https://lunchmoney.dev/#transaction-object - """ - - id: int = Field(description=_TransactionDescriptions.id) - date: datetime.date = Field(description=_TransactionDescriptions.date) - payee: Optional[str] = Field(None, description=_TransactionDescriptions.payee) - amount: float = Field(description=_TransactionDescriptions.amount) - currency: Optional[str] = Field( - None, max_length=3, description=_TransactionDescriptions.currency - ) - to_base: Optional[float] = Field(None, description=_TransactionDescriptions.to_base) - category_id: Optional[int] = Field( - None, description=_TransactionDescriptions.category_id - ) - category_name: Optional[str] = Field( - None, description=_TransactionDescriptions.category_name - ) - category_group_id: Optional[int] = Field( - None, description=_TransactionDescriptions.category_group_id - ) - category_group_name: Optional[str] = Field( - None, description=_TransactionDescriptions.category_group_name - ) - is_income: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_income - ) - exclude_from_budget: Optional[bool] = Field( - None, description=_TransactionDescriptions.exclude_from_budget - ) - exclude_from_totals: Optional[bool] = Field( - None, description=_TransactionDescriptions.exclude_from_totals - ) - created_at: datetime.datetime = Field( - description=_TransactionDescriptions.created_at - ) - updated_at: datetime.datetime = Field( - description=_TransactionDescriptions.updated_at - ) - status: Optional[str] = Field(None, description=_TransactionDescriptions.status) - is_pending: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_pending - ) - notes: Optional[str] = Field(None, description=_TransactionDescriptions.notes) - original_name: Optional[str] = Field( - None, description=_TransactionDescriptions.original_name - ) - recurring_id: Optional[int] = Field( - None, description=_TransactionDescriptions.recurring_id - ) - recurring_payee: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_payee - ) - recurring_description: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_description - ) - recurring_cadence: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_cadence - ) - recurring_type: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_type - ) - recurring_amount: Optional[float] = Field( - None, description=_TransactionDescriptions.recurring_amount - ) - recurring_currency: Optional[str] = Field( - None, description=_TransactionDescriptions.recurring_currency - ) - parent_id: Optional[int] = Field( - None, description=_TransactionDescriptions.parent_id - ) - has_children: Optional[bool] = Field( - None, description=_TransactionDescriptions.has_children - ) - group_id: Optional[int] = Field(None, description=_TransactionDescriptions.group_id) - is_group: Optional[bool] = Field( - None, description=_TransactionDescriptions.is_group - ) - asset_id: Optional[int] = Field(None, description=_TransactionDescriptions.asset_id) - asset_institution_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_institution_name - ) - asset_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_name - ) - asset_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_display_name - ) - asset_status: Optional[str] = Field( - None, description=_TransactionDescriptions.asset_status - ) - plaid_account_id: Optional[int] = Field( - None, description=_TransactionDescriptions.plaid_account_id - ) - plaid_account_name: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_name - ) - plaid_account_mask: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_mask - ) - institution_name: Optional[str] = Field( - None, description=_TransactionDescriptions.institution_name - ) - plaid_account_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.plaid_account_display_name - ) - plaid_metadata: Optional[Dict[str, Any]] = Field( - None, description=_TransactionDescriptions.plaid_metadata - ) - source: Optional[str] = Field(None, description=_TransactionDescriptions.source) - display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.display_name - ) - display_notes: Optional[str] = Field( - None, description=_TransactionDescriptions.display_notes - ) - account_display_name: Optional[str] = Field( - None, description=_TransactionDescriptions.account_display_name - ) - tags: Optional[List[TagsObject]] = Field(None, description="Array of Tag objects") - external_id: Optional[str] = Field( - None, max_length=75, description=_TransactionDescriptions.external_id - ) - children: Optional[List[TransactionChildObject]] = Field( - None, description=_TransactionDescriptions.children - ) - - @field_validator("plaid_metadata", mode="before") - def to_json(cls, x: Optional[str]) -> Optional[Dict[str, Any]]: - """ - Check a result - """ - if x is None: - return None - elif isinstance(x, dict): - return x - else: - return pydantic_core.from_json(x) - - def get_update_object(self) -> TransactionUpdateObject: - """ - Return a TransactionUpdateObject - - Return a TransactionUpdateObject to update an expense. Simply - change one of the properties and perform an `update_transaction` with - your Lunchable object. - - Returns - ------- - TransactionUpdateObject - """ - update_dict = self.model_dump() - try: - TransactionUpdateObject.StatusEnum(self.status) - except ValueError: - update_dict["status"] = None - update_object = TransactionUpdateObject.model_validate(update_dict) - if update_object.tags is not None: - tags = [] if self.tags is None else self.tags - update_object.tags = [tag.name for tag in tags] - return update_object - - def get_insert_object(self) -> TransactionInsertObject: - """ - Return a TransactionInsertObject - - Return a TransactionInsertObject to update an expense. Simply - change some of the properties and perform an `insert_transactions` with - your Lunchable object. - - Returns - ------- - TransactionInsertObject - """ - insert_dict = self.model_dump() - try: - TransactionInsertObject.StatusEnum(self.status) - except ValueError: - insert_dict["status"] = None - insert_object = TransactionInsertObject.model_validate(insert_dict) - if insert_object.tags is not None: - tags = [] if self.tags is None else self.tags - insert_object.tags = [tag.name for tag in tags] - return insert_object - - -class _TransactionsResponse(LunchableModel): - """ - HTTP Response for Transactions - """ - - transactions: List[TransactionObject] - has_more: bool = False - - -class _TransactionParamsGet(LunchableModel): - """ - https://lunchmoney.dev/#get-all-transactions - """ - - tag_id: Optional[int] = None - recurring_id: Optional[int] = None - plaid_account_id: Optional[int] = None - category_id: Optional[int] = None - asset_id: Optional[int] = None - group_id: Optional[int] = None - is_group: Optional[bool] = None - status: Optional[FullStatusEnum] = None - offset: Optional[int] = None - limit: Optional[int] = None - start_date: Optional[datetime.date] = None - end_date: Optional[datetime.date] = None - debit_as_negative: Optional[bool] = None - pending: Optional[bool] = None - - -class _TransactionInsertParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#insert-transactions - """ - - transactions: List[TransactionInsertObject] - apply_rules: Optional[bool] = None - skip_duplicates: Optional[bool] = None - check_for_recurring: Optional[bool] = None - debit_as_negative: Optional[bool] = None - skip_balance_update: Optional[bool] = None - - -class _TransactionGroupParamsPost(LunchableModel): - """ - https://lunchmoney.dev/#create-transaction-group - """ - - date: datetime.date - payee: str - category_id: Optional[int] = None - notes: Optional[str] = None - tags: Optional[List[int]] = None - transactions: List[int] - - -class _TransactionUpdateParamsPut(LunchableModel): - """ - https://lunchmoney.dev/#update-transaction - """ - - split: Optional[List[TransactionSplitObject]] = None - transaction: Optional[TransactionUpdateObject] = None - debit_as_negative: Optional[bool] = None - skip_balance_update: Optional[bool] = None - - -class _TransactionsUnsplitPost(LunchableModel): - """ - https://lunchmoney.dev/#unsplit-transactions - """ - - parent_ids: List[int] - remove_parents: Optional[bool] = None - - -class TransactionsClient(LunchMoneyAPIClient): - """ - Lunch Money Transactions Interactions - """ - - def get_transactions( - self, - start_date: Optional[Union[datetime.date, datetime.datetime, str]] = None, - end_date: Optional[Union[datetime.date, datetime.datetime, str]] = None, - tag_id: Optional[int] = None, - recurring_id: Optional[int] = None, - plaid_account_id: Optional[int] = None, - category_id: Optional[int] = None, - asset_id: Optional[int] = None, - group_id: Optional[int] = None, - is_group: Optional[bool] = None, - status: Optional[str] = None, - offset: Optional[int] = None, - limit: Optional[int] = None, - debit_as_negative: Optional[bool] = None, - pending: Optional[bool] = None, - params: Optional[Dict[str, Any]] = None, - ) -> List[TransactionObject]: - """ - Get Transactions Using Criteria - - Use this to retrieve all transactions between a date range (this method handles - pagination automatically unless you specify a limit / offset argument). Returns - list of Transaction objects. If no query parameters are set, this will return - transactions for the current calendar month. If either start_date or end_date are - datetime.datetime objects, they will be reduced to dates. If a string is provided, - it will be attempted to be parsed as YYYY-MM-DD format. - - Parameters - ---------- - start_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the beginning of the time period to fetch transactions for. Defaults - to beginning of current month. Required if end_date exists. Format: YYYY-MM-DD. - end_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the end of the time period you'd like to get transactions for. - Defaults to end of current month. Required if start_date exists. - tag_id: Optional[int] - Filter by tag. Only accepts IDs, not names. - recurring_id: Optional[int] - Filter by recurring expense - plaid_account_id: Optional[int] - Filter by Plaid account - category_id: Optional[int] - Filter by category. Will also match category groups. - asset_id: Optional[int] - Filter by asset - group_id: Optional[int] - Filter by group_id (if the transaction is part of a specific group) - is_group: Optional[bool] - Filter by group (returns transaction groups) - status: Optional[str] - Filter by status (Can be cleared or uncleared. For recurring - transactions, use recurring) - offset: Optional[int] - Sets the offset for the records returned (disables - automatic pagination) - limit: Optional[int] - Sets the maximum number of records to return. Defaults to 1000 - (disables automatic pagination) - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative amounts and - credits as positive amounts. Defaults to false. - pending: Optional[bool] - Pass in true if you'd like to include imported transactions with a pending status. - params: Optional[dict] - Additional Query String Params - - Returns - ------- - List[TransactionObject] - A list of transactions - - Examples - -------- - Retrieve a list of - [TransactionObject][lunchable.models.transactions.TransactionObject] - - ```python - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transactions = lunch.get_transactions(start_date="2020-01-01", - end_date="2020-01-31") - ``` - """ - search_params = _TransactionParamsGet( - tag_id=tag_id, - recurring_id=recurring_id, - plaid_account_id=plaid_account_id, - category_id=category_id, - asset_id=asset_id, - group_id=group_id, - is_group=is_group, - status=status, - offset=offset, - limit=limit, - start_date=start_date, - end_date=end_date, - debit_as_negative=debit_as_negative, - pending=pending, - ).model_dump(exclude_none=True) - search_params.update(params if params is not None else {}) - auto_paginate = all( - [ - offset is None, - search_params.get("offset") is None, - limit is None, - search_params.get("limit") is None, - ] - ) - transactions = self._get_transactions( - search_params=search_params, - paginate=auto_paginate, - ) - return transactions - - def _get_transactions( - self, - search_params: Dict[str, Any], - existing_transactions: Optional[List[TransactionObject]] = None, - paginate: bool = True, - ) -> List[TransactionObject]: - """ - Paginate Transactions - """ - existing_transactions = existing_transactions or [] - transaction_response = self.make_request( - method=self.Methods.GET, - url_path=APIConfig.LUNCHMONEY_TRANSACTIONS, - params=search_params, - ) - transaction_response = _TransactionsResponse.model_validate( - transaction_response - ) - existing_transactions.extend(transaction_response.transactions) - if transaction_response.has_more and paginate: - search_params["offset"] = len(existing_transactions) - return self._get_transactions( - existing_transactions=existing_transactions, - search_params=search_params, - paginate=True, - ) - return existing_transactions - - def get_transaction( - self, transaction_id: int, debit_as_negative: Optional[bool] = None - ) -> TransactionObject: - """ - Get a Transaction by ID - - Parameters - ---------- - transaction_id: int - Lunch Money Transaction ID - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative - amounts and credits as positive amounts. Defaults to false. - - Returns - ------- - TransactionObject - - Examples - -------- - Retrieve a single transaction by its ID - - ```python - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transaction = lunch.get_transaction(transaction_id=1234) - ``` - - The above code returns a - [TransactionObject][lunchable.models.transactions.TransactionObject] - with ID # 1234 (assuming it exists) - """ - response_data = self.make_request( - method=self.Methods.GET, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, transaction_id], - params={"debit_as_negative": debit_as_negative} - if debit_as_negative is not None - else {}, - ) - return TransactionObject.model_validate(response_data) - - ListOrSingleTransactionUpdateObject = Optional[ - Union[TransactionUpdateObject, TransactionObject] - ] - - ListOrSingleTransactionInsertObject = Union[ - TransactionObject, - TransactionInsertObject, - List[TransactionObject], - List[TransactionInsertObject], - List[Union[TransactionObject, TransactionInsertObject]], - ] - - def update_transaction( - self, - transaction_id: int, - transaction: ListOrSingleTransactionUpdateObject = None, - split: Optional[List[TransactionSplitObject]] = None, - debit_as_negative: Optional[bool] = None, - skip_balance_update: Optional[bool] = None, - ) -> Dict[str, Any]: - """ - Update a Transaction - - Use this endpoint to update a single transaction. You may also use this - to split an existing transaction. If a TransactionObject is provided it will be - converted into a TransactionUpdateObject. - - PUT https://dev.lunchmoney.app/v1/transactions/:transaction_id - - Parameters - ---------- - transaction_id: int - Lunch Money Transaction ID - transaction: ListOrSingleTransactionUpdateObject - Object to update with - split: Optional[List[TransactionSplitObject]] - Defines the split of a transaction. You may not split an already-split - transaction, recurring transaction, or group transaction. - debit_as_negative: Optional[bool] - If true, will assume negative amount values denote expenses and - positive amount values denote credits. Defaults to false. - skip_balance_update: Optional[bool] - If false, will skip updating balance if an asset_id - is present for any of the transactions. - - Returns - ------- - Dict[str, Any] - - Examples - -------- - Update a transaction with a - [TransactionUpdateObject][lunchable.models.transactions.TransactionUpdateObject] - - ```python - from datetime import datetime - - from lunchable import LunchMoney, TransactionUpdateObject - - lunch = LunchMoney(access_token="xxxxxxx") - transaction_note = f"Updated on {datetime.now()}" - notes_update = TransactionUpdateObject(notes=transaction_note) - response = lunch.update_transaction(transaction_id=1234, - transaction=notes_update) - ``` - - Update a - [TransactionObject][lunchable.models.transactions.TransactionObject] - with itself - - ```python - from datetime import datetime, timedelta - - from lunchable import LunchMoney - - lunch = LunchMoney(access_token="xxxxxxx") - transaction = lunch.get_transaction(transaction_id=1234) - - transaction.notes = f"Updated on {datetime.now()}" - transaction.date = transaction.date + timedelta(days=1) - response = lunch.update_transaction(transaction_id=transaction.id, - transaction=transaction) - ``` - """ - payload = _TransactionUpdateParamsPut( - split=split, - debit_as_negative=debit_as_negative, - skip_balance_update=skip_balance_update, - ).model_dump(exclude_none=True) - if transaction is None and split is None: - raise LunchMoneyError("You must update the transaction or provide a split") - elif transaction is not None: - if isinstance(transaction, TransactionObject): - transaction = transaction.get_update_object() - payload["transaction"] = transaction.model_dump(exclude_unset=True) - response_data = self.make_request( - method=self.Methods.PUT, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, transaction_id], - payload=payload, - ) - return response_data - - def insert_transactions( - self, - transactions: ListOrSingleTransactionInsertObject, - apply_rules: Optional[bool] = None, - skip_duplicates: Optional[bool] = None, - debit_as_negative: Optional[bool] = None, - check_for_recurring: Optional[bool] = None, - skip_balance_update: Optional[bool] = None, - ) -> List[int]: - """ - Create One or Many Lunch Money Transactions - - Use this endpoint to insert many transactions at once. Also accepts - a single transaction as well. If a TransactionObject is provided it will be - converted into a TransactionInsertObject. - - https://lunchmoney.dev/#insert-transactions - - Parameters - ---------- - transactions: ListOrSingleTransactionTypeObject - Transactions to insert. Either a single TransactionInsertObject object or - a list of them - apply_rules: Optional[bool] - If true, will apply account's existing rules to the inserted transactions. - Defaults to false. - skip_duplicates: Optional[bool] - If true, the system will automatically dedupe based on transaction date, - payee and amount. Note that deduping by external_id will occur regardless - of this flag. - check_for_recurring: Optional[bool] - if true, will check new transactions for occurrences of new monthly expenses. - Defaults to false. - debit_as_negative: Optional[bool] - If true, will assume negative amount values denote expenses and - positive amount values denote credits. Defaults to false. - skip_balance_update: Optional[bool] - If false, will skip updating balance if an asset_id - is present for any of the transactions. - - Returns - ------- - List[int] - - Examples - -------- - Create a new transaction with a - [TransactionInsertObject][lunchable.models.transactions.TransactionInsertObject] - - ```python - from lunchable import LunchMoney, TransactionInsertObject - - lunch = LunchMoney(access_token="xxxxxxx") - - new_transaction = TransactionInsertObject(payee="Example Restaurant", - amount=120.00, - notes="Saturday Dinner") - new_transaction_ids = lunch.insert_transactions(transactions=new_transaction) - ``` - """ - insert_objects = [] - if not isinstance(transactions, list): - transactions = [transactions] - for item in transactions: - if isinstance(item, TransactionObject): - insert_objects.append(item.get_insert_object()) - elif isinstance(item, TransactionInsertObject): - insert_objects.append(item) - else: - raise LunchMoneyError( - "Only TransactionObjects or TransactionInsertObjects are " - "supported by this function." - ) - payload = _TransactionInsertParamsPost( - transactions=insert_objects, - apply_rules=apply_rules, - skip_duplicates=skip_duplicates, - check_for_recurring=check_for_recurring, - debit_as_negative=debit_as_negative, - skip_balance_update=skip_balance_update, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=APIConfig.LUNCHMONEY_TRANSACTIONS, - payload=payload, - ) - ids: List[int] = response_data["ids"] if response_data else [] - return ids - - def insert_transaction_group( - self, - date: datetime.date, - payee: str, - transactions: List[int], - category_id: Optional[int] = None, - notes: Optional[str] = None, - tags: Optional[List[int]] = None, - ) -> int: - """ - Create a Transaction Group of Two or More Transactions - - Returns the ID of the newly created transaction group - - Parameters - ---------- - date: datetime.date - Date for the grouped transaction - payee: str - Payee name for the grouped transaction - category_id: Optional[int] - Category for the grouped transaction - notes: Optional[str] - Notes for the grouped transaction - tags: Optional[List[int]] - Array of tag IDs for the grouped transaction - transactions: Optional[List[int]] - Array of transaction IDs to be part of the transaction group - - Returns - ------- - int - """ - if len(transactions) < 2: - raise LunchMoneyError( - "You must include 2 or more transactions " "in the Transaction Group" - ) - transaction_params = _TransactionGroupParamsPost( - date=date, - payee=payee, - category_id=category_id, - notes=notes, - tags=tags, - transactions=transactions, - ).model_dump(exclude_none=True) - response_data = self.make_request( - method=self.Methods.POST, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - ], - payload=transaction_params, - ) - return response_data - - def remove_transaction_group(self, transaction_group_id: int) -> List[int]: - """ - Delete a Transaction Group - - Use this method to delete a transaction group. The transactions within the - group will not be removed. - - Returns the IDs of the transactions that were part of the deleted group - - https://lunchmoney.dev/#delete-transaction-group - - Parameters - ---------- - transaction_group_id: int - Transaction Group Identifier - - Returns - ------- - List[int] - """ - response_data = self.make_request( - method=self.Methods.DELETE, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - transaction_group_id, - ], - ) - return response_data["transactions"] - - def unsplit_transactions( - self, parent_ids: List[int], remove_parents: Optional[bool] = None - ) -> List[int]: - """ - Unsplit Transactions - - Use this endpoint to unsplit one or more transactions. - - Returns an array of IDs of deleted transactions - - https://lunchmoney.dev/#unsplit-transactions - - Parameters - ---------- - parent_ids: List[int] - Array of transaction IDs to unsplit. If one transaction is unsplittable, - no transaction will be unsplit. - remove_parents: Optional[bool] - If true, deletes the original parent transaction as well. Note, - this is unreversable! - - Returns - ------- - List[int] - """ - response_data = self.make_request( - method=self.Methods.POST, - url_path=[APIConfig.LUNCHMONEY_TRANSACTIONS, "unsplit"], - payload=_TransactionsUnsplitPost( - parent_ids=parent_ids, remove_parents=remove_parents - ).model_dump(exclude_none=True), - ) - return response_data - - def get_transaction_group(self, transaction_id: int) -> TransactionObject: - """ - Get a Transaction Group - - Parameters - ---------- - transaction_id: int - Transaction ID of either the parent or any of the children - in the transaction group - - Returns - ------- - TransactionObject - The transaction group as a `TransactionObject` - """ - response_data = self.make_request( - method=self.Methods.GET, - params={"transaction_id": transaction_id}, - url_path=[ - APIConfig.LUNCHMONEY_TRANSACTIONS, - APIConfig.LUNCHMONEY_TRANSACTION_GROUPS, - ], - ) - return TransactionObject.model_validate(response_data) diff --git a/lunchable/models/user.py b/lunchable/models/user.py deleted file mode 100644 index 6830368c..00000000 --- a/lunchable/models/user.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Lunch Money - User - -https://lunchmoney.dev/#user -""" - -import logging -from typing import Optional - -from pydantic import Field - -from lunchable._config import APIConfig -from lunchable.models._base import LunchableModel -from lunchable.models._core import LunchMoneyAPIClient - -logger = logging.getLogger(__name__) - - -class UserObject(LunchableModel): - """ - The LunchMoney `User` object - - https://lunchmoney.dev/#user-object - """ - - user_id: int = Field(description="Unique identifier for user") - user_name: str = Field(description="User's' name") - user_email: str = Field(description="User's' Email") - account_id: int = Field( - description="Unique identifier for the associated budgeting account" - ) - budget_name: str = Field(description="Name of the associated budgeting account") - api_key_label: Optional[str] = Field( - None, - description="User-defined label of the developer API key used. " - "Returns null if nothing has been set.", - ) - - -class UserClient(LunchMoneyAPIClient): - """ - Lunch Money Interactions for Non Finance Operations - """ - - def get_user(self) -> UserObject: - """ - Get Personal User Details - - Use this endpoint to get details on the current user. - - https://lunchmoney.dev/#get-user - - Returns - ------- - UserObject - """ - response_data = self.make_request( - method=self.Methods.GET, url_path=APIConfig.LUNCHMONEY_ME - ) - me = UserObject.model_validate(response_data) - return me diff --git a/lunchable/plugins/__init__.py b/lunchable/plugins/__init__.py deleted file mode 100644 index e79bd437..00000000 --- a/lunchable/plugins/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Optional Plugins for LunchMoney -""" - -from lunchable.plugins.app import LunchableApp, LunchableModelType - -__all__ = [ - "LunchableApp", - "LunchableModelType", -] diff --git a/lunchable/plugins/app.py b/lunchable/plugins/app.py deleted file mode 100644 index 424e454e..00000000 --- a/lunchable/plugins/app.py +++ /dev/null @@ -1,398 +0,0 @@ -""" -Base Classes for lunchable-app -""" - -from __future__ import annotations - -import datetime -import functools -import logging -from abc import ABC, abstractmethod -from typing import Any, Callable, ClassVar, Dict, List, Tuple, Type, TypeVar, overload - -from pydantic import BaseModel, Field - -from lunchable import LunchMoney -from lunchable.models import ( - AssetsObject, - CategoriesObject, - CryptoObject, - LunchableModel, - PlaidAccountObject, - TagsObject, - TransactionObject, - UserObject, -) - -logger = logging.getLogger(__name__) - -LunchableModelType = TypeVar("LunchableModelType", bound=LunchableModel) - - -class LunchableData(BaseModel): - """ - Data Container for Lunchable App Data - """ - - plaid_accounts: Dict[int, PlaidAccountObject] = Field( - default_factory=dict, description="Plaid Accounts" - ) - transactions: Dict[int, TransactionObject] = Field( - default_factory=dict, description="Transactions" - ) - categories: Dict[int, CategoriesObject] = Field( - default_factory=dict, description="Categories" - ) - assets: Dict[int, AssetsObject] = Field(default_factory=dict, description="Assets") - tags: Dict[int, TagsObject] = Field(default_factory=dict, description="Tags") - crypto: Dict[int, CryptoObject] = Field(default_factory=dict, description="Crypto") - user: UserObject = Field( - UserObject( - user_id=0, user_name="", user_email="", account_id=0, budget_name="" - ), - description="User", - ) - - @property - def asset_map(self) -> Dict[int, PlaidAccountObject | AssetsObject]: - """ - Asset Mapping Across Plaid Accounts and Assets - - Returns - ------- - Dict[int, Union[PlaidAccountObject, AssetsObject]] - """ - return { - **self.plaid_accounts, - **self.assets, - } - - @property - def plaid_accounts_list(self) -> List[PlaidAccountObject]: - """ - List of Plaid Accounts - - Returns - ------- - List[PlaidAccountObject] - """ - return list(self.plaid_accounts.values()) - - @property - def assets_list(self) -> List[AssetsObject]: - """ - List of Assets - - Returns - ------- - List[AssetsObject] - """ - return list(self.assets.values()) - - @property - def transactions_list(self) -> List[TransactionObject]: - """ - List of Transactions - - Returns - ------- - List[TransactionObject] - """ - return list(self.transactions.values()) - - @property - def categories_list(self) -> List[CategoriesObject]: - """ - List of Categories - - Returns - ------- - List[CategoriesObject] - """ - return list(self.categories.values()) - - @property - def tags_list(self) -> List[TagsObject]: - """ - List of Tags - - Returns - ------- - List[TagsObject] - """ - return list(self.tags.values()) - - @property - def crypto_list(self) -> List[CryptoObject]: - """ - List of Crypto - - Returns - ------- - List[CryptoObject] - """ - return list(self.crypto.values()) - - -class BaseLunchableApp(ABC): - """ - Abstract Base Class for Lunchable Apps - """ - - @property - def _lunchable_data_mapping( - self, - ) -> Dict[ - Type[LunchableModel], - Tuple[str, Callable[[], List[LunchableModel] | LunchableModel]], - ]: - """ - Mapping of Lunchable Objects to their Data Collecting Info - """ - return { - PlaidAccountObject: ("plaid_accounts", self.lunch.get_plaid_accounts), - TransactionObject: ("transactions", self.lunch.get_transactions), - CategoriesObject: ("categories", self.lunch.get_categories), - AssetsObject: ("assets", self.lunch.get_assets), - TagsObject: ("tags", self.lunch.get_tags), - UserObject: ("user", self.lunch.get_user), - CryptoObject: ("crypto", self.lunch.get_crypto), - } - - def __init__(self, access_token: str | None = None): - """ - Lunchable App Initialization - - Parameters - ---------- - access_token: Optional[str] - Lunchmoney Developer API Access Token. Inherited from - `LUNCHMONEY_ACCESS_TOKEN` environment variable if not provided - """ - self.lunch = LunchMoney(access_token=access_token) - self.data = LunchableData() - - @property - @abstractmethod - def lunchable_models(self) -> List[Type[LunchableModel]]: - """ - Every LunchableApp should define which data objects it depends on - - Returns - ------- - List[LunchableDataModel] - """ - - @overload - def refresh(self, model: Type[UserObject], **kwargs: Any) -> UserObject: - ... - - @overload - def refresh( - self, model: Type[LunchableModelType], **kwargs: Any - ) -> Dict[int, LunchableModelType]: - ... - - def refresh( - self, model: Type[LunchableModel], **kwargs: Any - ) -> LunchableModel | Dict[int, LunchableModel]: - """ - Refresh a Lunchable Model - - Parameters - ---------- - model: Type[LunchableModel] - Type of Lunchable Model to refresh - kwargs: Any - Additional keyword arguments to pass to the function that - fetches the data. - - Returns - ------- - LunchableModel | Dict[int, LunchableModel] - Unless you're requesting the `UserObject`, this method will return a - dictionary of the refreshed data, keyed by the object's ID. - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import CategoriesObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - categories: Dict[int, CategoriesObject] = app.refresh(CategoriesObject) - ``` - """ - try: - attr_name, data_getter = self._lunchable_data_mapping[model] - fetch_data_function = functools.partial(data_getter, **kwargs) - except KeyError as e: - msg = f"Model not supported by Lunchable App: {model.__name__}" - raise NotImplementedError(msg) from e - fetched_data = fetch_data_function() - if isinstance(fetched_data, UserObject): - data_mapping = fetched_data - else: - data_mapping = {item.id: item for item in fetched_data} # type: ignore[assignment] - setattr(self.data, attr_name, data_mapping) - return data_mapping - - def refresh_data(self, models: List[Type[LunchableModel]] | None = None) -> None: - """ - Refresh the data in the Lunchable App - - Parameters - ---------- - models: List[Type[LunchableModel]] | None - Explicit list of Lunchable Models to refresh. If not provided, - all models defined in will be refreshed (which by default is - all of them except for transactions) - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import PlaidAccountObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - app.refresh_data() - plaid_accounts: Dict[int, PlaidAccountObject] = app.data.plaid_accounts - ``` - - ```python - from typing import Dict - - from lunchable.models import AssetsObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - app.refresh_data(models=[AssetsObject]) - assets: Dict[int, AssetsObject] = app.data.assets - ``` - """ - refresh_models = models or self.lunchable_models - for model in refresh_models: - self.refresh(model) - - def refresh_transactions( - self, - start_date: datetime.date | datetime.datetime | str | None = None, - end_date: datetime.date | datetime.datetime | str | None = None, - tag_id: int | None = None, - recurring_id: int | None = None, - plaid_account_id: int | None = None, - category_id: int | None = None, - asset_id: int | None = None, - group_id: int | None = None, - is_group: bool | None = None, - status: str | None = None, - debit_as_negative: bool | None = None, - pending: bool | None = None, - params: Dict[str, Any] | None = None, - ) -> Dict[int, TransactionObject]: - """ - Refresh App data with the latest transactions - - Parameters - ---------- - start_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the beginning of the time period to fetch transactions for. - Defaults to beginning of current month. Required if end_date exists. - Format: YYYY-MM-DD. - end_date: Optional[Union[datetime.date, datetime.datetime, str]] - Denotes the end of the time period you'd like to get transactions for. - Defaults to end of current month. Required if start_date exists. - tag_id: Optional[int] - Filter by tag. Only accepts IDs, not names. - recurring_id: Optional[int] - Filter by recurring expense - plaid_account_id: Optional[int] - Filter by Plaid account - category_id: Optional[int] - Filter by category. Will also match category groups. - asset_id: Optional[int] - Filter by asset - group_id: Optional[int] - Filter by group_id (if the transaction is part of a specific group) - is_group: Optional[bool] - Filter by group (returns transaction groups) - status: Optional[str] - Filter by status (Can be cleared or uncleared. For recurring - transactions, use recurring) - debit_as_negative: Optional[bool] - Pass in true if you'd like expenses to be returned as negative amounts and - credits as positive amounts. Defaults to false. - pending: Optional[bool] - Pass in true if you'd like to include imported transactions with a - pending status. - params: Optional[dict] - Additional Query String Params - - Returns - ------- - Dict[int, TransactionObject] - - Examples - -------- - ```python - from typing import Dict - - from lunchable.models import TransactionObject - from lunchable.plugins import LunchableApp - - app = LunchableApp() - transactions: Dict[int, TransactionObject] = app.refresh_transactions( - start_date="2021-01-01", end_date="2021-01-31" - ) - ``` - """ - transactions = self.lunch.get_transactions( - start_date=start_date, - end_date=end_date, - tag_id=tag_id, - recurring_id=recurring_id, - plaid_account_id=plaid_account_id, - category_id=category_id, - asset_id=asset_id, - group_id=group_id, - is_group=is_group, - status=status, - debit_as_negative=debit_as_negative, - pending=pending, - params=params, - ) - transaction_map = {item.id: item for item in transactions} - self.data.transactions.update(transaction_map) - return transaction_map - - def clear_transactions(self) -> None: - """ - Clear Transactions from the App - """ - self.data.transactions.clear() - - -class LunchableApp(BaseLunchableApp): - """ - Pre-Built Lunchable App - - This app comes with a `data` property which represents all the base data - the app should need. - - This app comes with a `refresh_data` method which will refresh all of the - data in the app, except for transactions. To refresh transactions, use the - `refresh_transactions` method. - """ - - lunchable_models: ClassVar[List[Type[LunchableModel]]] = [ - PlaidAccountObject, - CategoriesObject, - AssetsObject, - TagsObject, - UserObject, - CryptoObject, - ] diff --git a/lunchable/py.typed b/lunchable/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/mkdocs.yaml b/mkdocs.yaml deleted file mode 100644 index 72ff4005..00000000 --- a/mkdocs.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# $schema: https://squidfunk.github.io/mkdocs-material/schema.json - -site_name: lunchable -nav: -- Home 🏠: index.md -- Usage 📖: usage.md -- LunchMoney 🍽️: interacting.md -- Apps and Plugins 🧩: plugins.md -- Command Line Interface ⌨️: cli.md -- API Documentation 🤖: reference/ -- Contributing 🤝: contributing.md -theme: - favicon: https://juftin.com/favicon.ico - logo: https://raw.githubusercontent.com/juftin/juftin/main/static/juftin.png - name: material - features: - - navigation.tracking - - content.code.annotate - - content.code.copy - - navigation.indexes - palette: - - media: '(prefers-color-scheme: light)' - scheme: default - accent: purple - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - media: '(prefers-color-scheme: dark)' - scheme: slate - primary: black - toggle: - icon: material/weather-night - name: Switch to light mode -repo_url: https://github.com/juftin/lunchable -repo_name: lunchable -edit_uri: blob/main/docs/ -site_author: juftin -remote_branch: gh-pages -#copyright: Copyright © 2023 Justin Flannery -extra: - generator: false -markdown_extensions: -- toc: - permalink: '#' -- pymdownx.snippets: -- pymdownx.magiclink -- attr_list -- md_in_html -- pymdownx.highlight: - anchor_linenums: true -- pymdownx.inlinehilite -- pymdownx.superfences -- markdown.extensions.attr_list -- pymdownx.keys -- pymdownx.tasklist -- pymdownx.tilde -- callouts -- pymdownx.details -- pymdownx.emoji -- pymdownx.tabbed: - alternate_style: true -- mkdocs-click: -plugins: -- search -- markdown-exec -- section-index -- autorefs -- mkdocstrings: - handlers: - python: - import: - - https://docs.python.org/3/objects.inv - - https://pandas.pydata.org/docs/objects.inv - options: - docstring_style: numpy - extensions: - - griffe_fieldz -- gen-files: - scripts: - - docs/gen_pages.py -- literate-nav: - nav_file: SUMMARY.md diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 9bd55549..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,240 +0,0 @@ -[build-system] -build-backend = "hatchling.build" -requires = ["hatchling"] - -[project] -authors = [ - {name = "Justin Flannery", email = "juftin@juftin.com"} -] -classifiers = [ - "License :: OSI Approved :: MIT License", - "Development Status :: 5 - Production/Stable", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy" -] -dependencies = [ - "click>=8.0.1", - "pydantic>=2,<3", - "rich>=10.0.0", - "httpx", - "importlib_metadata>=3.6", - "click-plugins>=1.1.1" -] -description = "A simple Python SDK around the Lunch Money Developer API" -dynamic = ["version"] -keywords = ["lunchmoney", "python", "pydantic", "api-client"] -license = "MIT" -name = "lunchable" -readme = "README.md" -requires-python = ">=3.8,<4" - -[project.optional-dependencies] -all = [ - "lunchable-primelunch", - "lunchable-pushlunch", - "lunchable-splitlunch" -] -plugins = [ - "lunchable-primelunch", - "lunchable-pushlunch", - "lunchable-splitlunch" -] -primelunch = ["lunchable-primelunch"] -pushlunch = ["lunchable-pushlunch"] -splitlunch = ["lunchable-splitlunch"] - -[project.scripts] -lunchable = "lunchable._cli:cli" - -[project.urls] -Changelog = "https://github.com/juftin/lunchable/releases" -Discussions = "https://github.com/juftin/lunchable/discussions" -Docker = "https://hub.docker.com/r/juftin/lunchable" -Documentation = "https://github.com/juftin/lunchable#readme" -Issues = "https://github.com/juftin/lunchable/issues" -Source = "https://github.com/juftin/lunchable" - -[tool.coverage.paths] -lunchable = ["lunchable", "*/lunchable/lunchable"] -tests = ["tests", "*/lunchable/tests"] - -[tool.coverage.report] -exclude_lines = [ - "no cov", - "if __name__ == .__main__.:", - "if TYPE_CHECKING:" -] - -[tool.coverage.run] -branch = true -omit = [ - "lunchable/_version.py" -] -parallel = true -source_pkgs = ["lunchable", "tests"] - -[tool.hatch.env] -requires = ["hatch-pip-compile", "hatch-mkdocs"] - -[tool.hatch.env.collectors.mkdocs.docs] -path = "mkdocs.yaml" - -[tool.hatch.envs.all] -pip-compile-constraint = "" -template = "test" - -[[tool.hatch.envs.all.matrix]] -python = ["3.8", "3.9", "3.10", "3.11", "3.12"] - -[tool.hatch.envs.default] -features = ["all"] -pip-compile-args = [ - "--unsafe-package", - "lunchable" -] -pip-compile-constraint = "default" -post-install-commands = [ - "- pre-commit install" -] -type = "pip-compile" - -[tool.hatch.envs.default.scripts] -cov = "hatch run test:cov {args:}" -test = "hatch run test:test {args:}" - -[tool.hatch.envs.docs] -detached = false -extra-dependencies = [ - "griffe-fieldz" -] -features = ["all"] -pip-compile-args = [ - "--unsafe-package", - "lunchable" -] -pip-compile-constraint = "default" -template = "docs" -type = "pip-compile" - -[tool.hatch.envs.gen] -detached = true - -[tool.hatch.envs.gen.scripts] -release = [ - "npm install --prefix .github/semantic_release/", - "npx --prefix .github/semantic_release/ semantic-release {args:}" -] - -[tool.hatch.envs.lint] -dependencies = [ - "mypy>=1.6.1", - "ruff~=0.1.7", - "pydantic" -] -detached = true -pip-compile-constraint = "default" -type = "pip-compile" - -[tool.hatch.envs.lint.scripts] -all = [ - "style", - "typing" -] -fmt = [ - "ruff format {args:.}", - "ruff --fix {args:.}", - "style" -] -precommit = [ - "pre-commit run --all-files" -] -style = [ - "ruff {args:.}", - "ruff format --check --diff {args:.}" -] -typing = [ - """ - mypy \ - --install-types \ - --ignore-missing-imports \ - --follow-imports=skip \ - --strict-optional \ - --non-interactive \ - {args:lunchable/} - """ -] - -[tool.hatch.envs.test] -dependencies = [ - "pytest", - "pytest-cov", - "pytest-mock", - "vcrpy~=5.1.0" -] - -[tool.hatch.envs.test.scripts] -cov = "pytest --cov --cov-config=pyproject.toml --cov-report term-missing {args:tests}" -test = "pytest {args:tests}" - -[tool.hatch.version] -path = "lunchable/_version.py" - -[tool.mypy] -check_untyped_defs = true -disallow_any_generics = true -disallow_untyped_defs = true -follow_imports = "silent" -no_implicit_reexport = true -plugins = [ - "pydantic.mypy" -] -warn_redundant_casts = true -warn_unused_ignores = true - -[[tool.mypy.overrides]] -ignore_missing_imports = true -module = [ - "pytest.*" -] - -[tool.pydantic-mypy] -init_forbid_extra = true -init_typed = true -warn_required_dynamic_aliases = true -warn_untyped_fields = true - -[tool.ruff] -ignore = [ - "E501", # line too long, handled by black - "PLR0913", # Too many arguments to function call - "PLW2901", # Outer for loop variable overwritten by inner assignment target - "RUF001", # String contains ambiguous unicode character `’` - "PLR2004", # Magic value used in comparison - "RUF012" # Mutable class attributes should be annotated with `typing.ClassVar` -] -select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # pyflakes - "I", # isort - "C", # flake8-comprehensions - "Q", # flake8-quotes - "B", # flake8-bugbear - "PLE", # pylint - "PLR", # pylint - "PLW", # pylint - "RUF", # ruff - "C90" # mccabe -] - -[tool.ruff.per-file-ignores] -"tests/**" = [ - "PLR2004" # Magic value used in comparison -] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b9f7ed4b..00000000 --- a/requirements.txt +++ /dev/null @@ -1,117 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.default - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.default - # lunchable -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.default - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests -importlib-metadata==7.0.1 - # via - # hatch.envs.default - # lunchable -lunchable-primelunch==1.0.1 - # via hatch.envs.default -lunchable-pushlunch==1.0.1 - # via hatch.envs.default -lunchable-splitlunch==1.0.1 - # via hatch.envs.default -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -pandas==2.2.0 - # via lunchable-primelunch -pydantic==2.6.0 - # via - # hatch.envs.default - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.default - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.10.txt b/requirements/requirements-all.py3.10.txt deleted file mode 100644 index 970802b6..00000000 --- a/requirements/requirements-all.py3.10.txt +++ /dev/null @@ -1,160 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.10 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.10 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.10 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.10 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.10 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.10 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.10 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.10 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.10 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.10 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.10 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.10 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.10 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # anyio - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.10 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.11.txt b/requirements/requirements-all.py3.11.txt deleted file mode 100644 index 48366d14..00000000 --- a/requirements/requirements-all.py3.11.txt +++ /dev/null @@ -1,151 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.11 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.11 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.11 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.11 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.11 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.11 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.11 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.11 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.11 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.11 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.11 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.11 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.11 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.12.txt b/requirements/requirements-all.py3.12.txt deleted file mode 100644 index beaa61ab..00000000 --- a/requirements/requirements-all.py3.12.txt +++ /dev/null @@ -1,151 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.12 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.12 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.12 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.12 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.12 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.12 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.12 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.12 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.12 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.12 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.12 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.12 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.12 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -typing-extensions==4.9.0 - # via - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==2.1.0 - # via requests -vcrpy==5.1.0 - # via hatch.envs.all.py3.12 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.8.txt b/requirements/requirements-all.py3.8.txt deleted file mode 100644 index c391317e..00000000 --- a/requirements/requirements-all.py3.8.txt +++ /dev/null @@ -1,164 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.8 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.8 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.8 - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.8 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.8 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.8 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.8 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.8 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.24.4 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.0.3 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.8 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.8 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.8 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.8 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.8 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # annotated-types - # anyio - # pydantic - # pydantic-core - # rich -tzdata==2023.4 - # via pandas -urllib3==1.26.18 - # via - # requests - # vcrpy -vcrpy==5.1.0 - # via hatch.envs.all.py3.8 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-all.py3.9.txt b/requirements/requirements-all.py3.9.txt deleted file mode 100644 index 5885f4de..00000000 --- a/requirements/requirements-all.py3.9.txt +++ /dev/null @@ -1,160 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.9 -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via pydantic -anyio==4.2.0 - # via httpx -certifi==2023.11.17 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via - # hatch.envs.all.py3.9 - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # hatch.envs.all.py3.9 - # lunchable -coverage==7.4.1 - # via pytest-cov -exceptiongroup==1.2.0 - # via - # anyio - # pytest -h11==0.14.0 - # via httpcore -httpcore==1.0.2 - # via httpx -httpx==0.26.0 - # via - # hatch.envs.all.py3.9 - # lunchable -idna==3.6 - # via - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # hatch.envs.all.py3.9 - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via hatch.envs.all.py3.9 -lunchable-pushlunch==1.0.1 - # via hatch.envs.all.py3.9 -lunchable-splitlunch==1.0.1 - # via hatch.envs.all.py3.9 -markdown-it-py==3.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via pandas -oauthlib==3.2.2 - # via requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # hatch.envs.all.py3.9 - # lunchable -pydantic-core==2.16.1 - # via pydantic -pygments==2.17.2 - # via rich -pytest==8.0.0 - # via - # hatch.envs.all.py3.9 - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.all.py3.9 -pytest-mock==3.12.0 - # via hatch.envs.all.py3.9 -python-dateutil==2.8.2 - # via - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via splitwise -rich==13.7.0 - # via - # hatch.envs.all.py3.9 - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via python-dateutil -sniffio==1.3.0 - # via - # anyio - # httpx -splitwise==2.5.0 - # via lunchable-splitlunch -tomli==2.0.1 - # via - # coverage - # pytest -typing-extensions==4.9.0 - # via - # anyio - # pydantic - # pydantic-core -tzdata==2023.4 - # via pandas -urllib3==1.26.18 - # via - # requests - # vcrpy -vcrpy==5.1.0 - # via hatch.envs.all.py3.9 -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-docs.txt b/requirements/requirements-docs.txt deleted file mode 100644 index 61994b5c..00000000 --- a/requirements/requirements-docs.txt +++ /dev/null @@ -1,294 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - markdown-callouts -# - markdown-exec -# - mkdocs -# - mkdocs-autorefs -# - mkdocs-click -# - mkdocs-gen-files -# - mkdocs-literate-nav -# - mkdocs-material -# - mkdocs-section-index -# - mkdocstrings -# - mkdocstrings-python -# - pymdown-extensions -# - griffe-fieldz -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -anyio==4.2.0 - # via - # -c requirements.txt - # httpx -babel==2.14.0 - # via mkdocs-material -certifi==2023.11.17 - # via - # -c requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via - # -c requirements.txt - # requests -click==8.1.7 - # via - # -c requirements.txt - # hatch.envs.docs - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch - # mkdocs - # mkdocs-click - # mkdocstrings -click-plugins==1.1.1 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -colorama==0.4.6 - # via - # griffe - # mkdocs-material -fieldz==0.0.2 - # via griffe-fieldz -ghp-import==2.1.0 - # via mkdocs -griffe==0.40.0 - # via - # griffe-fieldz - # mkdocstrings-python -griffe-fieldz==0.1.2 - # via hatch.envs.docs -h11==0.14.0 - # via - # -c requirements.txt - # httpcore -httpcore==1.0.2 - # via - # -c requirements.txt - # httpx -httpx==0.26.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -idna==3.6 - # via - # -c requirements.txt - # anyio - # httpx - # requests -importlib-metadata==7.0.1 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -jinja2==3.1.3 - # via - # mkdocs - # mkdocs-material - # mkdocstrings -lunchable-primelunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -lunchable-pushlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -lunchable-splitlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.docs -markdown==3.5.2 - # via - # markdown-callouts - # mkdocs - # mkdocs-autorefs - # mkdocs-click - # mkdocs-material - # mkdocstrings - # pymdown-extensions -markdown-callouts==0.4.0 - # via hatch.envs.docs -markdown-exec==1.8.0 - # via hatch.envs.docs -markdown-it-py==3.0.0 - # via - # -c requirements.txt - # rich -markupsafe==2.1.5 - # via - # jinja2 - # mkdocs - # mkdocstrings -mdurl==0.1.2 - # via - # -c requirements.txt - # markdown-it-py -mergedeep==1.3.4 - # via mkdocs -mkdocs==1.5.3 - # via - # hatch.envs.docs - # mkdocs-autorefs - # mkdocs-gen-files - # mkdocs-literate-nav - # mkdocs-material - # mkdocs-section-index - # mkdocstrings -mkdocs-autorefs==0.5.0 - # via - # hatch.envs.docs - # mkdocstrings -mkdocs-click==0.8.1 - # via hatch.envs.docs -mkdocs-gen-files==0.5.0 - # via hatch.envs.docs -mkdocs-literate-nav==0.6.1 - # via hatch.envs.docs -mkdocs-material==9.5.8 - # via hatch.envs.docs -mkdocs-material-extensions==1.3.1 - # via mkdocs-material -mkdocs-section-index==0.3.8 - # via hatch.envs.docs -mkdocstrings==0.24.0 - # via - # hatch.envs.docs - # mkdocstrings-python -mkdocstrings-python==1.8.0 - # via hatch.envs.docs -numpy==1.26.3 - # via - # -c requirements.txt - # pandas -oauthlib==3.2.2 - # via - # -c requirements.txt - # requests-oauthlib -packaging==23.2 - # via mkdocs -paginate==0.5.6 - # via mkdocs-material -pandas==2.2.0 - # via - # -c requirements.txt - # lunchable-primelunch -pathspec==0.12.1 - # via mkdocs -platformdirs==4.2.0 - # via - # mkdocs - # mkdocstrings -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -pygments==2.17.2 - # via - # -c requirements.txt - # mkdocs-material - # rich -pymdown-extensions==10.7 - # via - # hatch.envs.docs - # markdown-exec - # mkdocs-material - # mkdocstrings -python-dateutil==2.8.2 - # via - # -c requirements.txt - # ghp-import - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via - # -c requirements.txt - # pandas -pyyaml==6.0.1 - # via - # mkdocs - # pymdown-extensions - # pyyaml-env-tag -pyyaml-env-tag==0.1 - # via mkdocs -regex==2023.12.25 - # via mkdocs-material -requests==2.31.0 - # via - # -c requirements.txt - # mkdocs-material - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via - # -c requirements.txt - # splitwise -rich==13.7.0 - # via - # -c requirements.txt - # hatch.envs.docs - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via - # -c requirements.txt - # python-dateutil -sniffio==1.3.0 - # via - # -c requirements.txt - # anyio - # httpx -splitwise==2.5.0 - # via - # -c requirements.txt - # lunchable-splitlunch -typing-extensions==4.9.0 - # via - # -c requirements.txt - # fieldz - # pydantic - # pydantic-core -tzdata==2023.4 - # via - # -c requirements.txt - # pandas -urllib3==2.1.0 - # via - # -c requirements.txt - # requests -watchdog==4.0.0 - # via mkdocs -zipp==3.17.0 - # via - # -c requirements.txt - # importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/requirements/requirements-lint.txt b/requirements/requirements-lint.txt deleted file mode 100644 index b89cde56..00000000 --- a/requirements/requirements-lint.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - mypy>=1.6.1 -# - ruff~=0.1.7 -# - pydantic -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -mypy==1.8.0 - # via hatch.envs.lint -mypy-extensions==1.0.0 - # via mypy -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.lint -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -ruff==0.1.14 - # via hatch.envs.lint -typing-extensions==4.9.0 - # via - # -c requirements.txt - # mypy - # pydantic - # pydantic-core diff --git a/requirements/requirements-test.txt b/requirements/requirements-test.txt deleted file mode 100644 index 8d528777..00000000 --- a/requirements/requirements-test.txt +++ /dev/null @@ -1,209 +0,0 @@ -# -# This file is autogenerated by hatch-pip-compile with Python 3.11 -# -# [constraints] requirements.txt (SHA256: acd01d83136975a189aa0febb52cc548a7e3f3fab4bbc2a61aaf4f2ff45ab979) -# -# - pytest -# - pytest-cov -# - pytest-mock -# - vcrpy~=5.1.0 -# - click-plugins>=1.1.1 -# - click>=8.0.1 -# - httpx -# - importlib-metadata>=3.6 -# - pydantic<3,>=2 -# - rich>=10.0.0 -# - lunchable-primelunch -# - lunchable-pushlunch -# - lunchable-splitlunch -# - -annotated-types==0.6.0 - # via - # -c requirements.txt - # pydantic -anyio==4.2.0 - # via - # -c requirements.txt - # httpx -certifi==2023.11.17 - # via - # -c requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.3.2 - # via - # -c requirements.txt - # requests -click==8.1.7 - # via - # -c requirements.txt - # hatch.envs.test - # click-plugins - # lunchable - # lunchable-primelunch - # lunchable-pushlunch - # lunchable-splitlunch -click-plugins==1.1.1 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -coverage==7.4.1 - # via - # coverage - # pytest-cov -h11==0.14.0 - # via - # -c requirements.txt - # httpcore -httpcore==1.0.2 - # via - # -c requirements.txt - # httpx -httpx==0.26.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -idna==3.6 - # via - # -c requirements.txt - # anyio - # httpx - # requests - # yarl -importlib-metadata==7.0.1 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -iniconfig==2.0.0 - # via pytest -lunchable-primelunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -lunchable-pushlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -lunchable-splitlunch==1.0.1 - # via - # -c requirements.txt - # hatch.envs.test -markdown-it-py==3.0.0 - # via - # -c requirements.txt - # rich -mdurl==0.1.2 - # via - # -c requirements.txt - # markdown-it-py -multidict==6.0.4 - # via yarl -numpy==1.26.3 - # via - # -c requirements.txt - # pandas -oauthlib==3.2.2 - # via - # -c requirements.txt - # requests-oauthlib -packaging==23.2 - # via pytest -pandas==2.2.0 - # via - # -c requirements.txt - # lunchable-primelunch -pluggy==1.4.0 - # via pytest -pydantic==2.6.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable -pydantic-core==2.16.1 - # via - # -c requirements.txt - # pydantic -pygments==2.17.2 - # via - # -c requirements.txt - # rich -pytest==8.0.0 - # via - # hatch.envs.test - # pytest-cov - # pytest-mock -pytest-cov==4.1.0 - # via hatch.envs.test -pytest-mock==3.12.0 - # via hatch.envs.test -python-dateutil==2.8.2 - # via - # -c requirements.txt - # lunchable-splitlunch - # pandas -pytz==2023.4 - # via - # -c requirements.txt - # pandas -pyyaml==6.0.1 - # via vcrpy -requests==2.31.0 - # via - # -c requirements.txt - # requests-oauthlib - # splitwise -requests-oauthlib==1.3.1 - # via - # -c requirements.txt - # splitwise -rich==13.7.0 - # via - # -c requirements.txt - # hatch.envs.test - # lunchable - # lunchable-primelunch - # lunchable-splitlunch -six==1.16.0 - # via - # -c requirements.txt - # python-dateutil -sniffio==1.3.0 - # via - # -c requirements.txt - # anyio - # httpx -splitwise==2.5.0 - # via - # -c requirements.txt - # lunchable-splitlunch -typing-extensions==4.9.0 - # via - # -c requirements.txt - # pydantic - # pydantic-core -tzdata==2023.4 - # via - # -c requirements.txt - # pandas -urllib3==2.1.0 - # via - # -c requirements.txt - # requests -vcrpy==5.1.0 - # via hatch.envs.test -wrapt==1.16.0 - # via vcrpy -yarl==1.9.4 - # via vcrpy -zipp==3.17.0 - # via - # -c requirements.txt - # importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# lunchable diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 2d1cd253..00000000 --- a/tests/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Lunchmoney Tests -""" diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 28fcacac..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,176 +0,0 @@ -""" -Pytest Fixtures Shared Across all Unit Tests -""" - -import datetime -import os -import pathlib -from typing import List - -import pytest -from vcr import VCR - -from lunchable import LunchMoney -from lunchable.models import TransactionObject - -obscure_start_date_object = datetime.datetime(year=2022, month=11, day=1) -beginning_of_this_month = datetime.datetime.now().replace(day=1) -module_scope = pytest.fixture(scope="module") - - -@pytest.fixture(autouse=True) -def set_test_env_vars(monkeypatch: pytest.MonkeyPatch) -> None: - """ - Set Environment Variables for Testing if they are not already set - """ - testing_env_vars = [ - "LUNCHMONEY_ACCESS_TOKEN", - "PUSHOVER_USER_KEY", - "SPLITWISE_API_KEY", - "SPLITWISE_CONSUMER_KEY", - "SPLITWISE_CONSUMER_SECRET", - ] - for env_var in testing_env_vars: - if not os.getenv(env_var): - monkeypatch.setenv(env_var, f"{env_var}_PLACEHOLDER") - - -@pytest.fixture -def obscure_start_date() -> datetime.datetime: - """ - An Obscure Hardcoded Date - - Returns - ------- - datetime.datetime - """ - return obscure_start_date_object - - -@pytest.fixture -def lunch_money_obj() -> LunchMoney: - """ - Static LunchMoney Instance - - Returns - ------- - LunchMoney - """ - lunch_money_obj = LunchMoney() - assert isinstance(lunch_money_obj, LunchMoney) - return lunch_money_obj - - -@pytest.fixture -def test_transactions() -> List[TransactionObject]: - """ - Load some example transactions - """ - transaction_dict_1 = { - "amount": 1.0, - "asset_id": 49335, - "category_id": 658761, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546434801, - "is_group": False, - "notes": "Test Transaction 1", - "original_name": "Test 1", - "parent_id": None, - "payee": "Test 1", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_dict_2 = { - "amount": 2.0, - "asset_id": 23043, - "category_id": 229146, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546452296, - "is_group": False, - "notes": "Test Transaction 2", - "original_name": "Test 2", - "parent_id": None, - "payee": "Test 2", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_dict_3 = { - "amount": 3.0, - "asset_id": 23043, - "category_id": 229140, - "currency": "usd", - "date": "2021-09-19", - "external_id": None, - "fees": None, - "group_id": None, - "id": 546434806, - "is_group": False, - "notes": "Test Transaction 3", - "original_name": "Test 3", - "parent_id": None, - "payee": "Test 3", - "plaid_account_id": None, - "price": None, - "quantity": None, - "status": "uncleared", - "subtype": None, - "tags": None, - "type": None, - "created_at": "2021-09-19T20:00:00.000Z", - "updated_at": "2021-09-19T20:00:00.000Z", - } - transaction_1 = TransactionObject.model_validate(transaction_dict_1) - transaction_2 = TransactionObject.model_validate(transaction_dict_2) - transaction_3 = TransactionObject.model_validate(transaction_dict_3) - return [transaction_1, transaction_2, transaction_3] - - -########################################################### -# VCR Configuration : Offload Epic API Calls to Cassettes # -########################################################### - - -def path_transformer(path: str) -> str: - """ - Cassette Path Transformer - """ - suffix = ".yaml" - if not path.endswith(suffix): - path = path + suffix - cassette_path = pathlib.Path(path) - cassette_path = cassette_path.parent / "cassettes" / cassette_path.name - return str(cassette_path) - - -vcr = VCR( - filter_headers=(("authorization", "XXXXXXXXXX"),), - filter_query_parameters=(("user", "XXXXXXXXXX"), ("token", "XXXXXXXXXX")), - path_transformer=path_transformer, - record_mode=os.getenv("VCR_RECORD_MODE", "once"), -) - -# Decorator Object to Use pyvcr Cassettes on Unit Tests -# pass `--vcr-record=none` to pytest CI runs to ensure new cassettes are generated -lunchable_cassette = vcr.use_cassette diff --git a/tests/models/cassettes/test_204_response.yaml b/tests/models/cassettes/test_204_response.yaml deleted file mode 100644 index 8cf1bb89..00000000 --- a/tests/models/cassettes/test_204_response.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"transactions":[{"date":"2023-12-17","amount":3.5,"payee":"Test","notes":"Test Transaction Group"}],"apply_rules":false,"skip_duplicates":true,"check_for_recurring":false,"debit_as_negative":false,"skip_balance_update":true}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '225' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.1 - method: POST - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Sun, 17 Dec 2023 15:58:07 GMT - Etag: - - W/"13-wFA9Dx4FmHqyjCvL9k0g9w+7+E0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702828687&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=fEMUT%2FofMtfxWVkKFLbxjXEBTFvUTnApoF86q3Dt%2By8%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702828687&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=fEMUT%2FofMtfxWVkKFLbxjXEBTFvUTnApoF86q3Dt%2By8%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 204 -version: 1 diff --git a/tests/models/cassettes/test_add_to_category_group.yaml b/tests/models/cassettes/test_add_to_category_group.yaml deleted file mode 100644 index b14c026c..00000000 --- a/tests/models/cassettes/test_add_to_category_group.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"category_ids": [443128], "new_categories": ["Another Another Test Category"]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '79' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories/group/658694/add - response: - content: '{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"is_group":true,"group_id":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"created_at":"2023-12-15T02:42:01.147Z","archived":false,"archived_on":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","created_at":"2023-03-07T02:10:27.268Z","archived":false,"archived_on":null}],"archived":false,"archived_on":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '541' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:42:01 GMT - Etag: - - W/"21d-JdapYXJpKm5jckYYF084zl/FWR8" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702608121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=IhPV7bOJdhOd%2BTJ73mF%2BY5R1AE8%2BA1EFE91jTMBZ51A%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702608121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=IhPV7bOJdhOd%2BTJ73mF%2BY5R1AE8%2BA1EFE91jTMBZ51A%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_and_delete_transaction_group.yaml b/tests/models/cassettes/test_create_and_delete_transaction_group.yaml deleted file mode 100644 index ad316382..00000000 --- a/tests/models/cassettes/test_create_and_delete_transaction_group.yaml +++ /dev/null @@ -1,102 +0,0 @@ -interactions: -- request: - body: '{"date": "2023-12-14", "payee": "Test", "notes": "Test Transaction Group", "transactions": [546452296, 546434806]}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '114' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions/group - response: - content: '561178199' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '9' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:57:39 GMT - Etag: - - W/"9-QgM8UlEG9Jko03c9j304G1eR1wE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609059&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=a%2FD%2FxKu%2FI8HJf1kkNWFJCRTzav%2B8PV5EZXdEDkFV7nQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609059&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=a%2FD%2FxKu%2FI8HJf1kkNWFJCRTzav%2B8PV5EZXdEDkFV7nQ%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/transactions/group/561178199 - response: - content: '{"transactions":[546452296,546434806]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '38' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:57:40 GMT - Etag: - - W/"26-MZMWmBEzSYlditcq8Wp4EJp/buM" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609060&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v%2FTNRGIUsGut5fPkA5odLxpk9OeFYkVrqG1ZFEBeXVU%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609060&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v%2FTNRGIUsGut5fPkA5odLxpk9OeFYkVrqG1ZFEBeXVU%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_asset.yaml b/tests/models/cassettes/test_create_asset.yaml deleted file mode 100644 index 7901d1d3..00000000 --- a/tests/models/cassettes/test_create_asset.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"type_name": "cash", "name": "test-account-1", "display_name": "Test Account #1", "balance": 5.2, "currency": "usd", "institution_name": "Test Institution", "exclude_transactions": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '188' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/assets - response: - content: '{"id":78214,"type_name":"depository","subtype_name":null,"name":"test-account-1","display_name":"Test Account #1","balance":"4.2000","balance_as_of":"2023-12-15T02:24:12.156Z","closed_on":null,"created_at":"2023-12-15T02:24:12.158Z","currency":"usd","institution_name":"Test Institution","exclude_transactions":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '317' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:24:12 GMT - Etag: - - W/"13d-I4VftM8ABzkTAssGeLYE2y4XTiQ" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607052&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xQy4m01Fec%2Ftq0pERUcOBacTAIiGJvX4B1DxwzkRJ8c%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607052&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xQy4m01Fec%2Ftq0pERUcOBacTAIiGJvX4B1DxwzkRJ8c%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_category.yaml b/tests/models/cassettes/test_create_category.yaml deleted file mode 100644 index bd2ff9f0..00000000 --- a/tests/models/cassettes/test_create_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"name": "Test Category", "description": "Test Category Description", "is_income": false, "exclude_from_budget": true, "exclude_from_totals": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '148' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories - response: - content: '{"category_id":658693}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '22' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:23 GMT - Etag: - - W/"16-ZnEdZgTnX+RwcMA5fK15qZ8ce/Y" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_create_category_group.yaml b/tests/models/cassettes/test_create_category_group.yaml deleted file mode 100644 index 456b4ed1..00000000 --- a/tests/models/cassettes/test_create_category_group.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"name": "Test Category Group", "description": "Test Category Group!!", "is_income": false, "exclude_from_budget": true, "exclude_from_totals": false}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '150' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/categories/group - response: - content: '{"category_id":658694}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '22' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:24 GMT - Etag: - - W/"16-QagnRiI64XjF7P0O60ZwTSKAWaY" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_budget.yaml b/tests/models/cassettes/test_delete_budget.yaml deleted file mode 100644 index 0aedf80c..00000000 --- a/tests/models/cassettes/test_delete_budget.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/budgets?category_id=443127&start_date=2022-11-01 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:31:55 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607515&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=qdKNFnbZ1V3jxHxyZrsmx53HANFaCDyW8UVsFbofofE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607515&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=qdKNFnbZ1V3jxHxyZrsmx53HANFaCDyW8UVsFbofofE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_category.yaml b/tests/models/cassettes/test_delete_category.yaml deleted file mode 100644 index a85f4d60..00000000 --- a/tests/models/cassettes/test_delete_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/categories/343088 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:23 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607543&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=yQ2QW5jL8oIBvz3F32j5ipJbpFJs8z%2FSLeBCL2gGZXk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_delete_category_force.yaml b/tests/models/cassettes/test_delete_category_force.yaml deleted file mode 100644 index dffbbb7e..00000000 --- a/tests/models/cassettes/test_delete_category_force.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: DELETE - uri: https://dev.lunchmoney.app/v1/categories/343089/force - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:24 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607544&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RniK8WNVAIRVvFxngSDlgZr4DZle61%2FVPl1Qsd2Phig%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_assets.yaml b/tests/models/cassettes/test_get_assets.yaml deleted file mode 100644 index c2977143..00000000 --- a/tests/models/cassettes/test_get_assets.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/assets - response: - content: '{"assets":[{"id":49335,"type_name":"cash","subtype_name":"checking","name":"Test Account","display_name":null,"balance":"-16513.5500","balance_as_of":"2023-03-07T02:43:48.383Z","closed_on":null,"currency":"usd","institution_name":null,"exclude_transactions":false,"created_at":"2023-03-07T02:05:23.670Z"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '306' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:24:11 GMT - Etag: - - W/"132-iRGsYXgd9Lq/WtxFtW/wUKm/z0U" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607051&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xrm8MxWAZkRuo3Rg1wWpj49%2BSPanStLfcU6QTrTk6IU%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607051&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=xrm8MxWAZkRuo3Rg1wWpj49%2BSPanStLfcU6QTrTk6IU%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_budgets.yaml b/tests/models/cassettes/test_get_budgets.yaml deleted file mode 100644 index 8877774c..00000000 --- a/tests/models/cassettes/test_get_budgets.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/budgets?end_date=2022-11-29&start_date=2022-11-01 - response: - content: '[{"category_name":"Uncategorized","category_id":null,"is_group":false,"group_id":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"archived":false,"data":{"2022-11-01":{}},"config":null,"order":0},{"category_name":"Uncategorized","category_id":null,"is_group":false,"group_id":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"archived":false,"data":{"2022-11-01":{}},"config":null,"order":1},{"category_name":"Groceries","category_id":443128,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":2,"archived":false,"data":{"2022-11-01":{"num_transactions":1,"spending_to_base":28.15}},"config":null},{"category_name":"Home","category_id":443125,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":3,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Income","category_id":443129,"category_group_name":null,"group_id":null,"is_group":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"order":4,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Personal Care","category_id":443127,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":5,"archived":false,"data":{"2022-11-01":{"num_transactions":0,"spending_to_base":0}},"config":null},{"category_name":"Shopping","category_id":443126,"category_group_name":null,"group_id":null,"is_group":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"order":6,"archived":false,"data":{"2022-11-01":{"num_transactions":10,"spending_to_base":711.69}},"config":null}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:27:54 GMT - Etag: - - W/"777-j13A3UPLJEkv40D3zVVD3YExCGQ" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607273&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RSz%2Fe9doIkUZ4FD3SjpFfTFCW97iSWZ59QBjTe4lZFY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607273&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RSz%2Fe9doIkUZ4FD3SjpFfTFCW97iSWZ59QBjTe4lZFY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '1911' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories.yaml b/tests/models/cassettes/test_get_categories.yaml deleted file mode 100644 index ee4ce41e..00000000 --- a/tests/models/cassettes/test_get_categories.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/categories - response: - content: '{"categories":[{"id":443128,"name":"Groceries","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:22 GMT - Etag: - - W/"5aa-MbmNEXQ+cwhlZ4ywOUrmZ68sek0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607542&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=8xQJI4s4EliWDIdvpGOmgBgTV2jgVm9BOMwhWYO5vYk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607542&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=8xQJI4s4EliWDIdvpGOmgBgTV2jgVm9BOMwhWYO5vYk%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '1450' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories_flattened.yaml b/tests/models/cassettes/test_get_categories_flattened.yaml deleted file mode 100644 index 70de1bd4..00000000 --- a/tests/models/cassettes/test_get_categories_flattened.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/categories?format=flattened - response: - content: '{"categories":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null},{"id":660672,"name":"Splitwise","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-15T20:45:04.146Z","created_at":"2023-12-15T20:45:04.146Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":0},{"id":680257,"name":"Sub Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-22T05:45:15.233Z","created_at":"2023-12-22T05:45:15.233Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null}]},{"id":658693,"name":"Test Category","description":"Test Category Description","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:23.352Z","created_at":"2023-12-15T02:32:23.352Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:24.849Z","created_at":"2023-12-15T02:32:24.849Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null}]}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:46:34 GMT - Etag: - - W/"f65-tCC2ArgL9RN/F4CiaAh1Lpc4NyA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_categories_nested.yaml b/tests/models/cassettes/test_get_categories_nested.yaml deleted file mode 100644 index b72b940c..00000000 --- a/tests/models/cassettes/test_get_categories_nested.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/categories?format=nested - response: - content: '{"categories":[{"id":660672,"name":"Splitwise","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-15T20:45:04.146Z","created_at":"2023-12-15T20:45:04.146Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":0},{"id":443125,"name":"Home","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:09:42.960Z","created_at":"2023-03-07T02:09:42.960Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443129,"name":"Income","description":null,"is_income":true,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:40:15.216Z","created_at":"2023-03-07T02:40:15.216Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":443127,"name":"Personal Care","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:17.225Z","created_at":"2023-03-07T02:10:17.225Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":680257,"name":"Sub Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-12-22T05:45:15.233Z","created_at":"2023-12-22T05:45:15.233Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":443126,"name":"Shopping","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:12.260Z","created_at":"2023-03-07T02:10:12.260Z","is_group":false,"group_id":680257,"archived":false,"archived_on":null,"order":null}]},{"id":658693,"name":"Test Category","description":"Test Category Description","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:23.352Z","created_at":"2023-12-15T02:32:23.352Z","is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null},{"id":658694,"name":"Test Category Group","description":"Test Category Group!!","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:32:24.849Z","created_at":"2023-12-15T02:32:24.849Z","is_group":true,"group_id":null,"archived":false,"archived_on":null,"order":null,"children":[{"id":658761,"name":"Another Another Test Category","description":null,"is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-12-15T02:42:01.147Z","created_at":"2023-12-15T02:42:01.147Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null},{"id":443128,"name":"Groceries","description":"Test Category Description Updated","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"updated_at":"2023-03-07T02:10:27.268Z","created_at":"2023-03-07T02:10:27.268Z","is_group":false,"group_id":658694,"archived":false,"archived_on":null,"order":null}]}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:46:34 GMT - Etag: - - W/"bcf-cA7oyT1dg2Kx1YJwRekcvQ+hszA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703223994&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=VcDy3EU92mcCuB%2Fhy80hehxszNKBE8gPpWAO5na%2BUTY%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_category.yaml b/tests/models/cassettes/test_get_category.yaml deleted file mode 100644 index 1caa2f7f..00000000 --- a/tests/models/cassettes/test_get_category.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/categories/443128 - response: - content: '{"id":443128,"name":"Groceries","description":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"is_group":false,"group_id":null,"archived":false,"archived_on":null,"order":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '207' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:39:55 GMT - Etag: - - W/"cf-ArqdB5r7uq6fsA6ObfnDkpwwGrE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607995&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RRRHUkoD06vvLyGFuk78%2BkCInj2SL%2FBT%2BL9cD8td%2F4g%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607995&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=RRRHUkoD06vvLyGFuk78%2BkCInj2SL%2FBT%2BL9cD8td%2F4g%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_crypto.yaml b/tests/models/cassettes/test_get_crypto.yaml deleted file mode 100644 index df3509bd..00000000 --- a/tests/models/cassettes/test_get_crypto.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/crypto - response: - content: '{"crypto":[{"id":7286,"source":"manual","created_at":"2023-12-15T03:02:18.331Z","name":"Bitcoin","display_name":null,"balance":"1.000000000000000000","balance_as_of":"2023-12-15T03:00:08.292Z","currency":"BTC","status":"active","institution_name":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '254' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:02:44 GMT - Etag: - - W/"fe-gWd945unYRZrDjreifrq6CEXmUc" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609364&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=D2SqsIheCBS9moU68CE44YICCUb1SCHSza2L8Wt0hE8%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609364&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=D2SqsIheCBS9moU68CE44YICCUb1SCHSza2L8Wt0hE8%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_plaid_accounts.yaml b/tests/models/cassettes/test_get_plaid_accounts.yaml deleted file mode 100644 index 7a51a818..00000000 --- a/tests/models/cassettes/test_get_plaid_accounts.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/plaid_accounts - response: - content: '{"plaid_accounts": [{"id": 71394, "date_linked": "2023-12-15", "name": "Chase - Freedom", "display_name": "Chase Freedom", "type": "credit", "subtype": "creditcard", "mask": "5678", "institution_name": "Chase", "status": "active", "limit": 12345, "balance": "123.0900", "currency": "usd", "balance_last_update": "2023-12-14T15:55:00.753Z", "import_start_date": "2023-02-06", "last_import": "2023-12-14T15:55:03.163Z", "last_fetch": "2023-12-14T15:55:03.301Z", "plaid_last_successful_update": "2023-12-13T15:51:37.490Z"}, {"id": 71395, "date_linked": "2023-12-15", "name": "Chase - Sapphire", "display_name": "Chase Sapphire", "type": "credit", "subtype": "creditcard", "mask": "1234", "institution_name": "Chase", "status": "active", "limit": 12345, "balance": "456.0900", "currency": "usd", "balance_last_update": "2023-12-14T15:55:00.753Z", "import_start_date": "2023-02-06", "last_import": "2023-12-14T15:55:03.163Z", "last_fetch": "2023-12-14T15:55:03.301Z", "plaid_last_successful_update": "2023-12-13T15:51:37.490Z"}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:04:46 GMT - Etag: - - W/"1f58-hipJFRmyr9x6gdp2aLKh5viwTAU" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609486&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=1cXBwXEaoZ%2Fm4ZhVbC9Kz5VVT8hDCwaBZH8pnT4DXyQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609486&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=1cXBwXEaoZ%2Fm4ZhVbC9Kz5VVT8hDCwaBZH8pnT4DXyQ%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - content-length: - - '8024' - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_recurring_expenses.yaml b/tests/models/cassettes/test_get_recurring_expenses.yaml deleted file mode 100644 index b28df476..00000000 --- a/tests/models/cassettes/test_get_recurring_expenses.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/recurring_expenses?start_date=2022-11-01 - response: - content: '{"recurring_expenses":[{"id":585244,"start_date":"2021-12-01","end_date":null,"cadence":"monthly","payee":"Test Item","amount":"100.0000","currency":"usd","created_at":"2023-12-15T02:38:04.131Z","description":"Video Streaming","billing_date":"2022-11-01","type":"cleared","original_name":null,"source":"manual","plaid_account_id":null,"asset_id":null,"category_id":443126,"transaction_id":null}]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '396' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 15:42:08 GMT - Etag: - - W/"18c-Y2ukKiTxVJNnFDEIhjY0XlrmVgc" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703259728&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=p8MMyvC2toZx7NhSpdaXza7UayhtI%2BrgAKK4o%2Bn1Vmo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703259728&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=p8MMyvC2toZx7NhSpdaXza7UayhtI%2BrgAKK4o%2Bn1Vmo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_recurring_items.yaml b/tests/models/cassettes/test_get_recurring_items.yaml deleted file mode 100644 index a2a446f3..00000000 --- a/tests/models/cassettes/test_get_recurring_items.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.3.3 - method: GET - uri: https://dev.lunchmoney.app/v1/recurring_items?start_date=2022-11-01 - response: - content: '[{"id":585244,"start_date":"2021-12-01T00:00:00.000Z","end_date":null,"payee":"Test Item","currency":"usd","created_by":12126,"created_at":"2023-12-15T02:38:04.131Z","updated_at":"2023-12-15T02:38:04.131Z","billing_date":"2023-12-01","original_name":null,"description":"Video Streaming","plaid_account_id":null,"asset_id":null,"source":"manual","amount":"100.0000","notes":null,"category_id":443126,"category_group_id":680257,"is_income":false,"exclude_from_totals":false,"cadence":"monthly","granularity":"month","quantity":1,"occurrences":{"2022-11-01":[],"2022-12-01":[],"2023-01-01":[],"2023-02-01":[],"2023-03-01":[],"2023-04-01":[],"2023-05-01":[],"2023-06-01":[],"2023-07-01":[],"2023-08-01":[],"2023-09-01":[],"2023-10-01":[],"2023-11-01":[],"2023-12-01":[],"2024-01-01":[],"2024-02-01":[],"2024-03-01":[],"2024-04-01":[],"2024-05-01":[],"2024-06-01":[],"2024-07-01":[],"2024-08-01":[]},"transactions_within_range":[],"missing_dates_within_range":["2022-11-01","2022-12-01","2023-01-01","2023-02-01","2023-03-01","2023-04-01","2023-05-01","2023-06-01","2023-07-01","2023-08-01","2023-09-01","2023-10-01","2023-11-01","2023-12-01","2024-01-01","2024-02-01","2024-03-01","2024-04-01","2024-05-01","2024-06-01","2024-07-01"],"date":"2024-07-19","to_base":100}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 19 Jul 2024 03:53:07 GMT - Etag: - - W/"4f1-jaQOBXD6F728udtE/T3Pci04HP4" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1721361187&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=YtEpFVLeE%2BZqjZemsRdPEXAIOqgIB6TUtRVb%2FNYrMoc%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1721361187&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=YtEpFVLeE%2BZqjZemsRdPEXAIOqgIB6TUtRVb%2FNYrMoc%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_tags.yaml b/tests/models/cassettes/test_get_tags.yaml deleted file mode 100644 index 8f36362d..00000000 --- a/tests/models/cassettes/test_get_tags.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: GET - uri: https://dev.lunchmoney.app/v1/tags - response: - content: '[{"id":66845,"name":"test","description":null,"archived":false}]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '64' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 15:48:41 GMT - Etag: - - W/"40-46wK3k5iVXZWvLGgrDEZnekjOD0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703260121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=Alw2L4p%2Fd6gFPGo1NnJ9A%2BPaXUGilV4ZtG%2B3wh7FCpE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703260121&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=Alw2L4p%2Fd6gFPGo1NnJ9A%2BPaXUGilV4ZtG%2B3wh7FCpE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transaction.yaml b/tests/models/cassettes/test_get_transaction.yaml deleted file mode 100644 index d2aaef94..00000000 --- a/tests/models/cassettes/test_get_transaction.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/546434806 - response: - content: '{"id":546434806,"date":"2024-12-11","amount":"120.0000","currency":"usd","to_base":120,"payee":"Example Restaurant","category_id":null,"category_name":null,"category_group_id":null,"category_group_name":null,"is_income":null,"exclude_from_budget":null,"exclude_from_totals":null,"created_at":"2023-12-12T16:40:12.286Z","updated_at":"2024-01-23T23:19:49.127Z","status":"cleared","is_pending":false,"notes":"Saturday Dinner","original_name":"Example Restaurant","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":true,"group_id":null,"is_group":false,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Example Restaurant","display_notes":"Saturday Dinner","account_display_name":" ","tags":[],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:23:39 GMT - Etag: - - W/"452-JxRED/ZAoEZSX3h3KkuCa/XiEE0" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052219&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=eFqPqlndjy%2F2%2B%2FP0fpYgnnD58U35QSNISXcwx5ZeXMk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052219&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=eFqPqlndjy%2F2%2B%2FP0fpYgnnD58U35QSNISXcwx5ZeXMk%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transaction_group.yaml b/tests/models/cassettes/test_get_transaction_group.yaml deleted file mode 100644 index dc32e903..00000000 --- a/tests/models/cassettes/test_get_transaction_group.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/group?transaction_id=856827078 - response: - content: '{"id":856827078,"date":"2024-01-11","amount":"66.45","currency":"usd","to_base":66.45,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-24T03:15:39.118Z","updated_at":"2024-01-24T03:15:39.118Z","status":"cleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" ","tags":[],"children":[{"id":179018293,"payee":"Skinix","amount":"30.4100","currency":"usd","date":"2024-01-11","formatted_date":"2024-01-11","notes":"Phasellus sit amet erat.","asset_id":49335,"plaid_account_id":null,"to_base":30.41},{"id":179018477,"payee":"Fadeo","amount":"36.0400","currency":"usd","date":"2024-01-10","formatted_date":"2024-01-10","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":36.04}],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Wed, 24 Jan 2024 03:19:25 GMT - Etag: - - W/"5e1-0z/UXlyVUxPEmy5ZiLGu3uduZqg" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706066365&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=oJiXq5%2FCJrt%2FxFYEl20oSruOMIz%2Fw0LEQqBpC0Z03xc%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706066365&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=oJiXq5%2FCJrt%2FxFYEl20oSruOMIz%2Fw0LEQqBpC0Z03xc%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transactions.yaml b/tests/models/cassettes/test_get_transactions.yaml deleted file mode 100644 index 92896b76..00000000 --- a/tests/models/cassettes/test_get_transactions.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '{"transactions":[{"id":179018371,"date":"2024-01-01","amount":"114.4800","currency":"usd","to_base":114.48,"payee":"Browsebug","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.681Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Browsebug","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Browsebug","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018392,"date":"2024-01-01","amount":"87.9700","currency":"usd","to_base":87.97,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.348Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Babbleblab","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Babbleblab","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018398,"date":"2024-01-01","amount":"5.3200","currency":"usd","to_base":5.32,"payee":"Voomm","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.809Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","original_name":"Voomm","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":"{\"account_id\":\"xxxxxxxxxxxx\",\"account_owner\":\"1234\"}","source":"api","display_name":"Voomm","display_notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018399,"date":"2024-01-01","amount":"22.5000","currency":"usd","to_base":22.5,"payee":"Fivechat","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.885Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Donec vitae nisi.","original_name":"Fivechat","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fivechat","display_notes":"Donec vitae nisi.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018437,"date":"2024-01-01","amount":"102.3200","currency":"usd","to_base":102.32,"payee":"Skivee","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.823Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skivee","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skivee","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018458,"date":"2024-01-01","amount":"78.9800","currency":"usd","to_base":78.98,"payee":"Oyoloo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:01.466Z","updated_at":"2024-01-23T23:19:10.517Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Oyoloo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Oyoloo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018469,"date":"2024-01-01","amount":"90.2900","currency":"usd","to_base":90.29,"payee":"Quimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.328Z","updated_at":"2024-01-23T23:20:02.345Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Quimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Quimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":855353975,"date":"2024-01-01","amount":"115.78999999999999","currency":"usd","to_base":115.79,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T22:46:48.656Z","updated_at":"2024-01-23T23:20:01.854Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Babbleblab","display_notes":null,"account_display_name":" ","tags":[],"children":[{"id":179018392,"payee":"Babbleblab","amount":"87.9700","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":87.97},{"id":179018398,"payee":"Voomm","amount":"5.3200","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","asset_id":49335,"plaid_account_id":null,"to_base":5.32},{"id":179018399,"payee":"Fivechat","amount":"22.5000","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Donec vitae nisi.","asset_id":49335,"plaid_account_id":null,"to_base":22.5}],"external_id":null},{"id":179018424,"date":"2024-01-05","amount":"2.9100","currency":"usd","to_base":2.91,"payee":"Twitterworks","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:58.822Z","updated_at":"2024-01-23T23:19:11.916Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Twitterworks","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Twitterworks","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018468,"date":"2024-01-07","amount":"42.7600","currency":"usd","to_base":42.76,"payee":"Blogspan","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.249Z","updated_at":"2024-01-23T23:19:13.193Z","status":"uncleared","is_pending":false,"notes":"Integer ac leo.","original_name":"Blogspan","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogspan","display_notes":"Integer ac leo.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018477,"date":"2024-01-10","amount":"36.0400","currency":"usd","to_base":36.04,"payee":"Fadeo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.969Z","updated_at":"2024-01-23T23:19:14.338Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Fadeo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fadeo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018293,"date":"2024-01-11","amount":"30.4100","currency":"usd","to_base":30.41,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:48.939Z","updated_at":"2024-01-23T23:19:15.467Z","status":"uncleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":"Skinix","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018351,"date":"2024-01-11","amount":"72.5000","currency":"usd","to_base":72.5,"payee":"Skaboo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.175Z","updated_at":"2024-01-23T23:19:16.672Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skaboo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skaboo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018428,"date":"2024-01-11","amount":"150.0000","currency":"usd","to_base":150,"payee":"Livetube","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.122Z","updated_at":"2024-01-23T23:19:17.775Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Livetube","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Livetube","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:20:58 GMT - Etag: - - W/"5534-/ugOb4U7RUc9/qQHHfMVYPdqD94" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052057&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ifKfasFhY%2FtzIamTz%2BqgOilIKCwalX1P45BnuJvMJow%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052057&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ifKfasFhY%2FtzIamTz%2BqgOilIKCwalX1P45BnuJvMJow%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_transactions_no_paginate.yaml b/tests/models/cassettes/test_get_transactions_no_paginate.yaml deleted file mode 100644 index a413c8c4..00000000 --- a/tests/models/cassettes/test_get_transactions_no_paginate.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.2.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions?limit=5 - response: - content: '{"transactions":[{"id":855616912,"date":"2024-01-12","amount":"42.4500","currency":"usd","to_base":42.45,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T23:35:23.222Z","updated_at":"2024-01-23T23:35:23.222Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":179018320,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":true}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Mon, 29 Jan 2024 20:16:28 GMT - Etag: - - W/"15bb-w/S+ZfgoXzS4bjZcTsCa7+RxlsE" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706559388&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=uxWXextWvcB0V571A7mUK617Gljjk1%2B2EhZwyfYd4ew%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706559388&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=uxWXextWvcB0V571A7mUK617Gljjk1%2B2EhZwyfYd4ew%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_uncleared_transactions.yaml b/tests/models/cassettes/test_get_uncleared_transactions.yaml deleted file mode 100644 index 58c9dd92..00000000 --- a/tests/models/cassettes/test_get_uncleared_transactions.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions?status=uncleared - response: - content: '{"transactions":[{"id":179018371,"date":"2024-01-01","amount":"114.4800","currency":"usd","to_base":114.48,"payee":"Browsebug","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.681Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Browsebug","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Browsebug","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018392,"date":"2024-01-01","amount":"87.9700","currency":"usd","to_base":87.97,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.348Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Babbleblab","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Babbleblab","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018398,"date":"2024-01-01","amount":"5.3200","currency":"usd","to_base":5.32,"payee":"Voomm","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.809Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","original_name":"Voomm","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Voomm","display_notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018399,"date":"2024-01-01","amount":"22.5000","currency":"usd","to_base":22.5,"payee":"Fivechat","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:56.885Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":"Donec vitae nisi.","original_name":"Fivechat","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":855353975,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fivechat","display_notes":"Donec vitae nisi.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018437,"date":"2024-01-01","amount":"102.3200","currency":"usd","to_base":102.32,"payee":"Skivee","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.823Z","updated_at":"2024-01-23T22:48:31.879Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skivee","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skivee","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018458,"date":"2024-01-01","amount":"78.9800","currency":"usd","to_base":78.98,"payee":"Oyoloo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:01.466Z","updated_at":"2024-01-23T23:19:10.517Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Oyoloo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Oyoloo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018469,"date":"2024-01-01","amount":"90.2900","currency":"usd","to_base":90.29,"payee":"Quimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.328Z","updated_at":"2024-01-23T23:20:02.345Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Quimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Quimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":855353975,"date":"2024-01-01","amount":"115.78999999999999","currency":"usd","to_base":115.79,"payee":"Babbleblab","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2024-01-23T22:46:48.656Z","updated_at":"2024-01-23T23:20:01.854Z","status":"uncleared","is_pending":false,"notes":null,"original_name":null,"recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":false,"group_id":null,"is_group":true,"asset_id":null,"asset_institution_name":null,"asset_name":null,"asset_display_name":null,"asset_status":null,"plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"user","display_name":"Babbleblab","display_notes":null,"account_display_name":" ","tags":[],"children":[{"id":179018392,"payee":"Babbleblab","amount":"87.9700","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":null,"asset_id":49335,"plaid_account_id":null,"to_base":87.97},{"id":179018398,"payee":"Voomm","amount":"5.3200","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.","asset_id":49335,"plaid_account_id":null,"to_base":5.32},{"id":179018399,"payee":"Fivechat","amount":"22.5000","currency":"usd","date":"2024-01-01","formatted_date":"2024-01-01","notes":"Donec vitae nisi.","asset_id":49335,"plaid_account_id":null,"to_base":22.5}],"external_id":null},{"id":179018424,"date":"2024-01-05","amount":"2.9100","currency":"usd","to_base":2.91,"payee":"Twitterworks","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:58.822Z","updated_at":"2024-01-23T23:19:11.916Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Twitterworks","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Twitterworks","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018468,"date":"2024-01-07","amount":"42.7600","currency":"usd","to_base":42.76,"payee":"Blogspan","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.249Z","updated_at":"2024-01-23T23:19:13.193Z","status":"uncleared","is_pending":false,"notes":"Integer ac leo.","original_name":"Blogspan","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogspan","display_notes":"Integer ac leo.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018477,"date":"2024-01-10","amount":"36.0400","currency":"usd","to_base":36.04,"payee":"Fadeo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:09:02.969Z","updated_at":"2024-01-23T23:19:14.338Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Fadeo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Fadeo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018293,"date":"2024-01-11","amount":"30.4100","currency":"usd","to_base":30.41,"payee":"Skinix","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:48.939Z","updated_at":"2024-01-23T23:19:15.467Z","status":"uncleared","is_pending":false,"notes":"Phasellus sit amet erat.","original_name":"Skinix","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skinix","display_notes":"Phasellus sit amet erat.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018351,"date":"2024-01-11","amount":"72.5000","currency":"usd","to_base":72.5,"payee":"Skaboo","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.175Z","updated_at":"2024-01-23T23:19:16.672Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Skaboo","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Skaboo","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018428,"date":"2024-01-11","amount":"150.0000","currency":"usd","to_base":150,"payee":"Livetube","category_id":443127,"category_name":"Personal Care","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:59.122Z","updated_at":"2024-01-23T23:19:17.775Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Livetube","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Livetube","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018356,"date":"2024-01-19","amount":"50.9300","currency":"usd","to_base":50.93,"payee":"Divanoodle","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:53.557Z","updated_at":"2024-01-23T23:19:20.121Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Divanoodle","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Divanoodle","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018330,"date":"2024-01-22","amount":"112.9100","currency":"usd","to_base":112.91,"payee":"Blogpad","category_id":443128,"category_name":"Groceries","category_group_id":658694,"category_group_name":"Test Category Group","is_income":false,"exclude_from_budget":true,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:51.634Z","updated_at":"2024-01-23T23:19:21.239Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Blogpad","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Blogpad","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018374,"date":"2024-01-24","amount":"64.2000","currency":"usd","to_base":64.2,"payee":"Devshare","category_id":443125,"category_name":"Home","category_group_id":null,"category_group_name":null,"is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:54.909Z","updated_at":"2024-01-23T23:19:22.372Z","status":"uncleared","is_pending":false,"notes":"Nam nulla.","original_name":"Devshare","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Devshare","display_notes":"Nam nulla.","account_display_name":" Test Account","tags":[],"external_id":null},{"id":179018343,"date":"2024-01-25","amount":"58.6200","currency":"usd","to_base":58.62,"payee":"Agimba","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:52.582Z","updated_at":"2024-01-23T23:19:23.495Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Agimba","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Agimba","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}],"has_more":false}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:26:11 GMT - Etag: - - W/"5534-/ugOb4U7RUc9/qQHHfMVYPdqD94" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052371&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v8DgdVmXC7N7fbv0OyaM9Xms0oE%2FX7TUnR6G%2FU3yFL4%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052371&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=v8DgdVmXC7N7fbv0OyaM9Xms0oE%2FX7TUnR6G%2FU3yFL4%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_get_user.yaml b/tests/models/cassettes/test_get_user.yaml deleted file mode 100644 index dbf5b5db..00000000 --- a/tests/models/cassettes/test_get_user.yaml +++ /dev/null @@ -1,50 +0,0 @@ -interactions: -- request: - body: - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: GET - uri: https://dev.lunchmoney.app/v1/me - response: - content: '{"user_name":"Justin Flannery","user_email":"juftin@gmail.com","user_id":12126,"account_id":18286,"budget_name":"🤖 Juftin - Sandbox","api_key_label":"Lunchable"}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '164' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:32:30 GMT - Etag: - - W/"a4-M9AgMOS8/DALNuYYUdWJdJyoQWA" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607550&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=hqyTjOanwQpiN09wgseHis1OammhecJUOY0Q4M6NHTo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607550&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=hqyTjOanwQpiN09wgseHis1OammhecJUOY0Q4M6NHTo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_insert_transactions.yaml b/tests/models/cassettes/test_insert_transactions.yaml deleted file mode 100644 index 3aecbd47..00000000 --- a/tests/models/cassettes/test_insert_transactions.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"transactions": [{"date": "2023-12-14", "amount": 3.5, "payee": "Random Test", "asset_id": 49335, "notes": "Random Test Description: 2023-12-14 20:01:42.588685"}], "apply_rules": false, "skip_duplicates": true, "check_for_recurring": false, "debit_as_negative": false, "skip_balance_update": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '298' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions - response: - content: '{"ids":[561205301]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '19' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:01:42 GMT - Etag: - - W/"13-IEhtY6cV9Nou10x7E28a09w0Jjo" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609302&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=DlFFyKJ9CWq6yahw%2F2Su1%2Brvs49X7NBjpdmCZruyI%2Bo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609302&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=DlFFyKJ9CWq6yahw%2F2Su1%2Brvs49X7NBjpdmCZruyI%2Bo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_split_transaction.yaml b/tests/models/cassettes/test_split_transaction.yaml deleted file mode 100644 index e2ea8b21..00000000 --- a/tests/models/cassettes/test_split_transaction.yaml +++ /dev/null @@ -1,106 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: GET - uri: https://dev.lunchmoney.app/v1/transactions/179018320 - response: - content: '{"id":179018320,"date":"2024-01-12","amount":"84.9000","currency":"usd","to_base":84.9,"payee":"Linkbuzz","category_id":443126,"category_name":"Shopping","category_group_id":680257,"category_group_name":"Sub Shopping","is_income":false,"exclude_from_budget":false,"exclude_from_totals":false,"created_at":"2023-03-07T02:08:50.896Z","updated_at":"2024-01-23T23:19:18.953Z","status":"uncleared","is_pending":false,"notes":null,"original_name":"Linkbuzz","recurring_id":null,"recurring_payee":null,"recurring_description":null,"recurring_cadence":null,"recurring_type":null,"recurring_amount":null,"recurring_currency":null,"parent_id":null,"has_children":null,"group_id":null,"is_group":false,"asset_id":49335,"asset_institution_name":null,"asset_name":"Test Account","asset_display_name":null,"asset_status":"active","plaid_account_id":null,"plaid_account_name":null,"plaid_account_mask":null,"institution_name":null,"plaid_account_display_name":null,"plaid_metadata":null,"source":"api","display_name":"Linkbuzz","display_notes":null,"account_display_name":" Test Account","tags":[],"external_id":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Encoding: - - gzip - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:35:23 GMT - Etag: - - W/"44e-mfkledHpOThw11jMES6+wQLrz/c" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052922&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kSc8x3ilVsl5CAvd6qDPkmalC5Nqzc6dSrt79Sfnqlw%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052922&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kSc8x3ilVsl5CAvd6qDPkmalC5Nqzc6dSrt79Sfnqlw%3D - Server: - - Cowboy - Transfer-Encoding: - - chunked - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -- request: - body: '{"split":[{"date":"2024-01-12","category_id":443126,"amount":42.45},{"date":"2024-01-12","category_id":443126,"amount":42.45}]}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '127' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: PUT - uri: https://dev.lunchmoney.app/v1/transactions/179018320 - response: - content: '{"updated":true,"split":[855616911,855616912]}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '46' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:35:23 GMT - Etag: - - W/"2e-6YReKqNZ92GDgxDo0hopTaOS3gs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052923&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=w67Q6pk3jzwGCdAlFiRmvUOwzc5ljrEvqHCRySv8o5o%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052923&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=w67Q6pk3jzwGCdAlFiRmvUOwzc5ljrEvqHCRySv8o5o%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml b/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml deleted file mode 100644 index 5288ec0f..00000000 --- a/tests/models/cassettes/test_trigger_fetch_from_plaid.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '0' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.0.3 - method: POST - uri: https://dev.lunchmoney.app/v1/plaid_accounts/fetch - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 22 Dec 2023 05:19:16 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1703222356&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6dOowV5gM%2BCZbs2abGbSVvPMS5g9g24RA5aQ7uyfidE%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1703222356&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6dOowV5gM%2BCZbs2abGbSVvPMS5g9g24RA5aQ7uyfidE%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_unsplit_transaction.yaml b/tests/models/cassettes/test_unsplit_transaction.yaml deleted file mode 100644 index 6704d8b0..00000000 --- a/tests/models/cassettes/test_unsplit_transaction.yaml +++ /dev/null @@ -1,46 +0,0 @@ -interactions: -- request: - body: '{"parent_ids": [103958497], "remove_parents": true}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '51' - Content-Type: - - application/json - User-Agent: - - python-requests/2.27.1 - authorization: - - XXXXXXXXXX - method: POST - uri: https://dev.lunchmoney.app/v1/transactions/unsplit - response: - content: '[103958755,103958756,103958497]' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '31' - Content-Type: - - application/json; charset=utf-8 - Date: - - Thu, 23 Jun 2022 22:46:25 GMT - Etag: - - W/"1f-b4P8tB4xecZztGw/TqD+42bEHHA" - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_asset.yaml b/tests/models/cassettes/test_update_asset.yaml deleted file mode 100644 index 0d8be0fa..00000000 --- a/tests/models/cassettes/test_update_asset.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"balance": "5.2"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '18' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/assets/78214 - response: - content: '{"id":78214,"type_name":"cash","subtype_name":null,"name":"test-account-1","display_name":"Test Account #1","balance":"5.2000","balance_as_of":"2023-12-15T02:26:08.599Z","closed_on":null,"currency":"usd","institution_name":"Test Institution","exclude_transactions":false,"created_at":"2023-12-15T02:24:12.158Z"}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '311' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:26:08 GMT - Etag: - - W/"137-vgmerT4uhwJMofHaAk5n1BfisE4" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607168&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ONA%2BVAcCxV3HxqlYICzA6ESFKT7wA9KQOKCexC0sAHk%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607168&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=ONA%2BVAcCxV3HxqlYICzA6ESFKT7wA9KQOKCexC0sAHk%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_category.yaml b/tests/models/cassettes/test_update_category.yaml deleted file mode 100644 index 31475522..00000000 --- a/tests/models/cassettes/test_update_category.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"description": "Test Category Description Updated"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '52' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/categories/443128 - response: - content: 'true' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '4' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:40:49 GMT - Etag: - - W/"4-X/5TO4MPCKAyY0ipFgr6/IraRNs" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702608049&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=o92%2FZ2oruGWKC9AbdAPC1Yn5QoZmlUIwe%2FTp3jDlq4Y%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702608049&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=o92%2FZ2oruGWKC9AbdAPC1Yn5QoZmlUIwe%2FTp3jDlq4Y%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_crypto.yaml b/tests/models/cassettes/test_update_crypto.yaml deleted file mode 100644 index b67480f2..00000000 --- a/tests/models/cassettes/test_update_crypto.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"balance": 0.5}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '16' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/crypto/manual/7286 - response: - content: '{"id":7286,"source":"manual","created_at":"2023-12-15T03:02:18.331Z","name":"Bitcoin","display_name":null,"balance":"0.500000000000000000","institution_name":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '163' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 03:03:14 GMT - Etag: - - W/"a3-z5Y92F7xf8dXvBC55j1tofFPP3M" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702609394&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kha7eBfWgP9ohByRW9jj3Zv64Cqe%2B6X335ctENBQy2Q%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702609394&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=kha7eBfWgP9ohByRW9jj3Zv64Cqe%2B6X335ctENBQy2Q%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_update_transaction.yaml b/tests/models/cassettes/test_update_transaction.yaml deleted file mode 100644 index cfbac8cf..00000000 --- a/tests/models/cassettes/test_update_transaction.yaml +++ /dev/null @@ -1,54 +0,0 @@ -interactions: -- request: - body: '{"transaction":{"notes":"Updated on 2024-01-23 16:30:37.701144"}}' - headers: - accept: - - '*/*' - accept-encoding: - - gzip, deflate - authorization: - - XXXXXXXXXX - connection: - - keep-alive - content-length: - - '65' - content-type: - - application/json - host: - - dev.lunchmoney.app - user-agent: - - lunchable/1.1.2 - method: PUT - uri: https://dev.lunchmoney.app/v1/transactions/546452296 - response: - content: '{"updated":true}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '16' - Content-Type: - - application/json; charset=utf-8 - Date: - - Tue, 23 Jan 2024 23:30:37 GMT - Etag: - - W/"10-dkPpo4JFIcQ3LWuPXbQ1isdU9JU" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1706052637&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6xx3hIyL%2BdwV%2BHTkQzPYGmuGTj8sQppv0SnpHMYmTKo%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1706052637&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=6xx3hIyL%2BdwV%2BHTkQzPYGmuGTj8sQppv0SnpHMYmTKo%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/cassettes/test_upsert_budget.yaml b/tests/models/cassettes/test_upsert_budget.yaml deleted file mode 100644 index 9a3b24e8..00000000 --- a/tests/models/cassettes/test_upsert_budget.yaml +++ /dev/null @@ -1,52 +0,0 @@ -interactions: -- request: - body: '{"start_date": "2022-11-01", "category_id": 443127, "amount": 100.0}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '68' - Content-Type: - - application/json - User-Agent: - - python-requests/2.29.0 - authorization: - - XXXXXXXXXX - method: PUT - uri: https://dev.lunchmoney.app/v1/budgets - response: - content: '{"category_group":null}' - headers: - Access-Control-Allow-Credentials: - - 'true' - Connection: - - keep-alive - Content-Length: - - '23' - Content-Type: - - application/json; charset=utf-8 - Date: - - Fri, 15 Dec 2023 02:31:37 GMT - Etag: - - W/"17-5ALBl+bKXJaccIUKdwiYXHJOenY" - Nel: - - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' - Report-To: - - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1702607496&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=9SzrWb%2BXV2D%2BK80PrVC2H4sgzEiU%2B0CPIBSaP82e4XQ%3D"}]}' - Reporting-Endpoints: - - heroku-nel=https://nel.heroku.com/reports?ts=1702607496&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&s=9SzrWb%2BXV2D%2BK80PrVC2H4sgzEiU%2B0CPIBSaP82e4XQ%3D - Server: - - Cowboy - Vary: - - Origin, Accept-Encoding - Via: - - 1.1 vegur - X-Powered-By: - - Express - http_version: HTTP/1.1 - status_code: 200 -version: 1 diff --git a/tests/models/test_assets.py b/tests/models/test_assets.py deleted file mode 100644 index b58468b2..00000000 --- a/tests/models/test_assets.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Run Tests on the Assets Endpoint -""" - -import datetime -import logging - -import pytest - -from lunchable import LunchMoney -from lunchable.models.assets import AssetsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@pytest.fixture -def lunchmoney_asset() -> AssetsObject: - """ - Static lunchable.models.AssetsObject - - Returns - ------- - AssetsObject - """ - splitwise_asset = AssetsObject( - id=78214, - type_name="cash", - subtype_name="digital wallet (paypal, venmo)", - name="Splitwise Balance", - display_name="Splitwise", - balance=-1.0, - balance_as_of=datetime.datetime( - 2021, 8, 28, 16, 6, 35, tzinfo=datetime.timezone.utc - ), - closed_on=None, - currency="usd", - institution_name="Splitwise", - created_at=datetime.datetime( - 2021, 8, 28, 16, 6, 2, 701000, tzinfo=datetime.timezone.utc - ), - ) - return splitwise_asset - - -@lunchable_cassette -def test_get_assets(lunch_money_obj: LunchMoney): - """ - Get Assets and Assert that they're assets - """ - assets = lunch_money_obj.get_assets() - assert len(assets) >= 1 - for asset in assets: - assert isinstance(asset, AssetsObject) - logger.info("%s Assets returned", len(assets)) - - -@lunchable_cassette -def test_update_asset(lunch_money_obj: LunchMoney, lunchmoney_asset: AssetsObject): - """ - Update an Asset - """ - response = lunch_money_obj.update_asset(asset_id=lunchmoney_asset.id, balance=5.20) - assert isinstance(response, AssetsObject) - logger.info(response) - - -@lunchable_cassette -def test_create_asset(lunch_money_obj: LunchMoney): - """ - Create an Asset - """ - response = lunch_money_obj.insert_asset( - type_name="cash", - name="test-account-1", - subtype_name=None, - display_name="Test Account #1", - balance=4.20, - currency="usd", - institution_name="Test Institution", - ) - assert isinstance(response, AssetsObject) - logger.info(response) diff --git a/tests/models/test_budgets.py b/tests/models/test_budgets.py deleted file mode 100644 index 11280ee4..00000000 --- a/tests/models/test_budgets.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Run Tests on the Budgets Endpoint -""" - -import datetime -import logging - -from lunchable import LunchMoney -from lunchable.models import BudgetObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_upsert_budget( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Test upserting some budgets - """ - # Ride Sharing - response = lunch_money_obj.upsert_budget( - start_date=obscure_start_date, category_id=443127, amount=100.00 - ) - assert isinstance(response, dict) or response is None - - -@lunchable_cassette -def test_get_budgets( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Test Getting some budgets - """ - budgets = lunch_money_obj.get_budgets( - start_date=obscure_start_date, - end_date=obscure_start_date + datetime.timedelta(days=28), - ) - assert len(budgets) >= 1 - for budget in budgets: - assert isinstance(budget, BudgetObject) - logger.info("%s Budgets Found", len(budgets)) - logger.info(budgets) - - -@lunchable_cassette -def test_delete_budget( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Delete a Budget - """ - deleted = lunch_money_obj.remove_budget( - start_date=obscure_start_date, category_id=443127 - ) - logger.info("Budget Deleted") - assert deleted is True diff --git a/tests/models/test_categories.py b/tests/models/test_categories.py deleted file mode 100644 index 7eff3d38..00000000 --- a/tests/models/test_categories.py +++ /dev/null @@ -1,130 +0,0 @@ -""" -Run Tests on the Categories Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.categories import CategoriesObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_categories(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories() - assert len(categories) >= 1 - for category in categories: - assert isinstance(category, CategoriesObject) - logger.info("%s Categories returned", len(categories)) - - -@lunchable_cassette -def test_create_category(lunch_money_obj: LunchMoney): - """ - Create A Single Category - """ - name = "Test Category" - category = lunch_money_obj.insert_category( - name=name, description="Test Category Description", exclude_from_budget=True - ) - logger.info("Category ID # %s was just created: %s", category, name) - assert isinstance(category, int) - - -@lunchable_cassette -def test_get_category(lunch_money_obj: LunchMoney): - """ - Get a Single Category - """ - category_id = 443128 - category = lunch_money_obj.get_category(category_id=category_id) - logger.info("Category ID # %s was just fetched: %s", category.id, category.name) - assert isinstance(category, CategoriesObject) - - -@lunchable_cassette -def test_delete_category(lunch_money_obj: LunchMoney): - """ - Delete a Category - """ - category_id = 343088 - deleted = lunch_money_obj.remove_category(category_id=category_id) - logger.info("Category ID # %s was just deleted", category_id) - assert deleted is True - - -@lunchable_cassette -def test_delete_category_force(lunch_money_obj: LunchMoney): - """ - Forcefully Delete a Category - """ - category_id = 343089 - deleted = lunch_money_obj.remove_category_force(category_id=category_id) - logger.info("Category ID # %s was just deleted", category_id) - assert deleted is True - - -@lunchable_cassette -def test_update_category(lunch_money_obj: LunchMoney): - """ - Update a Single Category - """ - category_id = 443128 - updated = lunch_money_obj.update_category( - category_id=category_id, description="Test Category Description Updated" - ) - assert isinstance(updated, bool) - - -@lunchable_cassette -def test_create_category_group(lunch_money_obj: LunchMoney): - """ - Create A Single Category Group - """ - name = "Test Category Group" - category_id = lunch_money_obj.insert_category_group( - name=name, description="Test Category Group!!", exclude_from_budget=True - ) - logger.info("Category Group ID # %s was just created: %s", category_id, name) - assert isinstance(category_id, int) - - -@lunchable_cassette -def test_add_to_category_group(lunch_money_obj: LunchMoney): - """ - Create A Single Category Group - """ - name = "Test Category Group" - category = lunch_money_obj.insert_into_category_group( - category_group_id=658694, - new_categories=["Another Another Test Category"], - category_ids=[443128], - ) - logger.info("Category Group ID # %s was just created: %s", category.id, name) - assert isinstance(category, CategoriesObject) - - -@lunchable_cassette -def test_get_categories_nested(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories(format="nested") - categories_with_children = list(filter(lambda x: x.children, categories)) - assert len(categories_with_children) >= 1 - - -@lunchable_cassette -def test_get_categories_flattened(lunch_money_obj: LunchMoney): - """ - Get Categories and Assert that they're categories - """ - categories = lunch_money_obj.get_categories(format="flattened") - assert len(categories) >= 1 - for category in categories: - assert isinstance(category, CategoriesObject) diff --git a/tests/models/test_crypto.py b/tests/models/test_crypto.py deleted file mode 100644 index c64cdfa7..00000000 --- a/tests/models/test_crypto.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Run Tests on the Crypto Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.crypto import CryptoObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_crypto(lunch_money_obj: LunchMoney): - """ - Get Crypto and assert its Crypto - """ - cryptos = lunch_money_obj.get_crypto() - assert len(cryptos) >= 1 - for crypto in cryptos: - assert isinstance(crypto, CryptoObject) - logger.info("%s Crypto Accounts returned", len(cryptos)) - - -@lunchable_cassette -def test_update_crypto(lunch_money_obj: LunchMoney): - """ - Update a Crypto Object - """ - crypto = lunch_money_obj.update_crypto(crypto_id=7286, balance=0.50) - assert isinstance(crypto, CryptoObject) - logger.info("Crypto Asset Updated: %s", crypto.id) diff --git a/tests/models/test_plaid_accounts.py b/tests/models/test_plaid_accounts.py deleted file mode 100644 index b1846ffa..00000000 --- a/tests/models/test_plaid_accounts.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -Run Tests on the Plaid Accounts Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.plaid_accounts import PlaidAccountObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_plaid_accounts(lunch_money_obj: LunchMoney): - """ - Get Plaid Account and Assert it's a Plaid Account - """ - plaid_accounts = lunch_money_obj.get_plaid_accounts() - assert len(plaid_accounts) >= 1 - for plaid_account in plaid_accounts: - assert isinstance(plaid_account, PlaidAccountObject) - logger.info("%s Plaid Accounts returned", len(plaid_accounts)) - - -@lunchable_cassette -def test_trigger_fetch_from_plaid(lunch_money_obj: LunchMoney): - """ - Trigger Plaid Fetch - """ - plaid_fetch_request = lunch_money_obj.trigger_fetch_from_plaid() - assert plaid_fetch_request is True diff --git a/tests/models/test_recurring_expenses.py b/tests/models/test_recurring_expenses.py deleted file mode 100644 index 24e2c016..00000000 --- a/tests/models/test_recurring_expenses.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Run Tests on the Recurring Expenses Endpoint -""" - -import datetime -import logging - -import pytest - -from lunchable import LunchMoney -from lunchable.models.recurring_expenses import RecurringExpensesObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_recurring_expenses( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Get Recurring Expense and Assert it's a Recurring Expense - """ - with pytest.warns(DeprecationWarning): - recurring_expenses = lunch_money_obj.get_recurring_expenses( - start_date=obscure_start_date - ) - assert len(recurring_expenses) >= 1 - for recurring_expense in recurring_expenses: - assert isinstance(recurring_expense, RecurringExpensesObject) - logger.info("%s Recurring Expenses returned", len(recurring_expenses)) diff --git a/tests/models/test_recurring_items.py b/tests/models/test_recurring_items.py deleted file mode 100644 index 08cb0d75..00000000 --- a/tests/models/test_recurring_items.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Run Tests on the Recurring Items Endpoint -""" - -import datetime -import logging - -from lunchable import LunchMoney -from lunchable.models.recurring_items import RecurringItemsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_recurring_items( - lunch_money_obj: LunchMoney, obscure_start_date: datetime.datetime -): - """ - Get Recurring Items, and ensure they are returned as RecurringItemsObject - """ - recurring_expenses = lunch_money_obj.get_recurring_items( - start_date=obscure_start_date - ) - assert len(recurring_expenses) >= 1 - for recurring_expense in recurring_expenses: - assert isinstance(recurring_expense, RecurringItemsObject) - logger.info("%s Recurring Expenses returned", len(recurring_expenses)) diff --git a/tests/models/test_tags.py b/tests/models/test_tags.py deleted file mode 100644 index 07a88a6c..00000000 --- a/tests/models/test_tags.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Run Tests on the Tags Endpoint -""" - -import logging - -from lunchable import LunchMoney -from lunchable.models.tags import TagsObject -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_tags(lunch_money_obj: LunchMoney): - """ - Get Plaid Account and Assert it's a Plaid Account - """ - tags = lunch_money_obj.get_tags() - assert len(tags) >= 1 - for tag in tags: - assert isinstance(tag, TagsObject) - logger.info("%s Plaid Accounts returned", len(tags)) diff --git a/tests/models/test_transactions.py b/tests/models/test_transactions.py deleted file mode 100644 index 515f3209..00000000 --- a/tests/models/test_transactions.py +++ /dev/null @@ -1,185 +0,0 @@ -""" -Run Tests on the Transactions Endpoint -""" - -import datetime -import logging -from time import sleep -from typing import List - -from lunchable import LunchMoney -from lunchable.models.transactions import ( - TransactionChildObject, - TransactionInsertObject, - TransactionObject, - TransactionSplitObject, - TransactionUpdateObject, -) -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_transactions(lunch_money_obj: LunchMoney): - """ - Get Transactions and assert they're Transactions - """ - transactions = lunch_money_obj.get_transactions() - assert len(transactions) >= 1 - for transaction in transactions: - assert isinstance(transaction, TransactionObject) - logger.info("%s Transactions returned", len(transactions)) - - -@lunchable_cassette -def test_get_transaction(lunch_money_obj: LunchMoney): - """ - Get Transaction (singular) and assert it's a Transaction - """ - transaction = lunch_money_obj.get_transaction(transaction_id=546434806) - assert isinstance(transaction, TransactionObject) - logger.info("Transaction returned: %s", transaction.id) - - -@lunchable_cassette -def test_insert_transactions( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Insert a Transaction into Lunch Money - """ - random_note = f"Random Test Description: {datetime.datetime.now()}" - new_transaction = TransactionInsertObject( - date=datetime.datetime.now().date(), - payee="Random Test", - notes=random_note, - amount=3.50, - asset_id=test_transactions[0].asset_id, - ) - response = lunch_money_obj.insert_transactions(transactions=new_transaction) - string_ints = [str(integer) for integer in response] - logger.info("Transactions(s) Created: %s", ", ".join(string_ints)) - for transaction_id in response: - assert isinstance(transaction_id, int) - - -@lunchable_cassette -def test_update_transaction( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Update a Transaction in Lunch Money - """ - transaction_note = f"Updated on {datetime.datetime.now()}" - transaction_update_obj = TransactionUpdateObject(notes=transaction_note) - response = lunch_money_obj.update_transaction( - transaction_id=test_transactions[1].id, transaction=transaction_update_obj - ) - assert response["updated"] is True - - -@lunchable_cassette -def test_create_and_delete_transaction_group( - lunch_money_obj: LunchMoney, test_transactions: List[TransactionObject] -): - """ - Create a transaction group - """ - group_id = lunch_money_obj.insert_transaction_group( - date=datetime.datetime.now().date(), - payee="Test", - notes="Test Transaction Group", - transactions=[test_transactions[1].id, test_transactions[2].id], - ) - assert isinstance(group_id, int) - logger.info("Transaction Group created, ID# %s", group_id) - sleep(1) - response = lunch_money_obj.remove_transaction_group(transaction_group_id=group_id) - for transaction_id in response: - assert isinstance(transaction_id, int) - logger.info("Transactions part of group: %s", response) - - -@lunchable_cassette -def test_split_transaction(lunch_money_obj: LunchMoney): - """ - Try to split a transaction - """ - transaction_to_split = lunch_money_obj.get_transaction(179018320) - amount_1 = transaction_to_split.amount / 2 - split_object = TransactionSplitObject( - date=transaction_to_split.date, - category_id=transaction_to_split.category_id, - notes=transaction_to_split.notes, - amount=amount_1, - ) - split_object_2 = split_object.model_copy() - new_split = lunch_money_obj.update_transaction( - transaction_id=transaction_to_split.id, split=[split_object, split_object_2] - ) - assert len(new_split["split"]) == 2 - - -@lunchable_cassette -def test_unsplit_transaction(lunch_money_obj: LunchMoney): - """ - Try to unsplit a transaction - """ - transaction_ids = [179018299] - response = lunch_money_obj.unsplit_transactions( - parent_ids=transaction_ids, remove_parents=True - ) - assert len(response) == 3 - - -@lunchable_cassette -def test_get_uncleared_transactions(lunch_money_obj: LunchMoney) -> None: - """ - Get uncleared transactions - - Enum values previously weren't getting JSON encoded - """ - uncleared_transactions = lunch_money_obj.get_transactions(status="uncleared") - assert len(uncleared_transactions) >= 1 - for transaction in uncleared_transactions: - assert isinstance(transaction, TransactionObject) - - -@lunchable_cassette -def test_204_response(lunch_money_obj: LunchMoney) -> None: - """ - Test that a 204 response is handled correctly - - This test includes a hand-edited cassette to simulate a 204 response - """ - test_transaction = TransactionInsertObject( - date=datetime.date.today(), - payee="Test", - notes="Test Transaction Group", - amount=3.50, - ) - response = lunch_money_obj.insert_transactions(transactions=test_transaction) - assert response == [] - - -@lunchable_cassette -def test_get_transaction_group(lunch_money_obj: LunchMoney) -> None: - """ - Test get_transaction_group - """ - transaction_group = lunch_money_obj.get_transaction_group(transaction_id=856827078) - assert isinstance(transaction_group, TransactionObject) - assert transaction_group.is_group is True - assert isinstance(transaction_group.children[0], TransactionChildObject) - - -@lunchable_cassette -def test_get_transactions_no_paginate(lunch_money_obj: LunchMoney) -> None: - """ - Test get_transactions with no pagination - """ - transactions = lunch_money_obj.get_transactions(limit=5) - assert len(transactions) >= 1 - for transaction in transactions: - assert isinstance(transaction, TransactionObject) diff --git a/tests/models/test_user.py b/tests/models/test_user.py deleted file mode 100644 index 649a619c..00000000 --- a/tests/models/test_user.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Run Tests on the Miscellaneous Endpoints -""" - -import logging - -from lunchable import LunchMoney -from tests.conftest import lunchable_cassette - -logger = logging.getLogger(__name__) - - -@lunchable_cassette -def test_get_user(lunch_money_obj: LunchMoney): - """ - Get Me Object - """ - me = lunch_money_obj.get_user() - assert isinstance(me.user_id, int) - assert isinstance(me.user_email, str) - assert isinstance(me.budget_name, str) - assert me.api_key_label == "Lunchable" diff --git a/tests/test_cli.py b/tests/test_cli.py deleted file mode 100644 index 2a1d7d8a..00000000 --- a/tests/test_cli.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Test cases for the __main__ module. -""" - -import pytest -from click.testing import CliRunner - - -@pytest.fixture -def runner() -> CliRunner: - """ - Fixture for invoking command-line interfaces. - """ - return CliRunner() - - -@pytest.mark.filterwarnings("ignore:datetime.datetime.utcfromtimestamp") -def test_main_succeeds(runner: CliRunner) -> None: - """ - It exits with a status code of zero. - """ - from lunchable._cli import cli - - result = runner.invoke(cli) - assert result.exit_code == 0 - - -def test_registered_plugins(runner: CliRunner) -> None: - """ - Assert that all registered plugins are available. - """ - from lunchable._cli import cli - - builtin_plugins = ["primelunch", "splitlunch", "pushlunch"] - - for plugin in builtin_plugins: - result = runner.invoke(cli, ["plugins", plugin, "--help"]) - assert result.exit_code == 0