diff --git a/.vscode/settings.json b/.vscode/settings.json index c5632ba..5f69485 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,30 +1,53 @@ { // Enable the ESlint flat config support "eslint.experimental.useFlatConfig": true, - // Disable the default formatter, use eslint instead "prettier.enable": false, "editor.formatOnSave": false, - // Auto fix "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "never" }, - // Silent the stylistic rules in you IDE, but still auto fix them "eslint.rules.customizations": [ - { "rule": "style/*", "severity": "off" }, - { "rule": "*-indent", "severity": "off" }, - { "rule": "*-spacing", "severity": "off" }, - { "rule": "*-spaces", "severity": "off" }, - { "rule": "*-order", "severity": "off" }, - { "rule": "*-dangle", "severity": "off" }, - { "rule": "*-newline", "severity": "off" }, - { "rule": "*quotes", "severity": "off" }, - { "rule": "*semi", "severity": "off" } + { + "rule": "style/*", + "severity": "off" + }, + { + "rule": "*-indent", + "severity": "off" + }, + { + "rule": "*-spacing", + "severity": "off" + }, + { + "rule": "*-spaces", + "severity": "off" + }, + { + "rule": "*-order", + "severity": "off" + }, + { + "rule": "*-dangle", + "severity": "off" + }, + { + "rule": "*-newline", + "severity": "off" + }, + { + "rule": "*quotes", + "severity": "off" + }, + { + "rule": "*semi", + "severity": "off" + } ], - // Enable eslint for all supported languages "eslint.validate": [ "javascript", diff --git a/README.md b/README.md index c43b25b..1ae981e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![JSDocs][jsdocs-src]][jsdocs-href] [![License][license-src]][license-href] -A package to deploy AO contracts. +A package for deploying AO contracts. ## Installation @@ -39,52 +39,97 @@ bun add ao-deploy --dev ### CLI ```sh -Usage: ao-deploy [options] +Usage: ao-deploy [options] -A CLI tool to deploy AO contracts +Deploy AO contracts using a CLI. Arguments: - contractPath Contract main file path to deploy + contractOrConfigPath Path to the main contract file or deployment configuration. Options: - -V, --version output the version number - -n, --name [name] Name of the process to spawn (default: "default") - -w, --wallet [wallet] Wallet JWK file path - -s, --scheduler [scheduler] Scheduler to use for Process (default: "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA") - -m, --module [module] The module source to use to spin up Process - -c, --cron [interval] Cron interval to use for Process i.e (1-minute, 5-minutes) - -t, --tags [tags...] Additional tags to use when spawning Process - --retry-count [count] Retry count to spawn Process (default: "10") - --retry-delay [delay] Retry delay in milliseconds (default: "3000") - -h, --help display help for command + -V, --version output the version number + -n, --name [name] Specify the process name. (default: "default") + -w, --wallet [wallet] Path to the wallet JWK file. + -l, --lua-path [luaPath] Specify the Lua modules path seperated by semicolon. + -d, --deploy [deploy] List of deployment configuration names, separated by commas. + -s, --scheduler [scheduler] Scheduler to be used for the process. (default: "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA") + -m, --module [module] Module source for spawning the process. + -c, --cron [interval] Cron interval for the process (e.g. 1-minute, 5-minutes). + -t, --tags [tags...] Additional tags for spawning the process. + -p, --process-id [processId] Specify process Id of existing process. + --concurrency [limit] Concurrency limit for deploying multiple processes. (default: "5") + --retry-count [count] Number of retries for deploying contract. (default: "10") + --retry-delay [delay] Delay between retries in milliseconds. (default: "3000") + -h, --help display help for command ``` -#### CLI Example +#### CLI Examples ```sh ao-deploy process.lua -n tictactoe -w wallet.json --tags name1:value1 name2:value2 ``` -OR, +##### Deployment with configuration + +Here is an example using a deployment configuration: + +```ts +// aod.config.ts +import { defineConfig } from 'ao-deploy' + +const wallet = 'wallet.json' +const luaPath = './?.lua;./src/?.lua' + +const config = defineConfig({ + contract_1: { + luaPath, + name: `contract-1`, + contractPath: 'contract-1.lua', + wallet, + }, + contract_2: { + luaPath, + name: `contract-2`, + contractPath: 'contract-2.lua', + wallet, + }, + contract_3: { + luaPath, + name: `contract-3`, + contractPath: 'contract-3.lua', + wallet, + } +}) + +export default config +``` + +Deploy all specified contracts: ```sh -aod process.lua -n tictactoe -w wallet.json --tags name1:value1 name2:value2 +ao-deploy aod.config.ts +``` + +Deploy specific contracts: + +```sh +ao-deploy aod.config.ts --deploy=contract_1,contract_3 ``` > [!Note] A wallet is generated and saved if not passed. -Run this command to get the generated wallet path: +Retrieve the generated wallet path: ```sh node -e "const path = require('path'); const os = require('os'); console.log(path.resolve(os.homedir(), '.aos.json'));" ``` -### Code +### API Usage To deploy a contract, you need to import and call the `deployContract` function from your script. Here is a basic example: -#### Example +#### Example: deployContract ```ts import { deployContract } from 'ao-deploy' @@ -108,15 +153,14 @@ async function main() { console.log(`\nDeployed Process: ${processUrl} \nDeployment Message: ${messageUrl}`) } catch (error: any) { - console.log('\nDeployment failed!\n') - console.log(error?.message ?? 'Failed to deploy contract!') + console.log(`Deployment failed!: ${error?.message ?? 'Failed to deploy contract!'}\n`) } } main() ``` -#### Parameters +##### Parameters The `deployContract` function accepts the following parameters within the DeployArgs object: @@ -128,6 +172,62 @@ The `deployContract` function accepts the following parameters within the Deploy - `cron` (optional): The cron interval for the process, e.g., "1-minute", "5-minutes". Use format `interval-(second, seconds, minute, minutes, hour, hours, day, days, month, months, year, years, block, blocks, Second, Seconds, Minute, Minutes, Hour, Hours, Day, Days, Month, Months, Year, Years, Block, Blocks)` - `wallet` (optional): The wallet path or JWK itself (Autogenerated if not passed). - `retry` (optional): Retry options with `count` and `delay` properties. By default, it will retry up to `10` times with a `3000` milliseconds delay between attempts. +- `luaPath` (optional): The path to the Lua modules seperated by semicolon. +- `processId` (optional): The process id of existing process. + +#### Example: deployContracts + +To deploy contracts, you need to import and call the `deployContracts` function from your script. Here is a basic example: + +```ts +import { deployContracts } from 'ao-deploy' + +async function main() { + try { + const results = await deployContracts( + [ + { + name: 'demo1', + wallet: 'wallet.json', + contractPath: 'process1.lua', + tags: [{ name: 'Custom', value: 'Tag' }], + retry: { + count: 10, + delay: 3000, + }, + }, + { + name: 'demo2', + wallet: 'wallet.json', + contractPath: 'process2.lua', + tags: [{ name: 'Custom', value: 'Tag' }], + retry: { + count: 10, + delay: 3000, + }, + } + ], + 2 + ) + results.forEach((result, idx) => { + if (result.status === 'fulfilled') { + const { processId, messageId } = result.value + const processUrl = `https://ao_marton.g8way.io/#/process/${processId}` + const messageUrl = `${processUrl}/${messageId}` + console.log(`\nDeployed Process: ${processUrl} \nDeployment Message: ${messageUrl}`) + } + else { + console.log(`Failed to deploy contract!: ${result.reason}\n`) + } + }) + } + catch (error: any) { + console.log(`Deployment failed!: ${error?.message ?? 'Failed to deploy contract!'}\n`) + } +} + +main() +``` ## Author diff --git a/build.config.ts b/build.config.ts index 9740f93..b0c77ee 100644 --- a/build.config.ts +++ b/build.config.ts @@ -8,6 +8,7 @@ export default defineBuildConfig([{ clean: true, rollup: { emitCJS: true, + inlineDependencies: true, }, failOnWarn: false, }, { @@ -18,6 +19,7 @@ export default defineBuildConfig([{ clean: true, rollup: { emitCJS: false, + inlineDependencies: true, }, failOnWarn: false, }]) diff --git a/eslint.config.js b/eslint.config.js index 22868c8..cf4982a 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,6 +11,9 @@ export default antfu( rules: { // overrides 'no-console': 'off', + 'brace-style': ['error', 'stroustrup', { allowSingleLine: true }], + 'indent': ['error', 2], + 'curly': ['error', 'all'], }, }, ) diff --git a/package.json b/package.json index 3d8557e..3410fc0 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "0.1.4", "packageManager": "pnpm@8.15.3", - "description": "A package to deploy contract to AO", + "description": "A package for deploying AO contracts", "author": "Pawan Paudel ", "license": "MIT", "funding": "https://github.com/sponsors/pawanpaudel93", @@ -52,30 +52,30 @@ "prepare": "simple-git-hooks" }, "dependencies": { - "@permaweb/aoconnect": "^0.0.51", + "@permaweb/aoconnect": "^0.0.53", "ardb": "^1.1.10", - "arweave": "^1.15.0", + "arweave": "^1.15.1", "chalk": "^5.3.0", "commander": "^12.0.0", - "ora": "^8.0.1", + "jiti": "^1.21.0", "pretty-file-tree": "^1.0.1" }, "devDependencies": { - "@antfu/eslint-config": "^2.14.0", + "@antfu/eslint-config": "^2.16.1", "@antfu/ni": "^0.21.12", "@antfu/utils": "^0.7.7", - "@types/node": "^20.12.7", - "bumpp": "^9.4.0", + "@types/node": "^20.12.8", + "bumpp": "^9.4.1", "eslint": "^8.57.0", "esno": "^4.7.0", "lint-staged": "^15.2.2", - "pnpm": "^8.15.7", + "pnpm": "^8.15.8", "rimraf": "^5.0.5", "simple-git-hooks": "^2.11.1", "typescript": "^5.4.5", "unbuild": "^2.0.0", - "vite": "^5.2.9", - "vitest": "^1.5.0" + "vite": "^5.2.11", + "vitest": "^1.6.0" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5b19f0..3e93b07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,30 +9,30 @@ importers: .: dependencies: '@permaweb/aoconnect': - specifier: ^0.0.51 - version: 0.0.51 + specifier: ^0.0.53 + version: 0.0.53 ardb: specifier: ^1.1.10 version: 1.1.10 arweave: - specifier: ^1.15.0 - version: 1.15.0 + specifier: ^1.15.1 + version: 1.15.1 chalk: specifier: ^5.3.0 version: 5.3.0 commander: specifier: ^12.0.0 version: 12.0.0 - ora: - specifier: ^8.0.1 - version: 8.0.1 + jiti: + specifier: ^1.21.0 + version: 1.21.0 pretty-file-tree: specifier: ^1.0.1 version: 1.0.1 devDependencies: '@antfu/eslint-config': - specifier: ^2.14.0 - version: 2.14.0(@vue/compiler-sfc@3.4.22)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.5.0) + specifier: ^2.16.1 + version: 2.16.1(@vue/compiler-sfc@3.4.26)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0) '@antfu/ni': specifier: ^0.21.12 version: 0.21.12 @@ -40,11 +40,11 @@ importers: specifier: ^0.7.7 version: 0.7.7 '@types/node': - specifier: ^20.12.7 - version: 20.12.7 + specifier: ^20.12.8 + version: 20.12.8 bumpp: - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.4.1 + version: 9.4.1 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -55,8 +55,8 @@ importers: specifier: ^15.2.2 version: 15.2.2 pnpm: - specifier: ^8.15.7 - version: 8.15.7 + specifier: ^8.15.8 + version: 8.15.8 rimraf: specifier: ^5.0.5 version: 5.0.5 @@ -70,19 +70,14 @@ importers: specifier: ^2.0.0 version: 2.0.0(typescript@5.4.5) vite: - specifier: ^5.2.9 - version: 5.2.9(@types/node@20.12.7) + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.8) vitest: - specifier: ^1.5.0 - version: 1.5.0(@types/node@20.12.7) + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.12.8) packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -91,16 +86,16 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@antfu/eslint-config@2.14.0(@vue/compiler-sfc@3.4.22)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.5.0): - resolution: {integrity: sha512-9yn/5n/dZnH7qSlCTk1Z3VWPbNb3Wfq31GflQuXkh3jUqSCHuDbuspfDAQ3/ABnrPRJSP1Nm7yTKJbXfcQ3p+A==} + /@antfu/eslint-config@2.16.1(@vue/compiler-sfc@3.4.26)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0): + resolution: {integrity: sha512-7oHCor9ZgVb8FguStNZMOZLRdyYdr1/t6EhhWVSXZjuq7086OFdlksdav6jcflOzazo0doRlP12urzoYq+r1cg==} hasBin: true peerDependencies: + '@eslint-react/eslint-plugin': ^1.5.8 '@unocss/eslint-plugin': '>=0.50.0' astro-eslint-parser: ^0.16.3 eslint: '>=8.40.0' eslint-plugin-astro: ^0.31.4 eslint-plugin-format: '>=0.1.0' - eslint-plugin-react: ^7.33.2 eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.4.4 eslint-plugin-solid: ^0.13.2 @@ -109,6 +104,8 @@ packages: prettier-plugin-slidev: ^1.0.5 svelte-eslint-parser: ^0.33.1 peerDependenciesMeta: + '@eslint-react/eslint-plugin': + optional: true '@unocss/eslint-plugin': optional: true astro-eslint-parser: @@ -117,8 +114,6 @@ packages: optional: true eslint-plugin-format: optional: true - eslint-plugin-react: - optional: true eslint-plugin-react-hooks: optional: true eslint-plugin-react-refresh: @@ -134,32 +129,33 @@ packages: svelte-eslint-parser: optional: true dependencies: - '@antfu/install-pkg': 0.3.2 + '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 1.7.2(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@stylistic/eslint-plugin': 1.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-config-flat-gitignore: 0.1.5 - eslint-flat-config-utils: 0.2.3 + eslint-flat-config-utils: 0.2.4 eslint-merge-processors: 0.1.0(eslint@8.57.0) eslint-plugin-antfu: 2.1.2(eslint@8.57.0) + eslint-plugin-command: 0.1.8(eslint@8.57.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) eslint-plugin-import-x: 0.5.0(eslint@8.57.0)(typescript@5.4.5) eslint-plugin-jsdoc: 48.2.3(eslint@8.57.0) eslint-plugin-jsonc: 2.15.1(eslint@8.57.0) eslint-plugin-markdown: 4.0.1(eslint@8.57.0) - eslint-plugin-n: 17.2.1(eslint@8.57.0) + eslint-plugin-n: 17.4.0(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.9.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2) + eslint-plugin-perfectionist: 2.10.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2) eslint-plugin-toml: 0.11.0(eslint@8.57.0) eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) - eslint-plugin-unused-imports: 3.1.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0) - eslint-plugin-vitest: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.5.0) + eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.7.1)(eslint@8.57.0) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.7.1)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0) eslint-plugin-vue: 9.25.0(eslint@8.57.0) eslint-plugin-yml: 1.14.0(eslint@8.57.0) - eslint-processor-vue-blocks: 0.1.1(@vue/compiler-sfc@3.4.22)(eslint@8.57.0) - globals: 15.0.0 + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.26)(eslint@8.57.0) + globals: 15.1.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 parse-gitignore: 2.0.0 @@ -176,10 +172,10 @@ packages: - vitest dev: true - /@antfu/install-pkg@0.3.2: - resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} + /@antfu/install-pkg@0.3.3: + resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==} dependencies: - execa: 8.0.1 + '@jsdevtools/ez-spawn': 3.0.4 dev: true /@antfu/ni@0.21.12: @@ -195,7 +191,7 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.24.2 + '@babel/highlight': 7.24.5 picocolors: 1.0.0 dev: true @@ -204,20 +200,20 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.4: - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 + '@babel/generator': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -227,11 +223,11 @@ packages: - supports-color dev: true - /@babel/generator@7.24.4: - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + /@babel/generator@7.24.5: + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -258,49 +254,49 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-simple-access@7.24.5: + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-split-export-declaration@7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true /@babel/helper-string-parser@7.24.1: @@ -308,8 +304,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} dev: true @@ -318,38 +314,38 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.4: - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + /@babel/helpers@7.24.5: + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + /@babel/highlight@7.24.5: + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} requiresBuild: true dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 dev: true - /@babel/parser@7.24.4: - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: true - /@babel/standalone@7.24.4: - resolution: {integrity: sha512-V4uqWeedadiuiCx5P5OHYJZ1PehdMpcBccNCEptKFGPiZIY3FI5f2ClxUl4r5wZ5U+ohcQ+4KW6jX2K6xXzq4Q==} + /@babel/standalone@7.24.5: + resolution: {integrity: sha512-Sl8oN9bGfRlNUA2jzfzoHEZxFBDliBlwi5mPVCAWKSlBNkXXJOHpu7SDOqjF6mRoTa6GNX/1kAWG3Tr+YQ3N7A==} engines: {node: '>=6.9.0'} dev: true @@ -358,34 +354,34 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 dev: true - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + /@babel/traverse@7.24.5: + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 + '@babel/generator': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + /@babel/types@7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 dev: true @@ -971,26 +967,27 @@ packages: fastq: 1.17.1 dev: true - /@permaweb/ao-scheduler-utils@0.0.17: - resolution: {integrity: sha512-S/E+WDLyJyugd55+ce3UylDaewa9ygg83q4B2zdghcMbyFiSCtib8vSg48PSZoU98IJJ2xayfrtoy2duMhskbg==} + /@permaweb/ao-scheduler-utils@0.0.19: + resolution: {integrity: sha512-xwIe9FqQ1UZxEYWvSGJDONz0xr4vDq2Ny1NeRUiO0dKYoonShN+oI1ULgrHocKOjOPNEgRX70vMCKGLe+3x70A==} engines: {node: '>=18'} dependencies: - lru-cache: 10.2.0 - ramda: 0.29.1 + lru-cache: 10.2.2 + ramda: 0.30.0 + zod: 3.23.6 dev: false - /@permaweb/aoconnect@0.0.51: - resolution: {integrity: sha512-R9XsUPqerurw1dxsrIusXk7AHWrrSlCAwJuTfs35mb9s8u5yY0fNXB3b8EdNzomF/zivlyls/dWYhxVFmO2DQQ==} + /@permaweb/aoconnect@0.0.53: + resolution: {integrity: sha512-AFfuTBU35d82JzwfHlHMJaHTB544LO2laK6lRSEaemD/Q2YDdqA/Nje7EattksB+GNUMwPbRG9WZjsIGS/ZsdA==} engines: {node: '>=18'} dependencies: - '@permaweb/ao-scheduler-utils': 0.0.17 + '@permaweb/ao-scheduler-utils': 0.0.19 buffer: 6.0.3 debug: 4.3.4 hyper-async: 1.1.2 mnemonist: 0.39.8 ramda: 0.29.1 warp-arbundles: 1.0.4 - zod: 3.22.4 + zod: 3.23.6 transitivePeerDependencies: - supports-color dev: false @@ -1029,7 +1026,7 @@ packages: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.9 + magic-string: 0.30.10 rollup: 3.29.4 dev: true @@ -1074,7 +1071,7 @@ packages: optional: true dependencies: '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - magic-string: 0.30.9 + magic-string: 0.30.10 rollup: 3.29.4 dev: true @@ -1093,128 +1090,128 @@ packages: rollup: 3.29.4 dev: true - /@rollup/rollup-android-arm-eabi@4.14.3: - resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==} + /@rollup/rollup-android-arm-eabi@4.17.2: + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.14.3: - resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==} + /@rollup/rollup-android-arm64@4.17.2: + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.14.3: - resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==} + /@rollup/rollup-darwin-arm64@4.17.2: + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.14.3: - resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==} + /@rollup/rollup-darwin-x64@4.17.2: + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.3: - resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==} + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.14.3: - resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==} + /@rollup/rollup-linux-arm-musleabihf@4.17.2: + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.3: - resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==} + /@rollup/rollup-linux-arm64-gnu@4.17.2: + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.3: - resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==} + /@rollup/rollup-linux-arm64-musl@4.17.2: + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: - resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==} + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.3: - resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==} + /@rollup/rollup-linux-riscv64-gnu@4.17.2: + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.3: - resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==} + /@rollup/rollup-linux-s390x-gnu@4.17.2: + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.3: - resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==} + /@rollup/rollup-linux-x64-gnu@4.17.2: + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.3: - resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==} + /@rollup/rollup-linux-x64-musl@4.17.2: + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.3: - resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==} + /@rollup/rollup-win32-arm64-msvc@4.17.2: + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.3: - resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==} + /@rollup/rollup-win32-ia32-msvc@4.17.2: + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.3: - resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==} + /@rollup/rollup-win32-x64-msvc@4.17.2: + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] requiresBuild: true @@ -1225,13 +1222,18 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@stylistic/eslint-plugin-js@1.7.2(eslint@8.57.0): - resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + + /@stylistic/eslint-plugin-js@1.8.0(eslint@8.57.0): + resolution: {integrity: sha512-jdvnzt+pZPg8TfclZlTZPiUbbima93ylvQ+wNgHLNmup3obY6heQvgewSu9i2CfS61BnRByv+F9fxQLPoNeHag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@types/eslint': 8.56.9 + '@types/eslint': 8.56.10 acorn: 8.11.3 escape-string-regexp: 4.0.0 eslint: 8.57.0 @@ -1239,25 +1241,25 @@ packages: espree: 9.6.1 dev: true - /@stylistic/eslint-plugin-jsx@1.7.2(eslint@8.57.0): - resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} + /@stylistic/eslint-plugin-jsx@1.8.0(eslint@8.57.0): + resolution: {integrity: sha512-PC7tYXipF03TTilGJva1amAham7qOAFXT5r5jLTY6iIxkFqyb6H7Ljx5pv8d7n98VyIVidOEKY/AP8vNzAFNKg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) - '@types/eslint': 8.56.9 + '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) + '@types/eslint': 8.56.10 eslint: 8.57.0 estraverse: 5.3.0 picomatch: 4.0.2 dev: true - /@stylistic/eslint-plugin-plus@1.7.2(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} + /@stylistic/eslint-plugin-plus@1.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-TkrjzzYmTuAaLvFwtxomsgMUD8g8PREOQOQzTfKmiJ6oc4XOyFW4q/L9ES1J3UFSLybNCwbhu36lhXJut1w2Sg==} peerDependencies: eslint: '*' dependencies: - '@types/eslint': 8.56.9 + '@types/eslint': 8.56.10 '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: @@ -1265,14 +1267,14 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin-ts@1.7.2(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} + /@stylistic/eslint-plugin-ts@1.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-WuCIhz4JEHxzhAWjrBASMGj6Or1wAjDqTsRIck3DRRrw/FJ8C/8AAuHPk8ECHNSDI5PZ0OT72nF2uSUn0aQq1w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) - '@types/eslint': 8.56.9 + '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) + '@types/eslint': 8.56.10 '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: @@ -1280,17 +1282,17 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin@1.7.2(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} + /@stylistic/eslint-plugin@1.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-JRR0lCDU97AiE0X6qTc/uf8Hv0yETUdyJgoNzTLUIWdhVJVe/KGPnFmEsO1iXfNUIS6vhv3JJ5vaZ2qtXhZe1g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@8.57.0) - '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@8.57.0) - '@stylistic/eslint-plugin-plus': 1.7.2(eslint@8.57.0)(typescript@5.4.5) - '@stylistic/eslint-plugin-ts': 1.7.2(eslint@8.57.0)(typescript@5.4.5) - '@types/eslint': 8.56.9 + '@stylistic/eslint-plugin-js': 1.8.0(eslint@8.57.0) + '@stylistic/eslint-plugin-jsx': 1.8.0(eslint@8.57.0) + '@stylistic/eslint-plugin-plus': 1.8.0(eslint@8.57.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-ts': 1.8.0(eslint@8.57.0)(typescript@5.4.5) + '@types/eslint': 8.56.10 eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -1302,8 +1304,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /@types/eslint@8.56.9: - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -1323,8 +1325,8 @@ packages: '@types/unist': 2.0.10 dev: true - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + /@types/node@20.12.8: + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} dependencies: undici-types: 5.26.5 dev: true @@ -1345,8 +1347,8 @@ packages: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} dev: true - /@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + /@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1357,11 +1359,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/type-utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.1 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 @@ -1374,8 +1376,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + /@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1384,10 +1386,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.1 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.5 @@ -1403,16 +1405,24 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.7.0: - resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + /@typescript-eslint/scope-manager@7.7.1: + resolution: {integrity: sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/visitor-keys': 7.7.1 + dev: true + + /@typescript-eslint/scope-manager@7.8.0: + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 dev: true - /@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + /@typescript-eslint/type-utils@7.7.1(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1421,8 +1431,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -1436,8 +1446,13 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.7.0: - resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + /@typescript-eslint/types@7.7.1: + resolution: {integrity: sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/types@7.8.0: + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} engines: {node: ^18.18.0 || >=20.0.0} dev: true @@ -1463,8 +1478,30 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5): - resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + /@typescript-eslint/typescript-estree@7.7.1(typescript@5.4.5): + resolution: {integrity: sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/visitor-keys': 7.7.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1472,8 +1509,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1504,8 +1541,27 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + /@typescript-eslint/utils@7.7.1(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1513,9 +1569,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -1531,11 +1587,19 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.7.0: - resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + /@typescript-eslint/visitor-keys@7.7.1: + resolution: {integrity: sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/types': 7.7.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.8.0: + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.8.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1543,38 +1607,38 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/expect@1.5.0: - resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} dependencies: - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 dev: true - /@vitest/runner@1.5.0: - resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} dependencies: - '@vitest/utils': 1.5.0 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.5.0: - resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.9 + magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.5.0: - resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.5.0: - resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1582,46 +1646,46 @@ packages: pretty-format: 29.7.0 dev: true - /@vue/compiler-core@3.4.22: - resolution: {integrity: sha512-FBDRCBE/rFPA8OfTUrARx2c49N7zoImlGT7hsFikv0pZxQlFhffQwewpEXaLynZW0/DspVXmNA+QQ9dXINpWmg==} + /@vue/compiler-core@3.4.26: + resolution: {integrity: sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==} dependencies: - '@babel/parser': 7.24.4 - '@vue/shared': 3.4.22 + '@babel/parser': 7.24.5 + '@vue/shared': 3.4.26 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 dev: true - /@vue/compiler-dom@3.4.22: - resolution: {integrity: sha512-YkAS+jZc6Ip360kT3lZbMQZteiYBbHDSVKr94Jdd8Zjr7VjSkkXKAFFR/FW+2tNtBYXOps6xrWlOquy3GeYB0w==} + /@vue/compiler-dom@3.4.26: + resolution: {integrity: sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==} dependencies: - '@vue/compiler-core': 3.4.22 - '@vue/shared': 3.4.22 + '@vue/compiler-core': 3.4.26 + '@vue/shared': 3.4.26 dev: true - /@vue/compiler-sfc@3.4.22: - resolution: {integrity: sha512-Pncp5Vc8E2Ef1o5uveO8WA1IqM7rt0R1jN8D4qitQYOUxC97iITGYA8oMInQ3UcDS7ip+SegyA2HbAEB4V6NMQ==} + /@vue/compiler-sfc@3.4.26: + resolution: {integrity: sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==} dependencies: - '@babel/parser': 7.24.4 - '@vue/compiler-core': 3.4.22 - '@vue/compiler-dom': 3.4.22 - '@vue/compiler-ssr': 3.4.22 - '@vue/shared': 3.4.22 + '@babel/parser': 7.24.5 + '@vue/compiler-core': 3.4.26 + '@vue/compiler-dom': 3.4.26 + '@vue/compiler-ssr': 3.4.26 + '@vue/shared': 3.4.26 estree-walker: 2.0.2 - magic-string: 0.30.9 + magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 dev: true - /@vue/compiler-ssr@3.4.22: - resolution: {integrity: sha512-ycb2sL0SW6AkgVMrvaU/TIAEk7FQWyv/oYya44E/V9xURM+ij9Oev5bVobSS7GLJzkUieWW3SrYcK/PZpb5i4A==} + /@vue/compiler-ssr@3.4.26: + resolution: {integrity: sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==} dependencies: - '@vue/compiler-dom': 3.4.22 - '@vue/shared': 3.4.22 + '@vue/compiler-dom': 3.4.26 + '@vue/shared': 3.4.26 dev: true - /@vue/shared@3.4.22: - resolution: {integrity: sha512-cg7R9XNk4ovV3bKka/1a464O2oY0l5Fyt0rwGR4hSJRPjUJ0WVjrPdsr4W0JbUriwiM8EKcCcCjeKN5pRMs2Zg==} + /@vue/shared@3.4.26: + resolution: {integrity: sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==} dev: true /@weavery/clarity@0.1.5: @@ -1669,6 +1733,7 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -1706,19 +1771,19 @@ packages: /arconnect@0.2.9: resolution: {integrity: sha512-Us49eN/+8l6BrkAPdXnJVPwWlxxUPR7QaBjA0j3OBAcioIFRpwTdoPN9FxtwDGN91lgM6ebOudTXJToRiNizoA==} dependencies: - arweave: 1.15.0 + arweave: 1.15.1 dev: false /arconnect@0.4.2: resolution: {integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==} dependencies: - arweave: 1.15.0 + arweave: 1.15.1 dev: false /ardb@1.1.10: resolution: {integrity: sha512-LtDa0T6FXiNG9D9kcyboEFfmvVJ9Y+W8404UTQS3BkvgqHHKsgFUuftft3RepAZVvR2bc+z5z+/koqgUe7LIUA==} dependencies: - arweave: 1.15.0 + arweave: 1.15.1 blockweave: 1.0.18 transitivePeerDependencies: - debug @@ -1741,14 +1806,14 @@ packages: /arweave-multihost@0.1.0: resolution: {integrity: sha512-biIkzQ3oc4RLV1MORQnqWz51IazP++K/8SsYMjUokK0cUfBLqom4pufKFCjTkGQIZMWWanXxnZqL66hHPgTCgA==} dependencies: - arweave: 1.15.0 + arweave: 1.15.1 axios: 0.21.4 transitivePeerDependencies: - debug dev: false - /arweave@1.15.0: - resolution: {integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==} + /arweave@1.15.1: + resolution: {integrity: sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ==} engines: {node: '>=18'} dependencies: arconnect: 0.4.2 @@ -1778,7 +1843,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001610 + caniuse-lite: 1.0.30001616 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1868,10 +1933,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001610 - electron-to-chromium: 1.4.737 + caniuse-lite: 1.0.30001616 + electron-to-chromium: 1.4.756 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.15(browserslist@4.23.0) dev: true /bson@4.7.2: @@ -1904,8 +1969,8 @@ packages: engines: {node: '>=6'} dev: true - /bumpp@9.4.0: - resolution: {integrity: sha512-T+N+B5mSSvsTt7kgxGXCKQd957IxmEZwMn2nWirspGUY08u/cBNrpQDMXk43fzLegZtKtXS1v9S06vq2zf6lXQ==} + /bumpp@9.4.1: + resolution: {integrity: sha512-kzhp/LpNX0HkUpEyLd7sU2LTN/mbAVgcxJ1Zi2cAJTE/tul6rypSKGpH8UywDpzKWItL8LVdKsIFnwmylw0+7g==} engines: {node: '>=10'} hasBin: true dependencies: @@ -1923,16 +1988,16 @@ packages: resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} dependencies: chokidar: 3.6.0 - confbox: 0.1.6 + confbox: 0.1.7 defu: 6.1.4 dotenv: 16.4.5 giget: 1.2.3 jiti: 1.21.0 - mlly: 1.6.1 + mlly: 1.7.0 ohash: 1.1.3 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.0.3 + pkg-types: 1.1.0 rc9: 2.1.2 dev: true @@ -1965,13 +2030,13 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001610 + caniuse-lite: 1.0.30001616 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001610: - resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} + /caniuse-lite@1.0.30001616: + resolution: {integrity: sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==} dev: true /chai@4.4.1: @@ -2070,11 +2135,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: restore-cursor: 4.0.0 - - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: false + dev: true /cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} @@ -2152,8 +2213,8 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /confbox@0.1.6: - resolution: {integrity: sha512-ONc4FUXne/1UBN1EuxvQ5rAjjAbo+N4IxrxWI8bzGHbd1PyrFlI/E3G23/yoJZDFBaFFxPGfI0EOq0fa4dgX7A==} + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} dev: true /consola@3.2.3: @@ -2165,8 +2226,8 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + /core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} dependencies: browserslist: 4.23.0 dev: true @@ -2226,61 +2287,61 @@ packages: hasBin: true dev: true - /cssnano-preset-default@6.1.2(postcss@8.4.38): - resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} - engines: {node: ^14 || ^16 || >=18.0} + /cssnano-preset-default@7.0.1(postcss@8.4.38): + resolution: {integrity: sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 css-declaration-sorter: 7.2.0(postcss@8.4.38) - cssnano-utils: 4.0.2(postcss@8.4.38) + cssnano-utils: 5.0.0(postcss@8.4.38) postcss: 8.4.38 - postcss-calc: 9.0.1(postcss@8.4.38) - postcss-colormin: 6.1.0(postcss@8.4.38) - postcss-convert-values: 6.1.0(postcss@8.4.38) - postcss-discard-comments: 6.0.2(postcss@8.4.38) - postcss-discard-duplicates: 6.0.3(postcss@8.4.38) - postcss-discard-empty: 6.0.3(postcss@8.4.38) - postcss-discard-overridden: 6.0.2(postcss@8.4.38) - postcss-merge-longhand: 6.0.5(postcss@8.4.38) - postcss-merge-rules: 6.1.1(postcss@8.4.38) - postcss-minify-font-values: 6.1.0(postcss@8.4.38) - postcss-minify-gradients: 6.0.3(postcss@8.4.38) - postcss-minify-params: 6.1.0(postcss@8.4.38) - postcss-minify-selectors: 6.0.4(postcss@8.4.38) - postcss-normalize-charset: 6.0.2(postcss@8.4.38) - postcss-normalize-display-values: 6.0.2(postcss@8.4.38) - postcss-normalize-positions: 6.0.2(postcss@8.4.38) - postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38) - postcss-normalize-string: 6.0.2(postcss@8.4.38) - postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38) - postcss-normalize-unicode: 6.1.0(postcss@8.4.38) - postcss-normalize-url: 6.0.2(postcss@8.4.38) - postcss-normalize-whitespace: 6.0.2(postcss@8.4.38) - postcss-ordered-values: 6.0.2(postcss@8.4.38) - postcss-reduce-initial: 6.1.0(postcss@8.4.38) - postcss-reduce-transforms: 6.0.2(postcss@8.4.38) - postcss-svgo: 6.0.3(postcss@8.4.38) - postcss-unique-selectors: 6.0.4(postcss@8.4.38) - dev: true - - /cssnano-utils@4.0.2(postcss@8.4.38): - resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-calc: 10.0.0(postcss@8.4.38) + postcss-colormin: 7.0.0(postcss@8.4.38) + postcss-convert-values: 7.0.0(postcss@8.4.38) + postcss-discard-comments: 7.0.0(postcss@8.4.38) + postcss-discard-duplicates: 7.0.0(postcss@8.4.38) + postcss-discard-empty: 7.0.0(postcss@8.4.38) + postcss-discard-overridden: 7.0.0(postcss@8.4.38) + postcss-merge-longhand: 7.0.0(postcss@8.4.38) + postcss-merge-rules: 7.0.0(postcss@8.4.38) + postcss-minify-font-values: 7.0.0(postcss@8.4.38) + postcss-minify-gradients: 7.0.0(postcss@8.4.38) + postcss-minify-params: 7.0.0(postcss@8.4.38) + postcss-minify-selectors: 7.0.0(postcss@8.4.38) + postcss-normalize-charset: 7.0.0(postcss@8.4.38) + postcss-normalize-display-values: 7.0.0(postcss@8.4.38) + postcss-normalize-positions: 7.0.0(postcss@8.4.38) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.38) + postcss-normalize-string: 7.0.0(postcss@8.4.38) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.38) + postcss-normalize-unicode: 7.0.0(postcss@8.4.38) + postcss-normalize-url: 7.0.0(postcss@8.4.38) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.38) + postcss-ordered-values: 7.0.0(postcss@8.4.38) + postcss-reduce-initial: 7.0.0(postcss@8.4.38) + postcss-reduce-transforms: 7.0.0(postcss@8.4.38) + postcss-svgo: 7.0.0(postcss@8.4.38) + postcss-unique-selectors: 7.0.0(postcss@8.4.38) + dev: true + + /cssnano-utils@5.0.0(postcss@8.4.38): + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /cssnano@6.1.2(postcss@8.4.38): - resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} - engines: {node: ^14 || ^16 || >=18.0} + /cssnano@7.0.1(postcss@8.4.38): + resolution: {integrity: sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-preset-default: 6.1.2(postcss@8.4.38) + cssnano-preset-default: 7.0.1(postcss@8.4.38) lilconfig: 3.1.1 postcss: 8.4.38 dev: true @@ -2402,12 +2463,13 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.737: - resolution: {integrity: sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw==} + /electron-to-chromium@1.4.756: + resolution: {integrity: sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==} dev: true /emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2542,10 +2604,10 @@ packages: parse-gitignore: 2.0.0 dev: true - /eslint-flat-config-utils@0.2.3: - resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} + /eslint-flat-config-utils@0.2.4: + resolution: {integrity: sha512-k7MJkSIfF0bs5eQu1KXyV0AhsvdsqSt1pQfZNLwf6qkozuHQV6aNHg5f8+3Ya+WTzpB+e7I3hMhs4qBwx7nEkw==} dependencies: - '@types/eslint': 8.56.9 + '@types/eslint': 8.56.10 pathe: 1.1.2 dev: true @@ -2575,6 +2637,14 @@ packages: eslint: 8.57.0 dev: true + /eslint-plugin-command@0.1.8(eslint@8.57.0): + resolution: {integrity: sha512-QNkBKbkImGdwwcyTwF9ZoLoOrT3oBFLiJHoLF9ugsCAItRBURpZXLm/n6LrJWLWeHBqD42LdEYjbUmuMdRxRoA==} + peerDependencies: + eslint: '*' + dependencies: + eslint: 8.57.0 + dev: true + /eslint-plugin-es-x@7.6.0(eslint@8.57.0): resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2604,7 +2674,7 @@ packages: peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 dependencies: - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 doctrine: 3.0.0 eslint: 8.57.0 @@ -2666,8 +2736,8 @@ packages: - supports-color dev: true - /eslint-plugin-n@17.2.1(eslint@8.57.0): - resolution: {integrity: sha512-uW1+df2bo06kR7ix6nB614RUlvjRPrYxlaX832O6e1MCJp4V7YozEdvMgCYuvn4ltnjPu1FVYhQ2KRrmTNoJfg==} + /eslint-plugin-n@17.4.0(eslint@8.57.0): + resolution: {integrity: sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -2677,7 +2747,7 @@ packages: eslint: 8.57.0 eslint-plugin-es-x: 7.6.0(eslint@8.57.0) get-tsconfig: 4.7.3 - globals: 14.0.0 + globals: 15.1.0 ignore: 5.3.1 minimatch: 9.0.4 semver: 7.6.0 @@ -2688,8 +2758,8 @@ packages: engines: {node: '>=5.0.0'} dev: true - /eslint-plugin-perfectionist@2.9.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2): - resolution: {integrity: sha512-ipFtDrqtF99qVVo+FE1fo6aHyLLp7hg6PNGfzY5KxQjcl0XCbyEFvjtR1NfkHDTN9rdFeEDxg59LLOv3VOAHAw==} + /eslint-plugin-perfectionist@2.10.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2): + resolution: {integrity: sha512-P+tdrkHeMWBc55+DZsoDOAftV1WCsEoHaKm6JC7zajFus/syfT4vUPBFb3atGFSuyaVnGQGHlcKpP9X3Q0gH/w==} peerDependencies: astro-eslint-parser: ^0.16.0 eslint: '>=8.0.0' @@ -2706,7 +2776,7 @@ packages: vue-eslint-parser: optional: true dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 minimatch: 9.0.4 natural-compare-lite: 1.4.0 @@ -2737,12 +2807,12 @@ packages: peerDependencies: eslint: '>=8.56.0' dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 clean-regexp: 1.0.0 - core-js-compat: 3.36.1 + core-js-compat: 3.37.0 eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 @@ -2758,8 +2828,8 @@ packages: - supports-color dev: true - /eslint-plugin-unused-imports@3.1.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0): - resolution: {integrity: sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==} + /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.7.1)(eslint@8.57.0): + resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': 6 - 7 @@ -2768,13 +2838,13 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.5.0): - resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} + /eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.7.1)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0): + resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} engines: {node: ^18.0.0 || >= 20.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': '*' @@ -2786,10 +2856,10 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - vitest: 1.5.0(@types/node@20.12.7) + vitest: 1.6.0(@types/node@20.12.8) transitivePeerDependencies: - supports-color - typescript @@ -2830,13 +2900,13 @@ packages: - supports-color dev: true - /eslint-processor-vue-blocks@0.1.1(@vue/compiler-sfc@3.4.22)(eslint@8.57.0): - resolution: {integrity: sha512-9+dU5lU881log570oBwpelaJmOfOzSniben7IWEDRYQPPWwlvaV7NhOtsTuUWDqpYT+dtKKWPsgz4OkOi+aZnA==} + /eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.26)(eslint@8.57.0): + resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} peerDependencies: '@vue/compiler-sfc': ^3.3.0 - eslint: ^8.50.0 + eslint: ^8.50.0 || ^9.0.0 dependencies: - '@vue/compiler-sfc': 3.4.22 + '@vue/compiler-sfc': 3.4.26 eslint: 8.57.0 dev: true @@ -2898,7 +2968,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -2909,7 +2979,7 @@ packages: resolution: {integrity: sha512-81owrjxIxOwqcABt20U09Wn8lpBo9K6ttqbGvQcB3VYNLJyaV1fvKkDtpZd3Rj5BX3WXiGiJCjUevKQGNICzJg==} hasBin: true dependencies: - tsx: 4.7.2 + tsx: 4.9.1 dev: true /espree@9.6.1: @@ -3127,6 +3197,7 @@ packages: /get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + dev: true /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -3190,7 +3261,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.0.4 + minipass: 7.1.0 path-scurry: 1.10.2 dev: true @@ -3228,13 +3299,8 @@ packages: type-fest: 0.20.2 dev: true - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true - - /globals@15.0.0: - resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + /globals@15.1.0: + resolution: {integrity: sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==} engines: {node: '>=18'} dev: true @@ -3261,6 +3327,18 @@ packages: slash: 4.0.0 dev: true + /globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -3461,11 +3539,6 @@ packages: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: true - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: false - /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -3498,16 +3571,6 @@ packages: which-typed-array: 1.1.15 dev: false - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: false - - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} - dev: false - /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true @@ -3524,7 +3587,6 @@ packages: /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3601,10 +3663,6 @@ packages: semver: 7.6.0 dev: true - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -3681,8 +3739,8 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 + mlly: 1.7.0 + pkg-types: 1.1.0 dev: true /locate-path@5.0.0: @@ -3722,14 +3780,6 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: false - /log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -3747,8 +3797,8 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} /lru-cache@5.1.1: @@ -3764,9 +3814,8 @@ packages: yallist: 4.0.0 dev: true - /magic-string@0.30.9: - resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -3824,6 +3873,7 @@ packages: /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + dev: true /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} @@ -3878,8 +3928,8 @@ packages: engines: {node: '>=8'} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.0: + resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -3897,40 +3947,45 @@ packages: hasBin: true dev: true - /mkdist@1.4.0(typescript@5.4.5): - resolution: {integrity: sha512-LzzdzWDx6cWWPd8saIoO+kT5jnbijfeDaE6jZfmCYEi3YL2aJSyF23/tCFee/mDuh/ek1UQeSYdLeSa6oesdiw==} + /mkdist@1.5.1(typescript@5.4.5): + resolution: {integrity: sha512-lCu1spNiA52o7IaKgZnOjg28nNHwYqUDjBfXePXyUtzD7Xhe6rRTkGTalQ/ALfrZC/SrPw2+A/0qkeJ+fPDZtQ==} hasBin: true peerDependencies: - sass: ^1.69.5 - typescript: '>=5.3.2' + sass: ^1.75.0 + typescript: '>=5.4.5' + vue-tsc: ^1.8.27 || ^2.0.14 peerDependenciesMeta: sass: optional: true typescript: optional: true + vue-tsc: + optional: true dependencies: autoprefixer: 10.4.19(postcss@8.4.38) citty: 0.1.6 - cssnano: 6.1.2(postcss@8.4.38) + cssnano: 7.0.1(postcss@8.4.38) defu: 6.1.4 - esbuild: 0.19.12 + esbuild: 0.20.2 fs-extra: 11.2.0 - globby: 13.2.2 + globby: 14.0.1 jiti: 1.21.0 - mlly: 1.6.1 + mlly: 1.7.0 mri: 1.2.0 pathe: 1.1.2 + pkg-types: 1.1.0 postcss: 8.4.38 postcss-nested: 6.0.1(postcss@8.4.38) + semver: 7.6.0 typescript: 5.4.5 dev: true - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + /mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} dependencies: acorn: 8.11.3 pathe: 1.1.2 - pkg-types: 1.0.3 + pkg-types: 1.1.0 ufo: 1.5.3 dev: true @@ -4037,6 +4092,7 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: true /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} @@ -4045,33 +4101,18 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true - /ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} - dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.1.0 - strip-ansi: 7.1.0 - dev: false - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4192,8 +4233,8 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.2.2 + minipass: 7.1.0 dev: true /path-type@4.0.0: @@ -4201,6 +4242,11 @@ packages: engines: {node: '>=8'} dev: true + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true @@ -4233,11 +4279,11 @@ packages: hasBin: true dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /pkg-types@1.1.0: + resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 + confbox: 0.1.7 + mlly: 1.7.0 pathe: 1.1.2 dev: true @@ -4246,8 +4292,8 @@ packages: engines: {node: '>=4'} dev: true - /pnpm@8.15.7: - resolution: {integrity: sha512-yFzSG22hAzIVaxyiqnnAph7nrS6wRTuIqymSienoypPmCRIyslwHy/YfbfdxKNnISeXJrG5EhU29IRxJ86Z63A==} + /pnpm@8.15.8: + resolution: {integrity: sha512-0aAp4aRHrZC8ls1YsPrUhtKZPVMYVjlve6vy2D6xgju4PFo9D8GPZ1stEDIdSesWH+zjb+gTSqWCPs0hX+7Tkg==} engines: {node: '>=16.14'} hasBin: true dev: true @@ -4257,20 +4303,20 @@ packages: engines: {node: '>= 0.4'} dev: false - /postcss-calc@9.0.1(postcss@8.4.38): - resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-calc@10.0.0(postcss@8.4.38): + resolution: {integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==} + engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: - postcss: ^8.2.2 + postcss: ^8.4.38 dependencies: postcss: 8.4.38 postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-colormin@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4281,9 +4327,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-convert-values@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4292,69 +4338,69 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-discard-comments@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-discard-comments@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /postcss-discard-duplicates@6.0.3(postcss@8.4.38): - resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-discard-duplicates@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /postcss-discard-empty@6.0.3(postcss@8.4.38): - resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-discard-empty@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /postcss-discard-overridden@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-discard-overridden@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /postcss-merge-longhand@6.0.5(postcss@8.4.38): - resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-merge-longhand@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.4.38) + stylehacks: 7.0.0(postcss@8.4.38) dev: true - /postcss-merge-rules@6.1.1(postcss@8.4.38): - resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-merge-rules@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.4.38) + cssnano-utils: 5.0.0(postcss@8.4.38) postcss: 8.4.38 postcss-selector-parser: 6.0.16 dev: true - /postcss-minify-font-values@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-minify-font-values@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4362,33 +4408,33 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@6.0.3(postcss@8.4.38): - resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-minify-gradients@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.4.38) + cssnano-utils: 5.0.0(postcss@8.4.38) postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-minify-params@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - cssnano-utils: 4.0.2(postcss@8.4.38) + cssnano-utils: 5.0.0(postcss@8.4.38) postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors@6.0.4(postcss@8.4.38): - resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-minify-selectors@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4406,18 +4452,18 @@ packages: postcss-selector-parser: 6.0.16 dev: true - /postcss-normalize-charset@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-charset@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: postcss: 8.4.38 dev: true - /postcss-normalize-display-values@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-display-values@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4425,9 +4471,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-positions@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4435,9 +4481,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-repeat-style@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4445,9 +4491,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-string@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4455,9 +4501,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-timing-functions@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4465,9 +4511,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-unicode@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4476,9 +4522,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-url@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4486,9 +4532,9 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-normalize-whitespace@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4496,20 +4542,20 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-ordered-values@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.2(postcss@8.4.38) + cssnano-utils: 5.0.0(postcss@8.4.38) postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-initial@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-reduce-initial@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4518,9 +4564,9 @@ packages: postcss: 8.4.38 dev: true - /postcss-reduce-transforms@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-reduce-transforms@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4536,9 +4582,9 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-svgo@6.0.3(postcss@8.4.38): - resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} - engines: {node: ^14 || ^16 || >= 18} + /postcss-svgo@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4547,9 +4593,9 @@ packages: svgo: 3.2.0 dev: true - /postcss-unique-selectors@6.0.4(postcss@8.4.38): - resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} - engines: {node: ^14 || ^16 || >=18.0} + /postcss-unique-selectors@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -4590,7 +4636,7 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 dev: true /prompts@2.4.2: @@ -4614,6 +4660,10 @@ packages: resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} dev: false + /ramda@0.30.0: + resolution: {integrity: sha512-13Y0iMhIQuAm/wNGBL/9HEqIfRGmNmjKnTPlKWfA9f7dnDkr8d45wQ+S7+ZLh/Pq9PdcGxkqKUEA7ySu1QSd9Q==} + dev: false + /rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} dependencies: @@ -4621,8 +4671,8 @@ packages: destr: 2.0.3 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true /read-pkg-up@7.0.1: @@ -4657,7 +4707,7 @@ packages: deprecated: 'Package has been renamed to warp-contracts. Following is no longer supported. To get the latest version please install warp-contracts: https://www.npmjs.com/package/warp-contracts.' dependencies: '@weavery/clarity': 0.1.5 - arweave: 1.15.0 + arweave: 1.15.1 arweave-multihost: 0.1.0 axios: 0.21.4 bignumber.js: 9.1.2 @@ -4709,6 +4759,7 @@ packages: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -4741,7 +4792,7 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 dependencies: - magic-string: 0.30.9 + magic-string: 0.30.10 rollup: 3.29.4 typescript: 5.4.5 optionalDependencies: @@ -4756,29 +4807,29 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.14.3: - resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} + /rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.3 - '@rollup/rollup-android-arm64': 4.14.3 - '@rollup/rollup-darwin-arm64': 4.14.3 - '@rollup/rollup-darwin-x64': 4.14.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.3 - '@rollup/rollup-linux-arm-musleabihf': 4.14.3 - '@rollup/rollup-linux-arm64-gnu': 4.14.3 - '@rollup/rollup-linux-arm64-musl': 4.14.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3 - '@rollup/rollup-linux-riscv64-gnu': 4.14.3 - '@rollup/rollup-linux-s390x-gnu': 4.14.3 - '@rollup/rollup-linux-x64-gnu': 4.14.3 - '@rollup/rollup-linux-x64-musl': 4.14.3 - '@rollup/rollup-win32-arm64-msvc': 4.14.3 - '@rollup/rollup-win32-ia32-msvc': 4.14.3 - '@rollup/rollup-win32-x64-msvc': 4.14.3 + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 dev: true @@ -4844,6 +4895,7 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -4870,6 +4922,11 @@ packages: engines: {node: '>=12'} dev: true + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -4940,11 +4997,6 @@ packages: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true - /stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - dev: false - /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -4975,6 +5027,7 @@ packages: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 + dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -4988,6 +5041,7 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} @@ -5012,9 +5066,9 @@ packages: js-tokens: 9.0.0 dev: true - /stylehacks@6.1.1(postcss@8.4.38): - resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} - engines: {node: ^14 || ^16 || >=18.0} + /stylehacks@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 dependencies: @@ -5085,8 +5139,8 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /tinybench@2.7.0: - resolution: {integrity: sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==} + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} dev: true /tinypool@0.8.4: @@ -5138,12 +5192,12 @@ packages: source-map-support: 0.5.21 dev: false - /tsx@4.7.2: - resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} + /tsx@4.9.1: + resolution: {integrity: sha512-CqSJaYyZ6GEqnGtPuMPQHvUwRGU6VHSVF+RDxoOmRg/XD4aF0pD973tKhoUYGQtdcoCHcSOGk34ioFaP+vYcMQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - esbuild: 0.19.12 + esbuild: 0.20.2 get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 @@ -5209,11 +5263,11 @@ packages: globby: 13.2.2 hookable: 5.5.3 jiti: 1.21.0 - magic-string: 0.30.9 - mkdist: 1.4.0(typescript@5.4.5) - mlly: 1.6.1 + magic-string: 0.30.10 + mkdist: 1.5.1(typescript@5.4.5) + mlly: 1.7.0 pathe: 1.1.2 - pkg-types: 1.0.3 + pkg-types: 1.1.0 pretty-bytes: 6.1.1 rollup: 3.29.4 rollup-plugin-dts: 6.1.0(rollup@3.29.4)(typescript@5.4.5) @@ -5223,6 +5277,7 @@ packages: transitivePeerDependencies: - sass - supports-color + - vue-tsc dev: true /undici-types@5.26.5: @@ -5256,9 +5311,9 @@ packages: resolution: {integrity: sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==} hasBin: true dependencies: - '@babel/core': 7.24.4 - '@babel/standalone': 7.24.4 - '@babel/types': 7.24.0 + '@babel/core': 7.24.5 + '@babel/standalone': 7.24.5 + '@babel/types': 7.24.5 defu: 6.1.4 jiti: 1.21.0 mri: 1.2.0 @@ -5267,8 +5322,8 @@ packages: - supports-color dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.0.15(browserslist@4.23.0): + resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5305,8 +5360,8 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-node@1.5.0(@types/node@20.12.7): - resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} + /vite-node@1.6.0(@types/node@20.12.8): + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -5314,7 +5369,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.9(@types/node@20.12.7) + vite: 5.2.11(@types/node@20.12.8) transitivePeerDependencies: - '@types/node' - less @@ -5326,8 +5381,8 @@ packages: - terser dev: true - /vite@5.2.9(@types/node@20.12.7): - resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==} + /vite@5.2.11(@types/node@20.12.8): + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5354,23 +5409,23 @@ packages: terser: optional: true dependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.8 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.3 + rollup: 4.17.2 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.5.0(@types/node@20.12.7): - resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} + /vitest@1.6.0(@types/node@20.12.8): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.5.0 - '@vitest/ui': 1.5.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5387,26 +5442,26 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.12.7 - '@vitest/expect': 1.5.0 - '@vitest/runner': 1.5.0 - '@vitest/snapshot': 1.5.0 - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 + '@types/node': 20.12.8 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.9 + magic-string: 0.30.10 pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.7.0 + tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.2.9(@types/node@20.12.7) - vite-node: 1.5.0(@types/node@20.12.7) + vite: 5.2.11(@types/node@20.12.8) + vite-node: 1.6.0(@types/node@20.12.8) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -5439,7 +5494,7 @@ packages: /warp-arbundles@1.0.4: resolution: {integrity: sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw==} dependencies: - arweave: 1.15.0 + arweave: 1.15.1 base64url: 3.0.1 buffer: 6.0.3 warp-isomorphic: 1.0.7 @@ -5481,6 +5536,11 @@ packages: stackback: 0.0.2 dev: true + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5536,7 +5596,7 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.4.1 + yaml: 2.4.2 dev: true /yaml@2.3.4: @@ -5544,8 +5604,8 @@ packages: engines: {node: '>= 14'} dev: true - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} hasBin: true dev: true @@ -5578,6 +5638,6 @@ packages: engines: {node: '>=12.20'} dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /zod@3.23.6: + resolution: {integrity: sha512-RTHJlZhsRbuA8Hmp/iNL7jnfc4nZishjsanDAfEY1QpDQZCahUp3xDzl+zfweE9BklxMUcgBgS1b7Lvie/ZVwA==} dev: false diff --git a/src/cli.ts b/src/cli.ts index a12f9b9..2bac39b 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -6,90 +6,137 @@ import { fileURLToPath } from 'node:url' import fs from 'node:fs' import chalk from 'chalk' import { Command } from 'commander' -import { type Tag, deployContract } from './lib/deploy' +import { deployContract, deployContracts } from './lib/deploy' +import { ConfigManager } from './lib/config' +import type { DeployResult, Tag } from './types' +import { Logger } from './lib/logger' const PKG_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../') process.emitWarning = (warning, ...args) => { - if (args[0] === 'ExperimentalWarning') + if (args[0] === 'ExperimentalWarning') { return + } - if (args[0] && typeof args[0] === 'object' && args[0].type === 'ExperimentalWarning') + if (args[0] && typeof args[0] === 'object' && args[0].type === 'ExperimentalWarning') { return + } // @ts-expect-error "experimental warning" return emitWarning(warning, ...args) } -function getVersion() { +function getPackageJson() { const packageJsonPath = path.join(PKG_ROOT, 'package.json') const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) - return packageJson.version || '1.0.0' + return packageJson } function parseToInt(value: string, defaultValue: number) { const parsedValue = Number.parseInt(value) - if (Number.isNaN(parsedValue)) + if (Number.isNaN(parsedValue)) { return defaultValue + } return parsedValue } +function logDeploymentDetails(result: DeployResult) { + const { messageId, processId, isNewProcess, configName } = result + const processUrl = chalk.green(`https://ao_marton.g8way.io/#/process/${processId}`) + const messageUrl = chalk.green(`${processUrl}/${messageId}`) + const logger = Logger.init(configName) + + console.log('') + if (isNewProcess) { + logger.log(`Deployed Process: ${processUrl}`) + } + logger.log(`Deployment Message: ${messageUrl}`) +} + const program = new Command() +const packageJson = getPackageJson() program - .name('ao-deploy') - .description('A CLI tool to deploy AO contracts') - .version(getVersion()) - .argument('', 'Contract main file path to deploy') - .option('-n, --name [name]', 'Name of the process to spawn', 'default') - .option('-w, --wallet [wallet]', 'Wallet JWK file path') - .option('-s, --scheduler [scheduler]', 'Scheduler to use for Process', '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA') - .option('-m, --module [module]', 'The module source to use to spin up Process') - .option('-c, --cron [interval]', 'Cron interval to use for Process i.e (1-minute, 5-minutes)') - .option('-t, --tags [tags...]', 'Additional tags to use when spawning Process') - .option('--retry-count [count]', 'Retry count to spawn Process', '10') - .option('--retry-delay [delay]', 'Retry delay in seconds', '3000') + .name(packageJson.name) + .description('Deploy AO contracts using a CLI.') + .version(packageJson.version) + .argument('', 'Path to the main contract file or deployment configuration.') + .option('-n, --name [name]', 'Specify the process name.', 'default') + .option('-w, --wallet [wallet]', 'Path to the wallet JWK file.') + .option('-l, --lua-path [luaPath]', 'Specify the Lua modules path seperated by semicolon.') + .option('-d, --deploy [deploy]', 'List of deployment configuration names, separated by commas.') + .option('-s, --scheduler [scheduler]', 'Scheduler to be used for the process.', '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA') + .option('-m, --module [module]', 'Module source for spawning the process.') + .option('-c, --cron [interval]', 'Cron interval for the process (e.g. 1-minute, 5-minutes).') + .option('-t, --tags [tags...]', 'Additional tags for spawning the process.') + .option('-p, --process-id [processId]', 'Specify process Id of an existing process.') + .option('--concurrency [limit]', 'Concurrency limit for deploying multiple processes.', '5') + .option('--retry-count [count]', 'Number of retries for deploying contract.', '10') + .option('--retry-delay [delay]', 'Delay between retries in milliseconds.', '3000') program.parse(process.argv) const options = program.opts() -const contractPath = program.args[0] +const contractOrConfigPath = program.args[0] -async function main() { +;(async () => { try { - console.log(chalk.gray('Deploying...\n')) - const tags: Tag[] = Array.isArray(options.tags) - ? options.tags.reduce((accumulator, tag) => { - if (tag && tag.includes(':')) { - const [name, value] = tag.split(':') - accumulator.push({ name, value }) - } - return accumulator - }, []) - : [] - const { messageId, processId } = await deployContract( - { - name: options.name, - wallet: options.wallet, - contractPath, - scheduler: options.scheduler, - module: options.module, - cron: options.cron, - tags, - retry: { - count: parseToInt(options.retryCount, 10), - delay: parseToInt(options.retryDelay, 3000), + Logger.log(packageJson.name, 'Deploying...', false, true) + if (contractOrConfigPath.endsWith('.lua')) { + const tags: Tag[] = Array.isArray(options.tags) + ? options.tags.reduce((accumulator, tag) => { + if (tag && tag.includes(':')) { + const [name, value] = tag.split(':') + accumulator.push({ name, value }) + } + return accumulator + }, []) + : [] + + const result = await deployContract( + { + name: options.name, + wallet: options.wallet, + contractPath: contractOrConfigPath, + scheduler: options.scheduler, + module: options.module, + cron: options.cron, + tags, + retry: { + count: parseToInt(options.retryCount, 10), + delay: parseToInt(options.retryDelay, 3000), + }, + luaPath: options.luaPath, + configName: options.name, + processId: options.processId, }, - }, - ) - const processUrl = chalk.green(`https://ao_marton.g8way.io/#/process/${processId}`) - const messageUrl = chalk.green(`${processUrl}/${messageId}`) - console.log(`\nDeployed Process: ${processUrl} \nDeployment Message: ${messageUrl}`) + ) + logDeploymentDetails(result) + } + else { + const configManager = new ConfigManager(contractOrConfigPath) + const deployConfigs = configManager.getDeployConfigs(options.deploy) + const concurrency = parseToInt(options.concurrency, 5) + + const results = await deployContracts(deployConfigs, concurrency) + results.forEach((result, idx) => { + const configName = deployConfigs[idx].configName! + if (result.status === 'fulfilled') { + logDeploymentDetails(result.value) + } + else { + Logger.error(configName, 'Failed to deploy contract!', true) + Logger.error(configName, result.reason) + } + }) + const totalCount = results.length + const successCount = results.filter(r => r.status === 'fulfilled').length + Logger.log(packageJson.name, `Deployment Status: ${chalk.green(`${successCount}/${totalCount}`)} successful deployments.`, true) + } } catch (error: any) { - console.log(chalk.red('\nDeployment failed!\n')) - console.log(chalk.red(error?.message ?? 'Failed to deploy contract!')) + const logger = Logger.init(packageJson.name) + logger.error(`Deployment failed!`, true) + logger.error(error?.message ?? 'Failed to deploy contract!') process.exit(1) } -} - -main() +})() diff --git a/src/index.ts b/src/index.ts index cb5cd86..e192a8c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ export * from './lib/deploy' +export { defineConfig } from './lib/config' diff --git a/src/lib/config.ts b/src/lib/config.ts new file mode 100644 index 0000000..b6ae773 --- /dev/null +++ b/src/lib/config.ts @@ -0,0 +1,111 @@ +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import createJITI from 'jiti' +import type { Config, DeployConfig } from '../types' + +const __filename = fileURLToPath(import.meta.url) + +const jiti = createJITI(__filename) + +export class ConfigManager { + #config: Config = {} + + constructor(configPath: string) { + const loadedConfig = this.#load(configPath) + if (ConfigManager.isValidConfig(loadedConfig)) { + this.#config = loadedConfig + } + else { + throw new Error('Invalid config file loaded.') + } + } + + #load(configPath: string) { + const fullPath = path.join(process.cwd(), configPath) + const configs = jiti(fullPath) + return configs.default ?? configs + } + + static #isNonEmptyString(value: any): boolean { + return typeof value === 'string' && value.length > 0 + } + + static #isString(value: any): boolean { + return typeof value === 'string' + } + + static #validateTags(tags?: DeployConfig['tags']): boolean { + return tags === undefined || (Array.isArray(tags) && tags.length === 0) || (Array.isArray(tags) && tags.every(tag => + tag && typeof tag === 'object' && this.#isNonEmptyString(tag.name) && this.#isNonEmptyString(tag.value), + )) + } + + static #validateRetry(retry?: DeployConfig['retry']): boolean { + return retry === undefined || ( + typeof retry === 'object' + && (retry.count === undefined || (typeof retry.count === 'number' && retry.count >= 0)) + && (retry.delay === undefined || (typeof retry.delay === 'number' && retry.delay >= 0)) + ) + } + + static isValidConfig(config: Config): boolean { + // Check if config exists, is an object, and is not empty + if (!config || typeof config !== 'object' || Object.keys(config).length === 0) { + return false + } + + // Check if every entry in the object values has a 'contractPath' + return Object.values(config).every((deployConfig) => { + if (!deployConfig || typeof deployConfig !== 'object') { + return false + } + + const requiredStringProps: (keyof DeployConfig)[] = ['contractPath', 'name'] + const optionalStringProps: (keyof DeployConfig)[] = ['module', 'scheduler', 'cron', 'luaPath', 'wallet', 'configName', 'processId'] + + const hasRequiredStrings = requiredStringProps.every(prop => this.#isNonEmptyString(deployConfig[prop])) + const hasOptionalStrings = optionalStringProps.every(prop => !deployConfig[prop] || this.#isString(deployConfig[prop])) + + const tagsValid = this.#validateTags(deployConfig.tags) + const retryValid = this.#validateRetry(deployConfig.retry) + + return hasRequiredStrings && hasOptionalStrings && tagsValid && retryValid + }) + } + + getConfig() { + return this.#config + } + + getConfigFromNames(keys: string[]) { + if (keys.length === 0) { + return this.#config + } + + return Object.fromEntries(Object.entries(this.#config).filter(([key, _]) => keys.includes(key))) + } + + getDeployConfigs(deploy: string) { + const configNames = (deploy ?? '').split(',').map((name: string) => name.trim()).filter(Boolean) + const config = this.getConfigFromNames(configNames) + if (Object.keys(config).length === 0) { + throw new Error(`Config file doesn't have names from ${deploy}`) + } + const deployConfigs = Object.entries(config).map(([name, config]) => ({ ...config, configName: name })) + return deployConfigs + } +} + +/** + * Defines and validates a configuration object. + * @param config The configuration object to validate. + * @returns The validated configuration object. + * @throws Error if the configuration object is invalid. + */ +export function defineConfig(config: Config) { + if (!ConfigManager.isValidConfig(config)) { + throw new Error('Invalid config file loaded.') + } + return config +} diff --git a/src/lib/deploy.ts b/src/lib/deploy.ts index 223c17e..7e304f6 100644 --- a/src/lib/deploy.ts +++ b/src/lib/deploy.ts @@ -4,200 +4,188 @@ import { result, spawn, } from '@permaweb/aoconnect' -import Ardb from 'ardb' -import type { JWKInterface } from 'arweave/node/lib/wallet' -import { arweave, getWallet, getWalletAddress, isArweaveAddress } from './wallet' -import { loadContract } from './load' +import pLimit from 'p-limit' +import type { DeployConfig, DeployResult } from '../types' +import { Wallet } from './wallet' +import { LuaProjectLoader } from './loader' +import { ardb, isArweaveAddress, retryWithDelay, sleep } from './utils' +import { Logger } from './logger' /** - * Args for deployContract + * Manages deployments of contracts to AO. */ -export interface DeployArgs { - /** - * Process name to spawn - * @default "default" - */ - name?: string - /** - * Path to contract main file - */ - contractPath: string - /** - * The module source to use to spin up Process - * @default "Fetches from `https://raw.githubusercontent.com/permaweb/aos/main/package.json`" - */ - module?: string - /** - * Scheduler to use for Process - * @default "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" - */ - scheduler?: string - /** - * Additional tags to use for spawning Process - */ - tags?: Tag[] - /** - * Cron interval to use for Process i.e (1-minute, 5-minutes) - */ - cron?: string - /** - * Wallet path or JWK itself - */ - wallet?: JWKInterface | string +export class DeploymentsManager { + #cachedAosDetails: { version: string, module: string, scheduler: string } | null = null - /** - * Retry options - */ - retry?: { - /** - * Retry count - * @default 10 - */ - count?: number - /** - * Retry delay in milliseconds - * @default 3000 - */ - delay?: number - } -} - -export interface Tag { name: string, value: string } + async #getAosDetails() { + if (this.#cachedAosDetails) { + return this.#cachedAosDetails + } -const ardb = new ((Ardb as any)?.default ?? Ardb)(arweave) + const defaultDetails = { + version: '1.10.22', + module: 'SBNb1qPQ1TDwpD_mboxm2YllmMLXpWw4U8P9Ff8W9vk', + scheduler: '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA', + } -/** - * Retries a given function up to a maximum number of attempts. - * @param fn - The asynchronous function to retry, which should return a Promise. - * @param maxAttempts - The maximum number of attempts to make. - * @param delay - The delay between attempts in milliseconds. - * @return A Promise that resolves with the result of the function or rejects after all attempts fail. - */ -async function retryWithDelay( - fn: () => Promise, - maxAttempts: number, - delay: number = 1000, -): Promise { - let attempts = 0 - - const attempt = async (): Promise => { try { - return await fn() - } - catch (error) { - attempts += 1 - if (attempts < maxAttempts) { - console.log(`Attempt ${attempts} failed, retrying...`) - return new Promise(resolve => setTimeout(() => resolve(attempt()), delay)) - } - else { - throw error + const response = await fetch('https://raw.githubusercontent.com/permaweb/aos/main/package.json') + const pkg = await response.json() as { version: string, aos: { module: string } } + this.#cachedAosDetails = { + version: pkg?.version || defaultDetails.version, + module: pkg?.aos?.module || defaultDetails.module, + scheduler: defaultDetails.scheduler, } + return this.#cachedAosDetails + } + catch { + return defaultDetails } } - return attempt() -} - -async function sleep(delay: number = 3000) { - return new Promise((resolve, _) => setTimeout(resolve, delay)) -} + async #findProcess(name: string, owner: string) { + const tx = await ardb + .appName('aos') + .search('transactions') + .from(owner) + .only('id') + .tags([ + { name: 'Data-Protocol', values: ['ao'] }, + { name: 'Type', values: ['Process'] }, + { name: 'Name', values: [name] }, + ]) + .findOne() + + return tx?.id + } -async function getAos() { - const defaultVersion = '1.10.22' - const defaultModule = 'SBNb1qPQ1TDwpD_mboxm2YllmMLXpWw4U8P9Ff8W9vk' - const defaultScheduler = '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA' - try { - const pkg = await ( - await fetch( - 'https://raw.githubusercontent.com/permaweb/aos/main/package.json', - ) - ).json() as { version: string, aos: { module: string } } - return { - aosVersion: pkg?.version ?? defaultVersion, - aosModule: pkg?.aos?.module ?? defaultModule, - aosScheduler: defaultScheduler, + #validateCron(cron: string) { + const cronRegex = /^\d+\-(Second|second|Minute|Minute|Hour|hour|Day|day|Month|month|Year|year|Block|block)s?$/ + if (!cronRegex.test(cron)) { + throw new Error('Invalid cron flag!') } } - catch { - return { aosVersion: defaultVersion, aosModule: defaultModule, aosScheduler: defaultScheduler } - } -} -async function findProcess(name: string, owner: string) { - const tx = await ardb - .appName('aos') - .search('transactions') - .from(owner) - .only('id') - .tags([ - { name: 'Data-Protocol', values: ['ao'] }, - { name: 'Type', values: ['Process'] }, - { name: 'Name', values: [name] }, - ]) - .findOne() - - return tx?.id -} + /** + * Deploys or updates a contract on AO. + * @param {DeployConfig} deployConfig - Configuration options for the deployment. + * @returns {Promise} The result of the deployment. + */ + async deployContract({ name, wallet, contractPath, tags, cron, module, scheduler, retry, luaPath, configName, processId }: DeployConfig): Promise { + name = name || 'default' + configName = configName || name + retry = { + count: typeof retry?.count === 'number' && retry.count >= 0 ? retry.count : 10, + delay: typeof retry?.delay === 'number' && retry.delay >= 0 ? retry.delay : 3000, + } -export async function deployContract({ name, wallet, contractPath, tags, cron, module, scheduler, retry }: DeployArgs) { - // Create a new process - name = name || 'default' - retry = retry ?? { count: 10, delay: 3000 } - - const { aosVersion, aosModule, aosScheduler } = await getAos() - module = isArweaveAddress(module) ? module! : aosModule - scheduler = isArweaveAddress(scheduler) ? scheduler! : aosScheduler - - const walletJWK = await getWallet(wallet) - const owner = await getWalletAddress(walletJWK) - const signer = createDataItemSigner(walletJWK) - - let processId = await findProcess(name, owner) - - if (!processId) { - tags = Array.isArray(tags) ? tags : [] - tags = [ - { name: 'App-Name', value: 'aos' }, - { name: 'Name', value: name }, - { name: 'aos-Version', value: aosVersion }, - ...tags, - ] - if (cron) { - if (/^\d+\-(second|seconds|minute|minutes|hour|hours|day|days|month|months|year|years|block|blocks|Second|Seconds|Minute|Minutes|Hour|Hours|Day|Days|Month|Months|Year|Years|Block|Blocks)$/.test(cron)) { - tags = [...tags, { name: 'Cron-Interval', value: cron }, { name: 'Cron-Tag-Action', value: 'Cron' }, - ] - } - else { - throw new Error('Invalid cron flag!') - } + const logger = new Logger(configName) + const aosDetails = await this.#getAosDetails() + module = isArweaveAddress(module) ? module! : aosDetails.module + scheduler = isArweaveAddress(scheduler) ? scheduler! : aosDetails.scheduler + + const walletInstance = await Wallet.load(wallet) + const owner = await walletInstance.getAddress() + const signer = createDataItemSigner(walletInstance.jwk) + + if (!processId || (processId && !isArweaveAddress(processId))) { + processId = await this.#findProcess(name, owner) } - const data = '1984' - processId = await spawn({ module, signer, tags, data, scheduler }) - await sleep(5000) - } - const contractSrc = await loadContract(contractPath) + const isNewProcess = !processId + + if (!processId) { + logger.log('Spawning new process...', false, true) + tags = Array.isArray(tags) ? tags : [] + tags = [ + { name: 'App-Name', value: 'aos' }, + { name: 'Name', value: name }, + { name: 'aos-Version', value: aosDetails.version }, + ...tags, + ] + + if (cron) { + this.#validateCron(cron) + tags = [...tags, { name: 'Cron-Interval', value: cron }, { name: 'Cron-Tag-Action', value: 'Cron' }] + } + + const data = '1984' + processId = await retryWithDelay( + () => spawn({ module, signer, tags, data, scheduler }), + retry.count, + retry.delay, + ) + await sleep(1000) + } + else { + logger.log('Updating existing process...', false, true) + } - // Load contract to process - const messageId = await retryWithDelay( - async () => - message({ + const loader = new LuaProjectLoader(configName, luaPath) + const contractSrc = await loader.loadContract(contractPath) + + // Load contract to process + const messageId = await retryWithDelay( + async () => + message({ + process: processId, + tags: [{ name: 'Action', value: 'Eval' }], + data: contractSrc, + signer, + }), + retry.count, + retry.delay, + ) + + const { Output, Error: error } = await retryWithDelay( + async () => result({ process: processId, - tags: [{ name: 'Action', value: 'Eval' }], - data: contractSrc, - signer, + message: messageId, }), - retry?.count ?? 10, - retry?.delay ?? 3000, - ) + retry.count, + retry.delay, + ) + + const errorMessage = Output?.data?.output || error - const { Output, Error: error } = await result({ process: processId, message: messageId }) - if (Output?.data?.output) - throw new Error(Output?.data?.output) + if (errorMessage) { + throw new Error(errorMessage) + } - if (error) - throw new Error(error) + return { name, processId, messageId, isNewProcess, configName } + } - return { processId, messageId } + /** + * Deploys multiple contracts concurrently with specified concurrency limits. + * @param {DeployConfig[]} deployConfigs - Array of deployment configurations. + * @param {number} concurrency - Maximum number of deployments to run concurrently. Default is 5. + * @returns {Promise[]>} Array of results for each deployment, either fulfilled or rejected. + */ + async deployContracts(deployConfigs: DeployConfig[], concurrency: number = 5): Promise[]> { + const limit = pLimit(concurrency) + const promises = deployConfigs.map(config => limit(() => deployContract(config))) + const results = await Promise.allSettled(promises) + return results + } +} + +/** + * Deploys or updates a contract on AO. + * @param {DeployConfig} deployConfig - Configuration options for the deployment. + * @returns {Promise} The result of the deployment. + */ +export async function deployContract(deployConfig: DeployConfig): Promise { + const manager = new DeploymentsManager() + return manager.deployContract(deployConfig) +} + +/** + * Deploys multiple contracts concurrently with specified concurrency limits. + * @param {DeployConfig[]} deployConfigs - Array of deployment configurations. + * @param {number} concurrency - Maximum number of deployments to run concurrently. Default is 5. + * @returns {Promise[]>} Array of results for each deployment, either fulfilled or rejected. + */ +export async function deployContracts(deployConfigs: DeployConfig[], concurrency: number = 5): Promise[]> { + const manager = new DeploymentsManager() + return manager.deployContracts(deployConfigs, concurrency) } diff --git a/src/lib/load.ts b/src/lib/load.ts deleted file mode 100644 index 995d11c..0000000 --- a/src/lib/load.ts +++ /dev/null @@ -1,177 +0,0 @@ -/* - * This file contains code derived from the aos codebase (c) 2024 Forward Research, - * licensed under the Business Source License 1.1 until the Change Date, after which - * it will transition to MPL 2.0. - * - * https://github.com/permaweb/aos/blob/main/LICENSE - */ - -import path from 'node:path' -import { constants, promises as fs } from 'node:fs' -import process from 'node:process' -import { exec } from 'node:child_process' -import util from 'node:util' - -// @ts-expect-error types missing -import createFileTree from 'pretty-file-tree' -import chalk from 'chalk' -import ora from 'ora' - -const execAsync = util.promisify(exec) - -interface Module { name: string, path: string, content?: string, dependencies?: Set } - -async function fileExists(path: string): Promise { - try { - await fs.access(path, constants.F_OK | constants.R_OK) - return true - } - catch { - return false - } -} - -async function getModulePath(module: string, cwd: string) { - try { - const modPath = path.join(cwd, `${module.replace(/\./g, '/')}.lua`) - if (await fileExists(modPath)) - return modPath - - const luaCode = `print(package.searchpath('${module}', package.path))` - const command = `lua -e "${luaCode}"` - - const { stdout, stderr } = await execAsync(command) - - if (stderr) - return - - if (stdout) { - const potentialPath = stdout.trim() - if (await fileExists(potentialPath)) - return potentialPath - } - } - catch (error) {} -} - -export function createExecutableFromProject(project: Module[]) { - const getModFnName = (name: string) => name.replace(/\./g, '_').replace(/^_/, '') - const contents: { name: string, path: string, code: string }[] = [] - - for (const mod of project) { - const existing = contents.find(m => m.path === mod.path) - const moduleContent = (!existing && `-- module: "${mod.name}"\nlocal function _loaded_mod_${getModFnName(mod.name)}()\n${mod.content}\nend\n`) || '' - const requireMapper = `\n_G.package.loaded["${mod.name}"] = _loaded_mod_${getModFnName(existing?.name || mod.name)}()` - - contents.push({ - name: mod.name, - path: mod.path, - code: moduleContent + requireMapper, - }) - } - - return contents.reduce((acc, con) => `${acc}\n\n${con.code}`, '') -} - -function topologicalSort(moduleMap: Map) { - const visited = new Set() - const result: Module[] = [] - - function visit(modName: string) { - if (visited.has(modName)) - return - - const mod = moduleMap.get(modName) - if (!mod) - throw new Error(`Module ${modName} is not found in the module map.`) - - visited.add(modName) - mod.dependencies?.forEach(depName => visit(depName)) - result.push(mod) - } - - moduleMap.forEach((_, modName) => visit(modName)) - - return result -} - -export async function createProjectStructure(mainFile: string, cwd: string) { - // initial set of modules - const modules = await findRequires(mainFile, cwd) - // Create a map for quick access - const moduleMap: Map = new Map(modules.map(m => [m.name, m])) - - // Load and parse content for each module, and resolve dependencies - for (const [_, mod] of moduleMap) { - if (!mod.content) { - const fileContent = await fs.readFile(mod.path, 'utf-8') - mod.content = fileContent.split('\n').map(line => ` ${line}`).join('\n') - const requiresInMod = await findRequires(mod.content!, cwd) - - for (const requirement of requiresInMod) { - if (!moduleMap.has(requirement.name)) - moduleMap.set(requirement.name, requirement) - mod.dependencies = (mod.dependencies || new Set()).add(requirement.name) - } - } - } - - // Perform a topological sort based on dependencies - const sortedModules = topologicalSort(moduleMap) - - // Filter out modules without content (if any) - return sortedModules.filter(mod => mod.content) -} - -async function findRequires(data: string, cwd: string): Promise { - const requirePattern = /(?<=(require( *)(\n*)(\()?( *)("|'))).*(?=("|'))/g - const requiredModules = (data.match(requirePattern) || []).map(async (mod) => { - const modPath = await getModulePath(mod, cwd) - - return modPath - ? { - name: mod, - path: modPath, - content: undefined, - } - : null - }) - - return (await Promise.all(requiredModules)).filter(m => !!m) as Module[] -} - -export async function loadContract(contractPath: string) { - if (/\.lua$/.test(contractPath)) { - let filePath = contractPath - if (!path.isAbsolute(filePath)) - filePath = path.resolve(path.join(process.cwd(), contractPath)) - - if (!(await fileExists(filePath))) - throw new Error(chalk.red(`ERROR: ${filePath} file not found.`)) - - console.log(chalk.green('Deploying: ', contractPath)) - let line = await fs.readFile(filePath, 'utf-8') - - const spinner = ora({ - spinner: 'dots', - suffixText: ``, - discardStdin: false, - }).start() - spinner.suffixText = chalk.gray('Parsing project structure...') - const projectStructure = await createProjectStructure(line, path.dirname(filePath)) - if (projectStructure.length > 0) - line = `${createExecutableFromProject(projectStructure)}\n\n${line}` - - spinner.stop() - - if (projectStructure.length > 0) { - console.log(chalk.yellow('\nThe following files will be deployed:')) - console.log(chalk.dim(createFileTree([...projectStructure.map(m => m.path), `${filePath} ${chalk.reset(chalk.bgGreen(' MAIN '))}`]))) - } - - return line - } - else { - throw new Error(chalk.red('It requires a *.lua file')) - } -} diff --git a/src/lib/loader.ts b/src/lib/loader.ts new file mode 100644 index 0000000..32a88b6 --- /dev/null +++ b/src/lib/loader.ts @@ -0,0 +1,181 @@ +/* + * This file contains code derived from the aos codebase (c) 2024 Forward Research, + * licensed under the Business Source License 1.1 until the Change Date, after which + * it will transition to MPL 2.0. + * + * https://github.com/permaweb/aos/blob/main/LICENSE + */ + +import path from 'node:path' +import { constants, promises as fs } from 'node:fs' +import process from 'node:process' +import { exec } from 'node:child_process' +import util from 'node:util' +// @ts-expect-error types missing +import createFileTree from 'pretty-file-tree' +import chalk from 'chalk' +import type { Module } from '../types' +import { Logger } from './logger' + +const execAsync = util.promisify(exec) + +export class LuaProjectLoader { + #luaPath: string + #logger: Logger + + constructor(name: string, luaPath?: string) { + this.#luaPath = luaPath || '' + this.#logger = Logger.init(name) + } + + async #fileExists(path: string): Promise { + try { + await fs.access(path, constants.F_OK | constants.R_OK) + return true + } + catch { + return false + } + } + + async #getModulePath(module: string, cwd: string) { + try { + const modPath = path.join(cwd, `${module.replace(/\./g, '/')}.lua`) + if (await this.#fileExists(modPath)) { + return modPath + } + + const luaCode = `print(package.searchpath('${module}', package.path .. ';' .. '${this.#luaPath}'))` + const command = `lua -e "${luaCode}"` + + const { stdout, stderr } = await execAsync(command) + + if (stderr) { + return + } + + if (stdout) { + const potentialPath = stdout.trim() + if (await this.#fileExists(potentialPath)) { + return potentialPath + } + } + } + catch (error) { } + } + + #createExecutableFromProject(project: Module[]) { + const getModFnName = (name: string) => name.replace(/\./g, '_').replace(/^_/, '') + const contents: { name: string, path: string, code: string }[] = [] + + for (const mod of project) { + const existing = contents.find(m => m.path === mod.path) + const moduleContent = (!existing && `-- module: "${mod.name}"\nlocal function _loaded_mod_${getModFnName(mod.name)}()\n${mod.content}\nend\n`) || '' + const requireMapper = `\n_G.package.loaded["${mod.name}"] = _loaded_mod_${getModFnName(existing?.name || mod.name)}()` + + contents.push({ + name: mod.name, + path: mod.path, + code: moduleContent + requireMapper, + }) + } + + return contents.reduce((acc, con) => `${acc}\n\n${con.code}`, '') + } + + #topologicalSort(moduleMap: Map) { + const visited = new Set() + const result: Module[] = [] + + function visit(modName: string) { + if (visited.has(modName)) { + return + } + + const mod = moduleMap.get(modName) + if (!mod) { + throw new Error(`Module ${modName} is not found in the module map.`) + } + + visited.add(modName) + mod.dependencies?.forEach(depName => visit(depName)) + result.push(mod) + } + + moduleMap.forEach((_, modName) => visit(modName)) + + return result + } + + async #createProjectStructure(mainFile: string, cwd: string) { + // initial set of modules + const modules = await this.#findRequires(mainFile, cwd) + // Create a map for quick access + const moduleMap: Map = new Map(modules.map(m => [m.name, m])) + + // Load and parse content for each module, and resolve dependencies + for (const [_, mod] of moduleMap) { + if (!mod.content) { + const fileContent = await fs.readFile(mod.path, 'utf-8') + mod.content = fileContent.split('\n').map(line => ` ${line}`).join('\n') + const requiresInMod = await this.#findRequires(mod.content!, cwd) + + for (const requirement of requiresInMod) { + if (!moduleMap.has(requirement.name)) { + moduleMap.set(requirement.name, requirement) + } + mod.dependencies = (mod.dependencies || new Set()).add(requirement.name) + } + } + } + + // Perform a topological sort based on dependencies + const sortedModules = this.#topologicalSort(moduleMap) + + // Filter out modules without content (if any) + return sortedModules.filter(mod => mod.content) + } + + async #findRequires(data: string, cwd: string): Promise { + const requirePattern = /(?<=(require( *)(\n*)(\()?( *)("|'))).*(?=("|'))/g + const requiredModules = (data.match(requirePattern) || []).map(async (mod) => { + const modPath = await this.#getModulePath(mod, cwd) + + return modPath ? { name: mod, path: modPath, content: undefined } : null + }) + + return (await Promise.all(requiredModules)).filter(m => !!m) as Module[] + } + + async loadContract(contractPath: string) { + if (/\.lua$/.test(contractPath)) { + let filePath = contractPath + if (!path.isAbsolute(filePath)) { + filePath = path.resolve(path.join(process.cwd(), contractPath)) + } + + if (!(await this.#fileExists(filePath))) { + throw new Error(chalk.red(`${filePath} file not found.`)) + } + + this.#logger.log(`Deploying: ${contractPath}`, false, true) + let line = await fs.readFile(filePath, 'utf-8') + + this.#logger.log(`Parsing contract structure...`, false, true) + + const projectStructure = await this.#createProjectStructure(line, path.dirname(filePath)) + if (projectStructure.length > 0) { + line = `${this.#createExecutableFromProject(projectStructure)}\n\n${line}` + + this.#logger.log(chalk.yellow(`The following files will be deployed:`), false, true) + console.log(chalk.dim(createFileTree([...projectStructure.map(m => m.path), `${filePath} ${chalk.reset(chalk.bgGreen(' MAIN '))}`]))) + console.log('') + } + + return line.trim() + } + else { + throw new Error(chalk.red('It requires a *.lua file')) + } + } +} diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 0000000..3c5a432 --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,51 @@ +import chalk from 'chalk' + +export class Logger { + static #instances: Map = new Map() + #name: string + + constructor(name: string) { + this.#name = name + } + + static #getInstance(name: string): Logger { + if (!Logger.#instances.has(name)) { + Logger.#instances.set(name, new Logger(name)) + } + return Logger.#instances.get(name)! + } + + static init(name: string) { + return this.#getInstance(name) + } + + #logMessage(message: string, prefixNewLine: boolean, suffixNewLine: boolean) { + const prefix = prefixNewLine ? '\n' : '' + const suffix = suffixNewLine ? '\n' : '' + console.log(`${prefix}${message}${suffix}`) + } + + log(message: string, prefixNewLine = false, suffixNewLine = false) { + this.#logMessage(`${chalk.blue(`[${this.#name}]`)} ${message}`, prefixNewLine, suffixNewLine) + } + + success(message: string, prefixNewLine = false, suffixNewLine = false) { + this.#logMessage(`${chalk.blue(`[${this.#name}]`)} ${chalk.green(message)}`, prefixNewLine, suffixNewLine) + } + + error(message: string, prefixNewLine = false, suffixNewLine = false) { + this.#logMessage(`${chalk.red(`[${this.#name}]`)} ${chalk.red(message)}`, prefixNewLine, suffixNewLine) + } + + static log(name: string, message: string, prefixNewLine = false, suffixNewLine = false) { + this.#getInstance(name).log(message, prefixNewLine, suffixNewLine) + } + + static success(name: string, message: string, prefixNewLine = false, suffixNewLine = false) { + this.#getInstance(name).success(message, prefixNewLine, suffixNewLine) + } + + static error(name: string, message: string, prefixNewLine = false, suffixNewLine = false) { + this.#getInstance(name).error(message, prefixNewLine, suffixNewLine) + } +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..0c49c3e --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,51 @@ +import Arweave from 'arweave' +import Ardb from 'ardb' + +export const arweave = Arweave.init({ + host: 'arweave.net', + port: 443, + protocol: 'https', +}) + +export const ardb = new ((Ardb as any)?.default ?? Ardb)(arweave) + +export function isArweaveAddress(address: any): boolean { + return typeof address === 'string' && /^[a-z0-9-_]{43}$/i.test(address) +} + +export async function sleep(delay: number = 3000) { + return new Promise((resolve, _) => setTimeout(resolve, delay)) +} + +/** + * Retries a given function up to a maximum number of attempts. + * @param fn - The asynchronous function to retry, which should return a Promise. + * @param maxAttempts - The maximum number of attempts to make. + * @param delay - The delay between attempts in milliseconds. + * @return A Promise that resolves with the result of the function or rejects after all attempts fail. + */ +export async function retryWithDelay( + fn: () => Promise, + maxAttempts: number = 3, + delay: number = 1000, +): Promise { + let attempts = 0 + + const attempt = async (): Promise => { + try { + return await fn() + } + catch (error) { + attempts += 1 + if (attempts < maxAttempts) { + // console.log(`Attempt ${attempts} failed, retrying...`) + return new Promise(resolve => setTimeout(() => resolve(attempt()), delay)) + } + else { + throw error + } + } + } + + return attempt() +} diff --git a/src/lib/wallet.ts b/src/lib/wallet.ts index 5d98ec0..2081075 100644 --- a/src/lib/wallet.ts +++ b/src/lib/wallet.ts @@ -1,52 +1,71 @@ import fs from 'node:fs' import path from 'node:path' import os from 'node:os' -import Arweave from 'arweave' import type { JWKInterface } from 'arweave/node/lib/wallet' +import { arweave } from './utils' -export const arweave = Arweave.init({ - host: 'arweave.net', - port: 443, - protocol: 'https', -}) - -/** - * Check if the passed argument is a valid JSON Web Key (JWK) for Arweave. - * @param obj - The object to check for JWK validity. - * @returns {boolean} True if it's a valid Arweave JWK, otherwise false. - */ -function isJwk(obj: any): boolean { - if (typeof obj !== 'object') - return false - const requiredKeys = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi'] - return requiredKeys.every(key => key in obj) -} +export class Wallet { + #jwk: JWKInterface + + constructor(jwk: JWKInterface) { + this.#jwk = jwk + } + + /** + * Check if the passed argument is a valid JSON Web Key (JWK) for Arweave. + * @param obj - The object to check for JWK validity. + * @returns {boolean} True if it's a valid Arweave JWK, otherwise false. + */ + static isJwk(obj: any): boolean { + if (typeof obj !== 'object') { + return false + } + const requiredKeys = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi'] + return requiredKeys.every(key => key in obj) + } + + #checkIfWalletLoaded() { + if (!this.#jwk) { + throw new Error('Wallet not loaded yet') + } + } + + static async getWallet(jwkOrPath?: fs.PathOrFileDescriptor | JWKInterface): Promise { + try { + if (!jwkOrPath) { + throw new Error('Wallet not specified') + } -export async function getWallet(walletOrPath?: fs.PathOrFileDescriptor | JWKInterface): Promise { - try { - if (!walletOrPath) - throw new Error('Wallet not specified') + if (this.isJwk(jwkOrPath)) { + return jwkOrPath as JWKInterface + } - if (isJwk(walletOrPath)) - return walletOrPath as JWKInterface + const jwk = fs.readFileSync(jwkOrPath as string, 'utf8') + return JSON.parse(jwk) + } + catch (e) { + if (fs.existsSync(path.resolve(`${os.homedir()}/.aos.json`))) { + return JSON.parse(fs.readFileSync(path.resolve(`${os.homedir()}/.aos.json`), 'utf-8')) + } - const jwk = fs.readFileSync(walletOrPath as string, 'utf8') - return JSON.parse(jwk) + const wallet = await arweave.wallets.generate() + fs.writeFileSync(path.resolve(`${os.homedir()}/.aos.json`), JSON.stringify(wallet)) + return wallet + } } - catch (e) { - if (fs.existsSync(path.resolve(`${os.homedir()}/.aos.json`))) - return JSON.parse(fs.readFileSync(path.resolve(`${os.homedir()}/.aos.json`), 'utf-8')) - const wallet = await Arweave.init({}).wallets.generate() - fs.writeFileSync(path.resolve(`${os.homedir()}/.aos.json`), JSON.stringify(wallet)) - return wallet + static async load(jwkOrPath?: fs.PathOrFileDescriptor | JWKInterface) { + const jwk = await this.getWallet(jwkOrPath) + return new Wallet(jwk) } -} -export async function getWalletAddress(wallet: JWKInterface) { - return await arweave.wallets.getAddress(wallet) -} + async getAddress() { + this.#checkIfWalletLoaded() + return await arweave.wallets.getAddress(this.#jwk) + } -export function isArweaveAddress(address: any): boolean { - return typeof address === 'string' && /^[a-z0-9-_]{43}$/i.test(address) + get jwk() { + this.#checkIfWalletLoaded() + return this.#jwk + } } diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..5f8a355 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,85 @@ +import type { JWKInterface } from 'arweave/node/lib/wallet' + +export type ConfigName = string + +export interface Tag { name: string, value: string } + +export interface DeployConfig { + /** + * Process name to spawn + * @default "default" + */ + name?: string + /** + * Path to contract main file + */ + contractPath: string + /** + * The module source to use to spin up Process + * @default "Fetches from `https://raw.githubusercontent.com/permaweb/aos/main/package.json`" + */ + module?: string + /** + * Scheduler to use for Process + * @default "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" + */ + scheduler?: string + /** + * Additional tags to use for spawning Process + */ + tags?: Tag[] + /** + * Cron interval to use for Process i.e (1-minute, 5-minutes) + */ + cron?: string + /** + * Wallet path or JWK itself + */ + wallet?: JWKInterface | string + + /** + * lua path to find the lua modules + */ + luaPath?: string + + /** + * Config name used for logging + */ + configName?: string + + /** + * Retry options + */ + retry?: { + /** + * Retry count + * @default 10 + */ + count?: number + /** + * Retry delay in milliseconds + * @default 3000 + */ + delay?: number + } + /** + * Concurrency limit to deploy multiple processes + */ + concurrency?: number + /** + * Process Id of an existing process + */ + processId?: string +} + +export type Config = Record + +export interface DeployResult { + name: string + configName: string + messageId: string + processId: string + isNewProcess: boolean +} + +export interface Module { name: string, path: string, content?: string, dependencies?: Set }