diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..38befb2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,9 @@ +node_modules/** +package.json +pnpm-lock.yaml +.vscode +.prettierrc +.eslintrc +.husky +dist/ +*.md \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..f822196 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,19 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "rules": { + "no-console": "off", + "prettier/prettier": "error", + "@typescript-eslint/no-explicit-any": "off" + } +} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a4094d..f528384 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ permissions: on: push: tags: - - 'v*' + - "v*" jobs: release: diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..38befb2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +node_modules/** +package.json +pnpm-lock.yaml +.vscode +.prettierrc +.eslintrc +.husky +dist/ +*.md \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e155808 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 2, + "printWidth": 80, + "trailingComma": "none", + "endOfLine": "auto" +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..1d7ac85 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index c82187b..cfe9853 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,64 +1,8 @@ { - // Enable the ESlint flat config support - "eslint.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" + "source.organizeImports": "always", + "source.fixAll.eslint": "always" }, - // 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" - } - ], - // Enable eslint for all supported languages - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact", - "vue", - "html", - "markdown", - "json", - "jsonc", - "yaml" - ] + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40407f0..dc48328 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,26 +16,27 @@ Thank you for considering contributing to ao-deploy! We welcome contributions fr 2. **Create a branch**: Make sure to create a new branch for your changes. Use a descriptive name for your branch (e.g., `fix-typo`, `add-new-feature`). 3. **Install dependencies**: Use `pnpm` to install dependencies. - ```bash - pnpm install - ``` + ```bash + pnpm install + ``` 4. **Make changes**: Implement your changes in your branch. 5. **Test your changes**: Ensure that your changes do not break any existing functionality. 6. **Lint your code**: Ensure your code follows the project's coding standards. - ```bash - pnpm lint - ``` + ```bash + pnpm lint + ``` 7. **Submit a pull request**: Push your changes to your forked repository and open a pull request to the main repository. Provide a clear description of the changes and why they are needed. ### Development Guidelines 1. **Code style**: - - Follow the coding style and guidelines as configured in our ESLint setup. We use `@antfu/eslint-config` for ESLint configuration. - - Ensure code formatting using ESLint. We have `lint-staged` configured to run `eslint --fix` on staged files before committing. + + - Follow the coding style and guidelines as configured in our ESLint setup. + - Ensure code formatting using ESLint. We have `lint-staged` configured to run `eslint --fix` on staged files before committing. 2. **Documentation**: Update documentation as necessary to reflect your changes. 3. **Commit messages**: Write clear and concise commit messages that explain the purpose of the changes. @@ -44,45 +45,45 @@ Thank you for considering contributing to ao-deploy! We welcome contributions fr - **Build**: Build the project using `unbuild`. - ```bash - pnpm build - ``` + ```bash + pnpm build + ``` - **Dev**: Start the development server. - ```bash - pnpm dev - ``` + ```bash + pnpm dev + ``` - **Lint**: Lint the project using ESLint. - ```bash - pnpm lint - ``` + ```bash + pnpm lint + ``` - **Test**: Run tests using Vitest. - ```bash - pnpm test - ``` + ```bash + pnpm test + ``` - **Typecheck**: Check TypeScript types. - ```bash - pnpm typecheck - ``` + ```bash + pnpm typecheck + ``` - **Release**: Bump version and publish. - ```bash - pnpm release - ``` + ```bash + pnpm release + ``` - **Prepare**: Prepare git hooks using `simple-git-hooks`. - ```bash - pnpm prepare - ``` + ```bash + pnpm prepare + ``` ## Need Help? diff --git a/README.md b/README.md index 46de575..6652f68 100644 --- a/README.md +++ b/README.md @@ -90,33 +90,33 @@ Here is an example using a deployment configuration: ```ts // aod.config.ts -import { defineConfig } from 'ao-deploy' +import { defineConfig } from "ao-deploy"; -const wallet = 'wallet.json' -const luaPath = './?.lua;./src/?.lua' +const wallet = "wallet.json"; +const luaPath = "./?.lua;./src/?.lua"; const config = defineConfig({ contract_1: { luaPath, name: `contract-1`, - contractPath: 'contract-1.lua', - wallet, + contractPath: "contract-1.lua", + wallet }, contract_2: { luaPath, name: `contract-2`, - contractPath: 'contract-2.lua', - wallet, + contractPath: "contract-2.lua", + wallet }, contract_3: { luaPath, name: `contract-3`, - contractPath: 'contract-3.lua', - wallet, + contractPath: "contract-3.lua", + wallet } -}) +}); -export default config +export default config; ``` Deploy all specified contracts: @@ -156,32 +156,32 @@ Here is an example using a deployment configuration: ```ts // aod.config.ts -import { defineConfig } from 'ao-deploy' +import { defineConfig } from "ao-deploy"; -const luaPath = './?.lua;./src/?.lua' +const luaPath = "./?.lua;./src/?.lua"; const config = defineConfig({ contract_1: { luaPath, name: `contract-1`, - contractPath: 'contract-1.lua', - outDir: './dist', + contractPath: "contract-1.lua", + outDir: "./dist" }, contract_2: { luaPath, name: `contract-2`, - contractPath: 'contract-2.lua', - outDir: './dist', + contractPath: "contract-2.lua", + outDir: "./dist" }, contract_3: { luaPath, name: `contract-3`, - contractPath: 'contract-3.lua', - outDir: './dist', + contractPath: "contract-3.lua", + outDir: "./dist" } -}) +}); -export default config +export default config; ``` Build all specified contracts: @@ -197,7 +197,7 @@ ao-deploy aod.config.ts --build=contract_1,contract_3 --build-only ``` > [!Note] -A wallet is generated and saved if not passed. +> A wallet is generated and saved if not passed. Retrieve the generated wallet path: @@ -212,32 +212,33 @@ To deploy a contract, you need to import and call the `deployContract` function #### Example: deployContract ```ts -import { deployContract } from 'ao-deploy' +import { deployContract } from "ao-deploy"; async function main() { try { - const { messageId, processId } = await deployContract( - { - name: 'demo', - wallet: 'wallet.json', - contractPath: 'process.lua', - tags: [{ name: 'Custom', value: 'Tag' }], - retry: { - count: 10, - delay: 3000, - }, - }, - ) - const processUrl = `https://ao_marton.g8way.io/#/process/${processId}` - const messageUrl = `${processUrl}/${messageId}` - console.log(`\nDeployed Process: ${processUrl} \nDeployment Message: ${messageUrl}`) - } - catch (error: any) { - console.log(`Deployment failed!: ${error?.message ?? 'Failed to deploy contract!'}\n`) + const { messageId, processId } = await deployContract({ + name: "demo", + wallet: "wallet.json", + contractPath: "process.lua", + tags: [{ name: "Custom", value: "Tag" }], + retry: { + count: 10, + delay: 3000 + } + }); + const processUrl = `https://ao_marton.g8way.io/#/process/${processId}`; + const messageUrl = `${processUrl}/${messageId}`; + console.log( + `\nDeployed Process: ${processUrl} \nDeployment Message: ${messageUrl}` + ); + } catch (error: any) { + console.log( + `Deployment failed!: ${error?.message ?? "Failed to deploy contract!"}\n` + ); } } -main() +main(); ``` ##### Parameters @@ -260,53 +261,55 @@ The `deployContract` function accepts the following parameters within the Deploy 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' +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' }], + name: "demo1", + wallet: "wallet.json", + contractPath: "process1.lua", + tags: [{ name: "Custom", value: "Tag" }], retry: { count: 10, - delay: 3000, - }, + delay: 3000 + } }, { - name: 'demo2', - wallet: 'wallet.json', - contractPath: 'process2.lua', - tags: [{ name: 'Custom', value: 'Tag' }], + name: "demo2", + wallet: "wallet.json", + contractPath: "process2.lua", + tags: [{ name: "Custom", value: "Tag" }], retry: { count: 10, - delay: 3000, - }, + 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}`) + 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`); } - else { - console.log(`Failed to deploy contract!: ${result.reason}\n`) - } - }) - } - catch (error: any) { - console.log(`Deployment failed!: ${error?.message ?? 'Failed to deploy contract!'}\n`) + }); + } catch (error: any) { + console.log( + `Deployment failed!: ${error?.message ?? "Failed to deploy contract!"}\n` + ); } } -main() +main(); ``` ## Author diff --git a/build.config.ts b/build.config.ts index b0c77ee..6b2ba41 100644 --- a/build.config.ts +++ b/build.config.ts @@ -1,25 +1,24 @@ -import { defineBuildConfig } from 'unbuild' +import { defineBuildConfig } from "unbuild"; -export default defineBuildConfig([{ - entries: [ - 'src/index', - ], - declaration: true, - clean: true, - rollup: { - emitCJS: true, - inlineDependencies: true, +export default defineBuildConfig([ + { + entries: ["src/index"], + declaration: true, + clean: true, + rollup: { + emitCJS: true, + inlineDependencies: true + }, + failOnWarn: false }, - failOnWarn: false, -}, { - entries: [ - 'src/cli', - ], - declaration: false, - clean: true, - rollup: { - emitCJS: false, - inlineDependencies: true, - }, - failOnWarn: false, -}]) + { + entries: ["src/cli"], + declaration: false, + clean: true, + rollup: { + emitCJS: false, + inlineDependencies: true + }, + failOnWarn: false + } +]); diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index cf4982a..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-check -import antfu from '@antfu/eslint-config' - -export default antfu( - { - ignores: [ - // eslint ignore globs here - ], - }, - { - 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 9b89a91..3de1775 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,9 @@ "test": "vitest", "typecheck": "tsc --noEmit", "prepare": "simple-git-hooks", - "prepack": "pnpm build" + "prepack": "pnpm build", + "fmt": "prettier --write .", + "fmt:check": "prettier --check ." }, "dependencies": { "@permaweb/aoconnect": "^0.0.58", @@ -62,19 +64,22 @@ "pretty-file-tree": "^1.0.1" }, "devDependencies": { - "@antfu/eslint-config": "^2.24.1", - "@antfu/ni": "^0.21.12", - "@antfu/utils": "^0.7.7", + "@eslint/js": "^9.9.0", "@types/node": "^20.12.8", "bumpp": "^9.4.1", "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", "esno": "^4.7.0", + "globals": "^15.9.0", "lint-staged": "^15.2.2", "pnpm": "^8.15.8", + "prettier": "^3.3.3", "rimraf": "^5.0.5", "simple-git-hooks": "^2.11.1", "tsx": "^4.16.5", "typescript": "^5.4.5", + "typescript-eslint": "^8.1.0", "unbuild": "^2.0.0", "vite": "^5.2.11", "vitest": "^1.6.0" @@ -83,6 +88,6 @@ "pre-commit": "pnpm lint-staged" }, "lint-staged": { - "*": "eslint --fix" + "*": "eslint . --fix" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 347f956..edd937b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,15 +30,9 @@ importers: specifier: ^1.0.1 version: 1.0.1 devDependencies: - '@antfu/eslint-config': - specifier: ^2.24.1 - version: 2.24.1(@vue/compiler-sfc@3.4.35)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0) - '@antfu/ni': - specifier: ^0.21.12 - version: 0.21.12 - '@antfu/utils': - specifier: ^0.7.7 - version: 0.7.7 + '@eslint/js': + specifier: ^9.9.0 + version: 9.9.0 '@types/node': specifier: ^20.12.8 version: 20.12.8 @@ -48,15 +42,27 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3) esno: specifier: ^4.7.0 version: 4.7.0 + globals: + specifier: ^15.9.0 + version: 15.9.0 lint-staged: specifier: ^15.2.2 version: 15.2.2 pnpm: specifier: ^8.15.8 version: 8.15.8 + prettier: + specifier: ^3.3.3 + version: 3.3.3 rimraf: specifier: ^5.0.5 version: 5.0.5 @@ -69,6 +75,9 @@ importers: typescript: specifier: ^5.4.5 version: 5.4.5 + typescript-eslint: + specifier: ^8.1.0 + version: 8.1.0(eslint@8.57.0)(typescript@5.4.5) unbuild: specifier: ^2.0.0 version: 2.0.0(typescript@5.4.5) @@ -89,115 +98,6 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@antfu/eslint-config@2.24.1(@vue/compiler-sfc@3.4.35)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0): - resolution: {integrity: sha512-vk2zqPO3HFHxhlIZbMxjo185qvMmCUUc6H58TrXHjMxnCCkw9SqBDWemV6uKUmPSphaOipjzoXYYSyeFYhGa1w==} - hasBin: true - peerDependencies: - '@eslint-react/eslint-plugin': ^1.5.8 - '@prettier/plugin-xml': ^3.4.1 - '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: ^1.0.2 - eslint: '>=8.40.0' - eslint-plugin-astro: ^1.2.0 - eslint-plugin-format: '>=0.1.0' - eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-react-refresh: ^0.4.4 - eslint-plugin-solid: ^0.13.2 - eslint-plugin-svelte: '>=2.35.1' - prettier-plugin-astro: ^0.13.0 - prettier-plugin-slidev: ^1.0.5 - svelte-eslint-parser: '>=0.37.0' - peerDependenciesMeta: - '@eslint-react/eslint-plugin': - optional: true - '@prettier/plugin-xml': - optional: true - '@unocss/eslint-plugin': - optional: true - astro-eslint-parser: - optional: true - eslint-plugin-astro: - optional: true - eslint-plugin-format: - optional: true - eslint-plugin-react-hooks: - optional: true - eslint-plugin-react-refresh: - optional: true - eslint-plugin-solid: - optional: true - eslint-plugin-svelte: - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-slidev: - optional: true - svelte-eslint-parser: - optional: true - dependencies: - '@antfu/install-pkg': 0.3.3 - '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 2.6.1(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - eslint-config-flat-gitignore: 0.1.8 - eslint-flat-config-utils: 0.3.0 - eslint-merge-processors: 0.1.0(eslint@8.57.0) - eslint-plugin-antfu: 2.3.4(eslint@8.57.0) - eslint-plugin-command: 0.2.3(eslint@8.57.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import-x: 3.1.0(eslint@8.57.0)(typescript@5.4.5) - eslint-plugin-jsdoc: 48.11.0(eslint@8.57.0) - eslint-plugin-jsonc: 2.16.0(eslint@8.57.0) - eslint-plugin-markdown: 5.1.0(eslint@8.57.0) - eslint-plugin-n: 17.10.1(eslint@8.57.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 3.1.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3) - eslint-plugin-regexp: 2.6.0(eslint@8.57.0) - eslint-plugin-toml: 0.11.1(eslint@8.57.0) - eslint-plugin-unicorn: 55.0.0(eslint@8.57.0) - eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@8.0.0)(eslint@8.57.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0)(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0) - eslint-plugin-vue: 9.27.0(eslint@8.57.0) - eslint-plugin-yml: 1.14.0(eslint@8.57.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.35)(eslint@8.57.0) - globals: 15.9.0 - jsonc-eslint-parser: 2.4.0 - local-pkg: 0.5.0 - parse-gitignore: 2.0.0 - picocolors: 1.0.1 - toml-eslint-parser: 0.10.0 - vue-eslint-parser: 9.4.3(eslint@8.57.0) - yaml-eslint-parser: 1.2.3 - yargs: 17.7.2 - transitivePeerDependencies: - - '@vue/compiler-sfc' - - supports-color - - svelte - - typescript - - vitest - dev: true - - /@antfu/install-pkg@0.3.3: - resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==} - dependencies: - '@jsdevtools/ez-spawn': 3.0.4 - dev: true - - /@antfu/ni@0.21.12: - resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} - hasBin: true - dev: true - - /@antfu/utils@0.7.10: - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} - dev: true - - /@antfu/utils@0.7.7: - resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} - dev: true - /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -214,6 +114,7 @@ packages: '@babel/highlight': 7.24.7 picocolors: 1.0.0 dev: true + optional: true /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} @@ -324,11 +225,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-string-parser@7.24.8: - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.24.5: resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} @@ -339,6 +235,7 @@ packages: engines: {node: '>=6.9.0'} requiresBuild: true dev: true + optional: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -377,6 +274,7 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 dev: true + optional: true /@babel/parser@7.24.5: resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} @@ -386,14 +284,6 @@ packages: '@babel/types': 7.24.5 dev: true - /@babel/parser@7.25.3: - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.25.2 - dev: true - /@babel/standalone@7.24.5: resolution: {integrity: sha512-Sl8oN9bGfRlNUA2jzfzoHEZxFBDliBlwi5mPVCAWKSlBNkXXJOHpu7SDOqjF6mRoTa6GNX/1kAWG3Tr+YQ3N7A==} engines: {node: '>=6.9.0'} @@ -420,7 +310,7 @@ packages: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -435,53 +325,6 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.25.2: - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - dev: true - - /@clack/core@0.3.4: - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} - dependencies: - picocolors: 1.0.1 - sisteransi: 1.0.5 - dev: true - - /@clack/prompts@0.7.0: - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - dependencies: - '@clack/core': 0.3.4 - picocolors: 1.0.1 - sisteransi: 1.0.5 - dev: true - bundledDependencies: - - is-unicode-supported - - /@es-joy/jsdoccomment@0.43.1: - resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} - engines: {node: '>=16'} - dependencies: - '@types/eslint': 8.56.11 - '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.18.0 - comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true - - /@es-joy/jsdoccomment@0.46.0: - resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} - engines: {node: '>=16'} - dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true - /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -1145,6 +988,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@9.9.0: + resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -1515,130 +1363,27 @@ packages: engines: {node: '>=18'} dev: true - /@stylistic/eslint-plugin-js@2.6.1(eslint@8.57.0): - resolution: {integrity: sha512-iLOiVzcvqzDGD9U0EuVOX680v+XOPiPAjkxWj+Q6iV2GLOM5NB27tKVOpJY7AzBhidwpRbaLTgg3T4UzYx09jw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - dependencies: - '@types/eslint': 9.6.0 - acorn: 8.12.1 - eslint: 8.57.0 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 - dev: true - - /@stylistic/eslint-plugin-jsx@2.6.1(eslint@8.57.0): - resolution: {integrity: sha512-5qHLXqxfY6jubAQfDqrifv41fx7gaqA9svDaChxMI6JiHpEBfh+PXxmm3g+B8gJCYVBTC62Rjl0Ny5QabK58bw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - dependencies: - '@stylistic/eslint-plugin-js': 2.6.1(eslint@8.57.0) - '@types/eslint': 9.6.0 - eslint: 8.57.0 - estraverse: 5.3.0 - picomatch: 4.0.2 - dev: true - - /@stylistic/eslint-plugin-plus@2.6.1(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-z/IYu/q8ipApzNam5utSU+BrXg4pK/Gv9xNbr4eWv/bZppvTWJU62xCO4nw/6r2dHNPnqc7uCHEC7GMlBnPY0A==} - peerDependencies: - eslint: '*' - dependencies: - '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@stylistic/eslint-plugin-ts@2.6.1(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-Mxl1VMorEG1Hc6oBYPD0+KIJOWkjEF1R0liL7wWgKfwpqOkgmnh5lVdZBrYyfRKOE4RlGcwEFTNai1IW6orgVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - dependencies: - '@stylistic/eslint-plugin-js': 2.6.1(eslint@8.57.0) - '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@stylistic/eslint-plugin@2.6.1(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-UT0f4t+3sQ/GKW7875NiIIjZJ1Bh4gd7JNfoIkwIQyWqO7wGd0Pqzu0Ho30Ka8MNF5lm++SkVeqAk26vGxoUpg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - dependencies: - '@stylistic/eslint-plugin-js': 2.6.1(eslint@8.57.0) - '@stylistic/eslint-plugin-jsx': 2.6.1(eslint@8.57.0) - '@stylistic/eslint-plugin-plus': 2.6.1(eslint@8.57.0)(typescript@5.4.5) - '@stylistic/eslint-plugin-ts': 2.6.1(eslint@8.57.0)(typescript@5.4.5) - '@types/eslint': 9.6.0 - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} dev: true - /@types/eslint@8.56.11: - resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true - - /@types/eslint@9.6.0: - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - dependencies: - '@types/unist': 2.0.10 - dev: true - /@types/node@20.12.8: resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} dependencies: undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true - /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: true - - /@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==} + /@typescript-eslint/eslint-plugin@8.1.0(@typescript-eslint/parser@8.1.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-LlNBaHFCEBPHyD4pZXb35mzjGkuGKXU5eeCA1SxvHfiRES0E82dOounfVpL4DCqYvJEKab0bZIA0gCRpdLKkCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -1648,12 +1393,12 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.0.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.1.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 8.1.0 + '@typescript-eslint/type-utils': 8.1.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 8.1.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 8.1.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -1664,8 +1409,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@8.0.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==} + /@typescript-eslint/parser@8.1.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-U7iTAtGgJk6DPX9wIWPPOlt1gO57097G06gIcl0N0EEnNw8RGD62c+2/DiP/zL7KrkqnnqF7gtFGR7YgzPllTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1674,10 +1419,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/scope-manager': 8.1.0 + '@typescript-eslint/types': 8.1.0 + '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 8.1.0 debug: 4.3.6 eslint: 8.57.0 typescript: 5.4.5 @@ -1685,24 +1430,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@7.18.0: - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - dev: true - - /@typescript-eslint/scope-manager@8.0.0: - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} + /@typescript-eslint/scope-manager@8.1.0: + resolution: {integrity: sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.1.0 + '@typescript-eslint/visitor-keys': 8.1.0 dev: true - /@typescript-eslint/type-utils@8.0.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} + /@typescript-eslint/type-utils@8.1.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-oLYvTxljVvsMnldfl6jIKxTaU7ok7km0KDrwOt1RHYu6nxlhN3TIx8k5Q52L6wR33nOwDgM7VwW1fT1qMNfFIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1710,8 +1447,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.4.5) - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.4.5) + '@typescript-eslint/utils': 8.1.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.6 ts-api-utils: 1.3.0(typescript@5.4.5) typescript: 5.4.5 @@ -1720,40 +1457,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@7.18.0: - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true - - /@typescript-eslint/types@8.0.0: - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} + /@typescript-eslint/types@8.1.0: + resolution: {integrity: sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@7.18.0(typescript@5.4.5): - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 - 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@8.0.0(typescript@5.4.5): - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} + /@typescript-eslint/typescript-estree@8.1.0(typescript@5.4.5): + resolution: {integrity: sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1761,64 +1471,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.1.0 + '@typescript-eslint/visitor-keys': 8.1.0 debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 + minimatch: 9.0.5 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - 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) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.4.5) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils@8.0.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} + /@typescript-eslint/utils@8.1.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 8.1.0 + '@typescript-eslint/types': 8.1.0 + '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@7.18.0: - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typescript-eslint/visitor-keys@8.0.0: - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} + /@typescript-eslint/visitor-keys@8.1.0: + resolution: {integrity: sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/types': 8.1.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1865,48 +1551,6 @@ packages: pretty-format: 29.7.0 dev: true - /@vue/compiler-core@3.4.35: - resolution: {integrity: sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==} - dependencies: - '@babel/parser': 7.25.3 - '@vue/shared': 3.4.35 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - dev: true - - /@vue/compiler-dom@3.4.35: - resolution: {integrity: sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==} - dependencies: - '@vue/compiler-core': 3.4.35 - '@vue/shared': 3.4.35 - dev: true - - /@vue/compiler-sfc@3.4.35: - resolution: {integrity: sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==} - dependencies: - '@babel/parser': 7.25.3 - '@vue/compiler-core': 3.4.35 - '@vue/compiler-dom': 3.4.35 - '@vue/compiler-ssr': 3.4.35 - '@vue/shared': 3.4.35 - estree-walker: 2.0.2 - magic-string: 0.30.10 - postcss: 8.4.40 - source-map-js: 1.2.0 - dev: true - - /@vue/compiler-ssr@3.4.35: - resolution: {integrity: sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==} - dependencies: - '@vue/compiler-dom': 3.4.35 - '@vue/shared': 3.4.35 - dev: true - - /@vue/shared@3.4.35: - resolution: {integrity: sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==} - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1915,14 +1559,6 @@ packages: acorn: 8.11.3 dev: true - /acorn-jsx@5.3.2(acorn@8.12.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.12.1 - dev: true - /acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -1934,12 +1570,6 @@ packages: hasBin: true dev: true - /acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2003,11 +1633,6 @@ packages: arweave: 1.15.1 dev: false - /are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -2223,18 +1848,6 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true - - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true - - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true - /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -2261,24 +1874,12 @@ packages: engines: {node: '>=10'} dev: true - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true - /citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: consola: 3.2.3 dev: true - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2294,15 +1895,6 @@ packages: string-width: 7.1.0 dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} requiresBuild: true @@ -2349,11 +1941,6 @@ packages: engines: {node: '>= 10'} dev: true - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true - /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -2375,12 +1962,6 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - dependencies: - browserslist: 4.23.0 - dev: true - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2502,17 +2083,6 @@ packages: css-tree: 2.2.1 dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2631,29 +2201,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - dev: true - /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -2755,6 +2307,7 @@ packages: /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + requiresBuild: true dev: true /escape-string-regexp@4.0.0: @@ -2762,354 +2315,34 @@ packages: engines: {node: '>=10'} dev: true - /eslint-compat-utils@0.5.1(eslint@8.57.0): - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true peerDependencies: - eslint: '>=6.0.0' + eslint: '>=7.0.0' dependencies: eslint: 8.57.0 - semver: 7.6.0 dev: true - /eslint-config-flat-gitignore@0.1.8: - resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==} - dependencies: - find-up-simple: 1.0.0 - parse-gitignore: 2.0.0 - dev: true - - /eslint-flat-config-utils@0.3.0: - resolution: {integrity: sha512-FaFQLUunAl6YK7aU/pT23DXYVWg/cEHbSfxwAxpCGT6Su8H9RfkmzKLh1G2bba46p6dTlQeA4VTiV5//0SeToQ==} - dependencies: - '@types/eslint': 9.6.0 - pathe: 1.1.2 - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-merge-processors@0.1.0(eslint@8.57.0): - resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} - peerDependencies: - eslint: '*' - dependencies: - eslint: 8.57.0 - dev: true - - /eslint-plugin-antfu@2.3.4(eslint@8.57.0): - resolution: {integrity: sha512-5RIjJpBK1tuNHuLyFyZ90/iW9s439dP1u2cxA4dH70djx9sKq1CqI+O6Q95aVjgFNTDtQzSC9uYdAD5uEEKciQ==} - peerDependencies: - eslint: '*' - dependencies: - '@antfu/utils': 0.7.10 - eslint: 8.57.0 - dev: true - - /eslint-plugin-command@0.2.3(eslint@8.57.0): - resolution: {integrity: sha512-1bBYNfjZg60N2ZpLV5ATYSYyueIJ+zl5yKrTs0UFDdnyu07dNSZ7Xplnc+Wb6SXTdc1sIaoIrnuyhvztcltX6A==} - peerDependencies: - eslint: '*' - dependencies: - '@es-joy/jsdoccomment': 0.43.1 - eslint: 8.57.0 - dev: true - - /eslint-plugin-es-x@7.8.0(eslint@8.57.0): - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.3): + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=8' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - dev: true - - /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - escape-string-regexp: 1.0.5 - eslint: 8.57.0 - ignore: 5.3.1 - dev: true - - /eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} - engines: {node: '>=16'} - peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 - dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.6 - doctrine: 3.0.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.7.6 - is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - stable-hash: 0.0.4 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-jsdoc@48.11.0(eslint@8.57.0): - resolution: {integrity: sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@es-joy/jsdoccomment': 0.46.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.3.6 - escape-string-regexp: 4.0.0 - eslint: 8.57.0 - espree: 10.1.0 - esquery: 1.6.0 - parse-imports: 2.1.1 - semver: 7.6.3 - spdx-expression-parse: 4.0.0 - synckit: 0.9.1 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-jsonc@2.16.0(eslint@8.57.0): - resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - espree: 9.6.1 - graphemer: 1.4.0 - jsonc-eslint-parser: 2.4.0 - natural-compare: 1.4.0 - synckit: 0.6.2 - dev: true - - /eslint-plugin-markdown@5.1.0(eslint@8.57.0): - resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8' - dependencies: - eslint: 8.57.0 - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-n@17.10.1(eslint@8.57.0): - resolution: {integrity: sha512-hm/q37W6efDptJXdwirsm6A257iY6ZNtpoSG0wEzFzjJ3AhL7OhEIhdSR2e4OdYfHO5EDeqlCfFrjf9q208IPw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - enhanced-resolve: 5.17.1 - eslint: 8.57.0 - eslint-plugin-es-x: 7.8.0(eslint@8.57.0) - get-tsconfig: 4.7.6 - globals: 15.9.0 - ignore: 5.3.1 - minimatch: 9.0.5 - semver: 7.6.0 - dev: true - - /eslint-plugin-no-only-tests@3.1.0: - resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} - engines: {node: '>=5.0.0'} - dev: true - - /eslint-plugin-perfectionist@3.1.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3): - resolution: {integrity: sha512-QNL1L0CMo8FoKM3VkNdR8HUq8Nrl0nGZFF9jzjU8PYvDtds2bvNOm9RwpQC4Gf3M27F6CBp5JsA3jBYT4TBiHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - astro-eslint-parser: ^1.0.2 + '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' - svelte: '>=3.0.0' - svelte-eslint-parser: ^0.40.0 - vue-eslint-parser: '>=9.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' peerDependenciesMeta: - astro-eslint-parser: - optional: true - svelte: + '@types/eslint': optional: true - svelte-eslint-parser: - optional: true - vue-eslint-parser: + eslint-config-prettier: optional: true dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - minimatch: 10.0.1 - natural-compare-lite: 1.4.0 - vue-eslint-parser: 9.4.3(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-regexp@2.6.0(eslint@8.57.0): - resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} - engines: {node: ^18 || >=20} - peerDependencies: - eslint: '>=8.44.0' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - comment-parser: 1.4.1 - eslint: 8.57.0 - jsdoc-type-pratt-parser: 4.0.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scslre: 0.3.0 - dev: true - - /eslint-plugin-toml@0.11.1(eslint@8.57.0): - resolution: {integrity: sha512-Y1WuMSzfZpeMIrmlP1nUh3kT8p96mThIq4NnHrYUhg10IKQgGfBZjAWnrg9fBqguiX4iFps/x/3Hb5TxBisfdw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.6 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - lodash: 4.17.21 - toml-eslint-parser: 0.10.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-unicorn@55.0.0(eslint@8.57.0): - resolution: {integrity: sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==} - engines: {node: '>=18.18'} - peerDependencies: - eslint: '>=8.56.0' - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - ci-info: 4.0.0 - clean-regexp: 1.0.0 - core-js-compat: 3.37.1 - eslint: 8.57.0 - esquery: 1.5.0 - globals: 15.9.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.6.3 - strip-indent: 3.0.0 - dev: true - - /eslint-plugin-unused-imports@4.0.1(@typescript-eslint/eslint-plugin@8.0.0)(eslint@8.57.0): - resolution: {integrity: sha512-rax76s05z64uQgG9YXsWFmXrgjkaK79AvfeAWiSxhPP6RVGxeRaj4+2u+wxxu/mDy2pmJoOy1QTOEALMia2xGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 - eslint: ^9.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0)(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.4(@typescript-eslint/eslint-plugin@8.0.0)(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': '*' - eslint: ^8.57.0 || ^9.0.0 - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - vitest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - vitest: 1.6.0(@types/node@20.12.8) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-vue@9.27.0(eslint@8.57.0): - resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 - globals: 13.24.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.0.16 - semver: 7.6.0 - vue-eslint-parser: 9.4.3(eslint@8.57.0) - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-yml@1.14.0(eslint@8.57.0): - resolution: {integrity: sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.6 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - lodash: 4.17.21 - natural-compare: 1.4.0 - yaml-eslint-parser: 1.2.3 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.35)(eslint@8.57.0): - resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} - peerDependencies: - '@vue/compiler-sfc': ^3.3.0 - eslint: ^8.50.0 || ^9.0.0 - dependencies: - '@vue/compiler-sfc': 3.4.35 - eslint: 8.57.0 - dev: true - - /eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 dev: true /eslint-scope@7.2.2: @@ -3125,11 +2358,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3184,15 +2412,6 @@ packages: tsx: 4.16.5 dev: true - /espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 - dev: true - /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3209,13 +2428,6 @@ packages: estraverse: 5.3.0 dev: true - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3266,6 +2478,10 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -3305,19 +2521,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3388,11 +2591,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} @@ -3557,10 +2755,6 @@ packages: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3592,11 +2786,6 @@ packages: engines: {node: '>=0.8.19'} dev: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3607,21 +2796,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true - - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -3642,10 +2816,6 @@ packages: hasown: 2.0.2 dev: true - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true - /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3675,10 +2845,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true - /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -3737,36 +2903,16 @@ packages: argparse: 2.0.1 dev: true - /jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -3781,16 +2927,6 @@ packages: hasBin: true dev: true - /jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.6.0 - dev: true - /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -3828,10 +2964,6 @@ packages: engines: {node: '>=14'} dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - /lint-staged@15.2.2: resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} engines: {node: '>=18.12.0'} @@ -3871,13 +3003,6 @@ packages: pkg-types: 1.1.0 dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3897,10 +3022,6 @@ packages: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -3941,22 +3062,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true - /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true @@ -3974,15 +3079,6 @@ packages: engines: {node: '>= 8'} dev: true - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - dependencies: - debug: 4.3.6 - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4001,22 +3097,10 @@ packages: engines: {node: '>=12'} dev: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: false - /minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -4137,10 +3221,6 @@ packages: hasBin: true dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -4153,15 +3233,6 @@ packages: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4237,13 +3308,6 @@ packages: word-wrap: 1.2.5 dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4265,13 +3329,6 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -4279,11 +3336,6 @@ packages: p-limit: 3.1.0 dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4291,40 +3343,6 @@ packages: callsites: 3.1.0 dev: true - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - dev: true - - /parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - dev: true - - /parse-imports@2.1.1: - resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} - engines: {node: '>= 18'} - dependencies: - es-module-lexer: 1.5.4 - slashes: 3.0.12 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4383,20 +3401,11 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true - /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true - /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -4411,11 +3420,6 @@ packages: pathe: 1.1.2 dev: true - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /pnpm@8.15.8: resolution: {integrity: sha512-0aAp4aRHrZC8ls1YsPrUhtKZPVMYVjlve6vy2D6xgju4PFo9D8GPZ1stEDIdSesWH+zjb+gTSqWCPs0hX+7Tkg==} engines: {node: '>=16.14'} @@ -4735,20 +3739,24 @@ packages: source-map-js: 1.2.0 dev: true - /postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true - /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -4799,25 +3807,6 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4825,38 +3814,6 @@ packages: picomatch: 2.3.1 dev: true - /refa@0.12.1: - resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dependencies: - '@eslint-community/regexpp': 4.10.0 - dev: true - - /regexp-ast-analysis@0.7.1: - resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dependencies: - '@eslint-community/regexpp': 4.10.0 - refa: 0.12.1 - dev: true - - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true - - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4965,24 +3922,10 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false - /scslre@0.3.0: - resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} - engines: {node: ^14.0.0 || >=16.0.0} - dependencies: - '@eslint-community/regexpp': 4.10.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - dev: true - /scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} dev: true - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5052,10 +3995,6 @@ packages: engines: {node: '>=14.16'} dev: true - /slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - dev: true - /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -5077,39 +4016,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - dev: true - - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - dev: true - - /spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - dev: true - - /stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} - dev: true - /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -5169,13 +4075,6 @@ packages: engines: {node: '>=12'} dev: true - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5232,13 +4131,6 @@ packages: picocolors: 1.0.0 dev: true - /synckit@0.6.2: - resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} - engines: {node: '>=12.20'} - dependencies: - tslib: 2.6.3 - dev: true - /synckit@0.9.1: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5247,11 +4139,6 @@ packages: tslib: 2.6.3 dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -5294,13 +4181,6 @@ packages: is-number: 7.0.0 dev: true - /toml-eslint-parser@0.10.0: - resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - eslint-visitor-keys: 3.4.3 - dev: true - /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -5342,14 +4222,22 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + /typescript-eslint@8.1.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-prB2U3jXPJLpo1iVLN338Lvolh6OrcCZO+9Yv6AR+tvegPPptYCDBIHiEEUdqRi8gAv2bXNKfMUrgAd2ejn/ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 8.1.0(@typescript-eslint/parser@8.1.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 8.1.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 8.1.0(eslint@8.57.0)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - eslint + - supports-color dev: true /typescript@5.4.5: @@ -5418,12 +4306,6 @@ packages: engines: {node: '>=18'} dev: true - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - dependencies: - '@types/unist': 2.0.10 - dev: true - /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -5465,13 +4347,6 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - /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} @@ -5585,24 +4460,6 @@ packages: - terser dev: true - /vue-eslint-parser@9.4.3(eslint@8.57.0): - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.6 - eslint: 8.57.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - lodash: 4.17.21 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - dev: true - /warp-arbundles@1.0.4: resolution: {integrity: sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw==} dependencies: @@ -5673,16 +4530,6 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -5691,38 +4538,11 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml-eslint-parser@1.2.3: - resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} - engines: {node: ^14.17.0 || >=16.0.0} - dependencies: - eslint-visitor-keys: 3.4.3 - lodash: 4.17.21 - yaml: 2.3.4 - dev: true - /yaml@2.3.4: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/scripts/embedVersion.ts b/scripts/embedVersion.ts index 76bf8fe..e353816 100644 --- a/scripts/embedVersion.ts +++ b/scripts/embedVersion.ts @@ -1,34 +1,37 @@ -import { resolve } from 'node:path' -import type { PathLike } from 'node:fs' -import fs, { readFileSync } from 'node:fs' -import { readFile, writeFile } from 'node:fs/promises' +import type { PathLike } from "node:fs"; +import fs, { readFileSync } from "node:fs"; +import { readFile, writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; const version = JSON.parse( - readFileSync('./package.json', { encoding: 'utf-8' }), -).version + readFileSync("./package.json", { encoding: "utf-8" }) +).version; -const paths = ['./cli.mjs', 'index.cjs', 'index.mjs'] +const paths = ["./cli.mjs", "index.cjs", "index.mjs"]; export async function checkPath(path: PathLike): Promise { return fs.promises .stat(path) - .then(_ => true) - .catch(_ => false) + .then(() => true) + .catch(() => false); } (async function (): Promise { - const dir = resolve('./dist') + const dir = resolve("./dist"); await Promise.all( - paths.map(p => + paths.map((p) => (async (): Promise => { - const path = resolve(dir, p) + const path = resolve(dir, p); if (!(await checkPath(path))) { - throw new Error(`${path} does not exist!`) + throw new Error(`${path} does not exist!`); } - const content = await readFile(path, { encoding: 'utf-8' }) - const newContent = content.replace('REPLACE-AO-DEPLOY-VERSION', version) - await writeFile(path, newContent, { encoding: 'utf-8' }) - })(), - ), - ) -})() + const content = await readFile(path, { encoding: "utf-8" }); + const newContent = content.replace( + "REPLACE-AO-DEPLOY-VERSION", + version + ); + await writeFile(path, newContent, { encoding: "utf-8" }); + })() + ) + ); +})(); diff --git a/src/cli.ts b/src/cli.ts index 34901f2..bb0b9d4 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,246 +1,317 @@ #!/usr/bin/env node -import process, { emitWarning } from 'node:process' -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import fs from 'node:fs' -import chalk from 'chalk' -import { Command } from 'commander' -import { deployContract, deployContracts } from './lib/deploy' -import { ConfigManager } from './lib/config' -import type { BundleResult, DeployResult, Tag } from './types' -import { Logger } from './lib/logger' -import { BuildError, DeployError } from './lib/error' -import { loadAndBundleContracts } from './lib/loader' -import { clearBuildOutDir, isLuaFile, parseToInt, parseUrl } from './lib/utils' - -const PKG_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '../') +import process, { emitWarning } from "node:process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import fs from "node:fs"; +import chalk from "chalk"; +import { Command } from "commander"; +import { deployContract, deployContracts } from "./lib/deploy"; +import { ConfigManager } from "./lib/config"; +import type { BundleResult, DeployResult, Tag } from "./types"; +import { Logger } from "./lib/logger"; +import { BuildError, DeployError } from "./lib/error"; +import { loadAndBundleContracts } from "./lib/loader"; +import { clearBuildOutDir, isLuaFile, parseToInt, parseUrl } from "./lib/utils"; + +const PKG_ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), "../"); process.emitWarning = (warning, ...args) => { - if (args[0] === 'ExperimentalWarning') { - return + if (args[0] === "ExperimentalWarning") { + return; } - if (args[0] && typeof args[0] === 'object' && args[0].type === 'ExperimentalWarning') { - return + if ( + args[0] && + typeof args[0] === "object" && + args[0].type === "ExperimentalWarning" + ) { + return; } // @ts-expect-error "experimental warning" - return emitWarning(warning, ...args) -} + return emitWarning(warning, ...args); +}; function getPackageJson() { - const packageJsonPath = path.join(PKG_ROOT, 'package.json') - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()) - return packageJson + const packageJsonPath = path.join(PKG_ROOT, "package.json"); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); + return packageJson; } 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) + 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('') + console.log(""); if (isNewProcess) { - logger.log(`Deployed Process: ${processUrl}`) + logger.log(`Deployed Process: ${processUrl}`); } - logger.log(`Deployment Message: ${messageUrl}`) + logger.log(`Deployment Message: ${messageUrl}`); } function logBundleDetails(result: BundleResult) { - const { name, outDir, size, configName } = result - const generated = chalk.green(`${name}.lua has been generated at ${outDir}`) - const bundleSize = chalk.green(`Bundle size is ${size} bytes`) - const logger = Logger.init(configName) + const { name, outDir, size, configName } = result; + const generated = chalk.green(`${name}.lua has been generated at ${outDir}`); + const bundleSize = chalk.green(`Bundle size is ${size} bytes`); + const logger = Logger.init(configName); - console.log('') + console.log(""); - logger.log(`Bundling: ${generated}`) - logger.log(`Bundling: ${bundleSize}`) + logger.log(`Bundling: ${generated}`); + logger.log(`Bundling: ${bundleSize}`); - logger.log(`Bundling complete! ✨`) + logger.log(`Bundling complete! ✨`); } -const program = new Command() -const packageJson = getPackageJson() +const program = new Command(); +const packageJson = getPackageJson(); program .name(packageJson.name) - .description('Deploy AO contracts using a CLI.') + .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('-b, --build [build]', 'List of build 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('--build-only', 'Bundle the contract into a single file and store it in the process-dist directory.') - .option('--out-dir [outDir]', 'Used with --build-only to output the single bundle contract file to a specified directory.') - .option('--gateway-url [url]', 'Custom Gateway URL to connect to.', parseUrl, 'https://arweave.net') - .option('--cu-url [url]', 'Custom Compute Unit (CU) URL to connect to.', parseUrl, 'https://cu.ao-testnet.xyz') - .option('--mu-url [url]', 'Custom Messenger Unit (MU) URL to connect to.', parseUrl, 'https://mu.ao-testnet.xyz') - .option('--concurrency [limit]', 'Concurrency limit for deploying multiple processes.', parseToInt, 5) - .option('--sqlite', 'Use sqlite aos module when spawning new process') - .option('--retry-count [count]', 'Number of retries for deploying contract.', parseToInt, 10) - .option('--retry-delay [delay]', 'Delay between retries in milliseconds.', parseToInt, 3000) - -program.parse(process.argv) - -const options = program.opts() -const contractOrConfigPath = program.args[0] -const isContractPath = isLuaFile(contractOrConfigPath) -const isBuildOnly = options.buildOnly -const outDir = options.outDir || './process-dist' + .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( + "-b, --build [build]", + "List of build 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( + "--build-only", + "Bundle the contract into a single file and store it in the process-dist directory." + ) + .option( + "--out-dir [outDir]", + "Used with --build-only to output the single bundle contract file to a specified directory." + ) + .option( + "--gateway-url [url]", + "Custom Gateway URL to connect to.", + parseUrl, + "https://arweave.net" + ) + .option( + "--cu-url [url]", + "Custom Compute Unit (CU) URL to connect to.", + parseUrl, + "https://cu.ao-testnet.xyz" + ) + .option( + "--mu-url [url]", + "Custom Messenger Unit (MU) URL to connect to.", + parseUrl, + "https://mu.ao-testnet.xyz" + ) + .option( + "--concurrency [limit]", + "Concurrency limit for deploying multiple processes.", + parseToInt, + 5 + ) + .option("--sqlite", "Use sqlite aos module when spawning new process") + .option( + "--retry-count [count]", + "Number of retries for deploying contract.", + parseToInt, + 10 + ) + .option( + "--retry-delay [delay]", + "Delay between retries in milliseconds.", + parseToInt, + 3000 + ); + +program.parse(process.argv); + +const options = program.opts(); +const contractOrConfigPath = program.args[0]; +const isContractPath = isLuaFile(contractOrConfigPath); +const isBuildOnly = options.buildOnly; +const outDir = options.outDir || "./process-dist"; async function deploymentHandler() { try { - Logger.log(packageJson.name, 'Deploying...', false, true) + Logger.log(packageJson.name, "Deploying...", false, true); if (isContractPath) { 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, - sqlite: options.sqlite, - services: { - gatewayUrl: options.gatewayUrl, - cuUrl: options.cuUrl, - muUrl: options.muUrl, - }, + 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) }, - ) - logDeploymentDetails(result) - } - else { - const configManager = new ConfigManager(contractOrConfigPath) - const deployConfigs = configManager.getDeployConfigs(options.deploy) - const concurrency = parseToInt(options.concurrency, 5) + luaPath: options.luaPath, + configName: options.name, + processId: options.processId, + sqlite: options.sqlite, + services: { + gatewayUrl: options.gatewayUrl, + cuUrl: options.cuUrl, + muUrl: options.muUrl + } + }); + 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) + 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 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) + }); + 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) { - throw new DeployError(error?.message ?? 'Failed to deploy contract!') + } catch (error: any) { + throw new DeployError(error?.message ?? "Failed to deploy contract!"); } } async function buildHandler() { try { - await clearBuildOutDir(outDir) - Logger.log(packageJson.name, 'Bundling...', false, true) + await clearBuildOutDir(outDir); + Logger.log(packageJson.name, "Bundling...", false, true); - const name = options.name || 'bundle' + const name = options.name || "bundle"; if (isContractPath) { - const [result] = await loadAndBundleContracts([{ - contractPath: contractOrConfigPath, - name, - outDir, - luaPath: options.luaPath, - }], 1) + const [result] = await loadAndBundleContracts( + [ + { + contractPath: contractOrConfigPath, + name, + outDir, + luaPath: options.luaPath + } + ], + 1 + ); - if (result && result.status === 'fulfilled') { - logBundleDetails(result.value) - } - else { - Logger.error(name, 'Failed to bundle contract!', true) - Logger.error(name, result.reason) + if (result && result.status === "fulfilled") { + logBundleDetails(result.value); + } else { + Logger.error(name, "Failed to bundle contract!", true); + Logger.error(name, result.reason); } - } - else { - const configManager = new ConfigManager(contractOrConfigPath) - const deployConfigs = configManager.getDeployConfigs(options.build) - const concurrency = parseToInt(options.concurrency, 5) + } else { + const configManager = new ConfigManager(contractOrConfigPath); + const deployConfigs = configManager.getDeployConfigs(options.build); + const concurrency = parseToInt(options.concurrency, 5); - const bundlingConfigs = deployConfigs.map(config => ({ - name: config.name || 'bundle', + const bundlingConfigs = deployConfigs.map((config) => ({ + name: config.name || "bundle", contractPath: config.contractPath, - outDir: config.outDir || './process-dist', - luaPath: config.luaPath, - })) - const results = await loadAndBundleContracts(bundlingConfigs, concurrency) + outDir: config.outDir || "./process-dist", + luaPath: config.luaPath + })); + const results = await loadAndBundleContracts( + bundlingConfigs, + concurrency + ); results.forEach((result, idx) => { - const configName = deployConfigs[idx].configName! + const configName = deployConfigs[idx].configName!; - if (result.status === 'fulfilled') { - logBundleDetails(result.value) - } - else { - Logger.error(configName, 'Failed to bundle contract!', true) - Logger.error(configName, result.reason) + if (result.status === "fulfilled") { + logBundleDetails(result.value); + } else { + Logger.error(configName, "Failed to bundle contract!", true); + Logger.error(configName, result.reason); } - }) + }); - const totalCount = bundlingConfigs.length - const successCount = results.length - Logger.log(packageJson.name, `Build status: ${chalk.green(`${successCount}/${totalCount}`)} successful builds.`, true) + const totalCount = bundlingConfigs.length; + const successCount = results.length; + Logger.log( + packageJson.name, + `Build status: ${chalk.green(`${successCount}/${totalCount}`)} successful builds.`, + true + ); } - } - catch (error: any) { - throw new BuildError(error?.message ?? 'Failed to bundle contract!') + } catch (error: any) { + throw new BuildError(error?.message ?? "Failed to bundle contract!"); } } -;(async () => { +(async () => { try { if (isBuildOnly) { - await buildHandler() + await buildHandler(); + } else { + await deploymentHandler(); } - else { - await deploymentHandler() - } - } - catch (error: any) { - const logger = Logger.init(packageJson.name) + } catch (error: any) { + const logger = Logger.init(packageJson.name); if (error instanceof DeployError) { - logger.error(`Deployment failed!`, true) + logger.error(`Deployment failed!`, true); } if (error instanceof BuildError) { - logger.error(`Build failed!`, true) + logger.error(`Build failed!`, true); } - logger.error(error?.message) - process.exit(1) + logger.error(error?.message); + process.exit(1); } -})() +})(); diff --git a/src/index.ts b/src/index.ts index e192a8c..a91b425 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,2 @@ -export * from './lib/deploy' -export { defineConfig } from './lib/config' +export * from "./lib/deploy"; +export { defineConfig } from "./lib/config"; diff --git a/src/lib/config.ts b/src/lib/config.ts index b8625b2..e26c16b 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,159 +1,234 @@ -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' -import { isArweaveAddress, isCronPattern, isLuaFile, isUrl, jsonStringify } from './utils' -import { defaultLogger } from './logger' - -const __filename = fileURLToPath(import.meta.url) -const jiti = createJITI(__filename) +import createJITI from "jiti"; +import path from "node:path"; +import process from "node:process"; +import { fileURLToPath } from "node:url"; +import type { Config, DeployConfig } from "../types"; +import { defaultLogger } from "./logger"; +import { + isArweaveAddress, + isCronPattern, + isLuaFile, + isUrl, + jsonStringify +} from "./utils"; + +const __filename = fileURLToPath(import.meta.url); +const jiti = createJITI(__filename); export class ConfigManager { - #config: Config = {} + #config: Config = {}; constructor(configPath: string) { - this.#loadConfig(configPath) + this.#loadConfig(configPath); } #loadConfig(configPath: string) { try { - const fullPath = path.join(process.cwd(), configPath) - const loadedConfig = jiti(fullPath) - const config = loadedConfig.default ?? loadedConfig + const fullPath = path.join(process.cwd(), configPath); + const loadedConfig = jiti(fullPath); + const config = loadedConfig.default ?? loadedConfig; if (!ConfigManager.isValidConfig(config)) { - throw new Error('Invalid config file.') + throw new Error("Invalid config file."); } - this.#config = config - } - catch (error: any) { - defaultLogger.error(error) - throw new Error('Failed to load a valid config file. Please check the logs for more details.') + this.#config = config; + } catch (error: any) { + defaultLogger.error(error); + throw new Error( + "Failed to load a valid config file. Please check the logs for more details." + ); } } static #isNonEmptyString(value: any): boolean { - return typeof value === 'string' && value.length > 0 + return typeof value === "string" && value.length > 0; } static #isString(value: any): boolean { - return typeof value === 'string' + return typeof value === "string"; } - static #validateTags(tags: DeployConfig['tags'], keyName: string): boolean { - const isValid = 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 #validateTags(tags: DeployConfig["tags"], keyName: string): boolean { + const isValid = + 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) + )); if (!isValid) { - throw new Error(`Invalid tags configuration for "${keyName}": \n${jsonStringify(tags)}`) + throw new Error( + `Invalid tags configuration for "${keyName}": \n${jsonStringify(tags)}` + ); } - return true + return true; } - static #validateRetry(retry: DeployConfig['retry'], keyName: string): boolean { - const isValid = 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 #validateRetry( + retry: DeployConfig["retry"], + keyName: string + ): boolean { + const isValid = + 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))); if (!isValid) { - throw new Error(`Invalid retry configuration for "${keyName}": \n${jsonStringify(retry)}`) + throw new Error( + `Invalid retry configuration for "${keyName}": \n${jsonStringify(retry)}` + ); } - return true + return true; } - static #validateServices(services: DeployConfig['services'], keyName: string): boolean { - const isValid = services === undefined || ( - typeof services === 'object' - && (services.gatewayUrl === undefined || isUrl(services?.gatewayUrl)) - && (services.cuUrl === undefined || isUrl(services?.cuUrl)) - && (services.muUrl === undefined || isUrl(services?.muUrl)) - ) + static #validateServices( + services: DeployConfig["services"], + keyName: string + ): boolean { + const isValid = + services === undefined || + (typeof services === "object" && + (services.gatewayUrl === undefined || isUrl(services?.gatewayUrl)) && + (services.cuUrl === undefined || isUrl(services?.cuUrl)) && + (services.muUrl === undefined || isUrl(services?.muUrl))); if (!isValid) { - throw new Error(`Invalid services configuration for "${keyName}": \n${jsonStringify(services)}`) + throw new Error( + `Invalid services configuration for "${keyName}": \n${jsonStringify(services)}` + ); } - return true + return true; } - static #validateOptionalProps(deployConfig: DeployConfig, keyName: string): void { - const optionalAddressProps: (keyof DeployConfig)[] = ['module', 'scheduler', 'processId'] - const optionalStringProps: (keyof DeployConfig)[] = ['name', 'configName', 'luaPath', 'wallet', 'outDir'] + static #validateOptionalProps( + deployConfig: DeployConfig, + keyName: string + ): void { + const optionalAddressProps: (keyof DeployConfig)[] = [ + "module", + "scheduler", + "processId" + ]; + const optionalStringProps: (keyof DeployConfig)[] = [ + "name", + "configName", + "luaPath", + "wallet", + "outDir" + ]; optionalAddressProps.forEach((prop) => { if (deployConfig[prop] && !isArweaveAddress(deployConfig[prop])) { - throw new Error(`Invalid optional property "${prop}" in configuration for "${keyName}": ${jsonStringify(deployConfig[prop])}`) + throw new Error( + `Invalid optional property "${prop}" in configuration for "${keyName}": ${jsonStringify(deployConfig[prop])}` + ); } - }) + }); optionalStringProps.forEach((prop) => { if (deployConfig[prop] && !this.#isString(deployConfig[prop])) { - throw new Error(`Invalid optional property "${prop}" in configuration for "${keyName}": ${jsonStringify(deployConfig[prop])}`) + throw new Error( + `Invalid optional property "${prop}" in configuration for "${keyName}": ${jsonStringify(deployConfig[prop])}` + ); } - }) + }); } 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) { - throw new Error('Config is missing or invalid.') + if ( + !config || + typeof config !== "object" || + Object.keys(config).length === 0 + ) { + throw new Error("Config is missing or invalid."); } // Check if every entry in the object values has a 'contractPath' return Object.entries(config).every(([name, deployConfig]) => { - if (!deployConfig || typeof deployConfig !== 'object' || Object.keys(deployConfig).length === 0) { - throw new Error(`Invalid configuration for "${name}": \n${jsonStringify(deployConfig)}`) + if ( + !deployConfig || + typeof deployConfig !== "object" || + Object.keys(deployConfig).length === 0 + ) { + throw new Error( + `Invalid configuration for "${name}": \n${jsonStringify(deployConfig)}` + ); } if (!isLuaFile(deployConfig.contractPath)) { - throw new Error(`A "*.lua" file is required for "contractPath" in configuration for "${name}".`) + throw new Error( + `A "*.lua" file is required for "contractPath" in configuration for "${name}".` + ); } - this.#validateOptionalProps(deployConfig, name) - this.#validateTags(deployConfig.tags, name) - this.#validateRetry(deployConfig.retry, name) - this.#validateServices(deployConfig.services, name) + this.#validateOptionalProps(deployConfig, name); + this.#validateTags(deployConfig.tags, name); + this.#validateRetry(deployConfig.retry, name); + this.#validateServices(deployConfig.services, name); if (deployConfig.cron && !isCronPattern(deployConfig.cron)) { - throw new Error(`Invalid cron value in configuration for "${name}": ${jsonStringify(deployConfig.cron)}`) + throw new Error( + `Invalid cron value in configuration for "${name}": ${jsonStringify(deployConfig.cron)}` + ); } - if (deployConfig.sqlite !== undefined && typeof deployConfig.sqlite !== 'boolean') { - throw new Error(`Invalid sqlite value in configuration for "${name}": ${jsonStringify(deployConfig.sqlite)}`) + if ( + deployConfig.sqlite !== undefined && + typeof deployConfig.sqlite !== "boolean" + ) { + throw new Error( + `Invalid sqlite value in configuration for "${name}": ${jsonStringify(deployConfig.sqlite)}` + ); } - return true - }) + return true; + }); } getConfig() { - return this.#config + return this.#config; } getConfigFromNames(keys: string[]) { if (keys.length === 0) { - return this.#config + return this.#config; } - return Object.fromEntries(Object.entries(this.#config).filter(([key, _]) => keys.includes(key))) + 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) + 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(`No matching configurations found for "${deploy}". Please verify the configuration names.`) + throw new Error( + `No matching configurations found for "${deploy}". Please verify the configuration names.` + ); } - return Object.entries(config).map(([name, config]) => ({ ...config, configName: name })) + return Object.entries(config).map(([name, config]) => ({ + ...config, + configName: name + })); } } @@ -165,8 +240,10 @@ export class ConfigManager { */ export function defineConfig(config: Config) { if (!ConfigManager.isValidConfig(config)) { - throw new Error('Invalid config file loaded. Please check the logs for more details.') + throw new Error( + "Invalid config file loaded. Please check the logs for more details." + ); } - return config + return config; } diff --git a/src/lib/deploy.ts b/src/lib/deploy.ts index c832fa1..653582e 100644 --- a/src/lib/deploy.ts +++ b/src/lib/deploy.ts @@ -1,8 +1,8 @@ -import * as aoconnect from '@permaweb/aoconnect' -import pLimit from 'p-limit' -import type { AosConfig, DeployConfig, DeployResult, Services } from '../types' -import { Wallet } from './wallet' -import { LuaProjectLoader } from './loader' +import * as aoconnect from "@permaweb/aoconnect"; +import pLimit from "p-limit"; +import type { AosConfig, DeployConfig, DeployResult, Services } from "../types"; +import { Wallet } from "./wallet"; +import { LuaProjectLoader } from "./loader"; import { AOS_QUERY, APP_NAME, @@ -13,98 +13,103 @@ import { isUrl, parseToInt, retryWithDelay, - sleep, -} from './utils' -import { Logger } from './logger' + sleep +} from "./utils"; +import { Logger } from "./logger"; /** * Manages deployments of contracts to AO. */ export class DeploymentsManager { - #cachedAosConfig: AosConfig | null = null + #cachedAosConfig: AosConfig | null = null; #validateServices(services?: Services) { // Validate and use provided URLs or fall back to defaults - const { gatewayUrl, cuUrl, muUrl } = services ?? {} + const { gatewayUrl, cuUrl, muUrl } = services ?? {}; services = { gatewayUrl: isUrl(gatewayUrl) ? gatewayUrl : defaultServices.gatewayUrl, cuUrl: isUrl(cuUrl) ? cuUrl : defaultServices.cuUrl, - muUrl: isUrl(muUrl) ? muUrl : defaultServices.muUrl, - } + muUrl: isUrl(muUrl) ? muUrl : defaultServices.muUrl + }; - return services + return services; } #getAoInstance(services: Services) { if ( - (!services.cuUrl || services.cuUrl === defaultServices.cuUrl) - && (!services.gatewayUrl || services.gatewayUrl === defaultServices.gatewayUrl) - && (!services.muUrl || services.muUrl === defaultServices.muUrl) + (!services.cuUrl || services.cuUrl === defaultServices.cuUrl) && + (!services.gatewayUrl || + services.gatewayUrl === defaultServices.gatewayUrl) && + (!services.muUrl || services.muUrl === defaultServices.muUrl) ) { - return aoconnect + return aoconnect; } return aoconnect.connect({ GATEWAY_URL: services.gatewayUrl, MU_URL: services.muUrl, - CU_URL: services.cuUrl, - }) + CU_URL: services.cuUrl + }); } async #getAosConfig() { if (this.#cachedAosConfig) { - return this.#cachedAosConfig + return this.#cachedAosConfig; } const defaultDetails = { - module: 'cNlipBptaF9JeFAf4wUmpi43EojNanIBos3EfNrEOWo', - sqliteModule: 'u1Ju_X8jiuq4rX9Nh-ZGRQuYQZgV2MKLMT3CZsykk54', - scheduler: '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA', - authority: 'fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY', - } + module: "cNlipBptaF9JeFAf4wUmpi43EojNanIBos3EfNrEOWo", + sqliteModule: "u1Ju_X8jiuq4rX9Nh-ZGRQuYQZgV2MKLMT3CZsykk54", + scheduler: "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA", + authority: "fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY" + }; try { - const response = await fetch('https://raw.githubusercontent.com/pawanpaudel93/ao-deploy-config/main/config.json') - const config = await response.json() as AosConfig + const response = await fetch( + "https://raw.githubusercontent.com/pawanpaudel93/ao-deploy-config/main/config.json" + ); + const config = (await response.json()) as AosConfig; this.#cachedAosConfig = { module: config?.module || defaultDetails.module, sqliteModule: config?.sqliteModule || defaultDetails.sqliteModule, scheduler: config?.scheduler || defaultDetails.scheduler, - authority: defaultDetails.authority, - } - return this.#cachedAosConfig - } - catch { - return defaultDetails + authority: defaultDetails.authority + }; + return this.#cachedAosConfig; + } catch { + return defaultDetails; } } - async #findProcess(name: string, owner: string, retry: DeployConfig['retry'], gateway: string) { + async #findProcess( + name: string, + owner: string, + retry: DeployConfig["retry"], + gateway: string + ) { const processId = await retryWithDelay( async () => { - const res = await getArweave(gateway) - .api - .post('/graphql', { - query: AOS_QUERY, - variables: { owners: [owner], names: [name] }, - }) + const res = await getArweave(gateway).api.post("/graphql", { + query: AOS_QUERY, + variables: { owners: [owner], names: [name] } + }); if (!res.ok || res?.data?.data === null) { - throw new Error(`(${res.status}) ${res.statusText} - GraphQL ERROR`) + throw new Error(`(${res.status}) ${res.statusText} - GraphQL ERROR`); } - return res?.data?.data?.transactions?.edges?.[0]?.node?.id + return res?.data?.data?.transactions?.edges?.[0]?.node?.id; }, retry?.count, - retry?.delay, - ) + retry?.delay + ); - return processId + return processId; } #validateCron(cron: string) { - const isCronValid = isCronPattern(cron) + const isCronValid = isCronPattern(cron); if (!isCronValid) { - throw new Error('Invalid cron flag!') + throw new Error("Invalid cron flag!"); } } @@ -113,103 +118,131 @@ export class DeploymentsManager { * @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, sqlite, services }: DeployConfig): Promise { - name = name || 'default' - configName = configName || name - retry = { count: parseToInt(retry?.count, 10), delay: parseToInt(retry?.delay, 3000) } + async deployContract({ + name, + wallet, + contractPath, + tags, + cron, + module, + scheduler, + retry, + luaPath, + configName, + processId, + sqlite, + services + }: DeployConfig): Promise { + name = name || "default"; + configName = configName || name; + retry = { + count: parseToInt(retry?.count, 10), + delay: parseToInt(retry?.delay, 3000) + }; - const logger = new Logger(configName) - const aosConfig = await this.#getAosConfig() - module = isArweaveAddress(module) ? module! : sqlite ? aosConfig.sqliteModule : aosConfig.module - scheduler = isArweaveAddress(scheduler) ? scheduler! : aosConfig.scheduler + const logger = new Logger(configName); + const aosConfig = await this.#getAosConfig(); + module = isArweaveAddress(module) + ? module! + : sqlite + ? aosConfig.sqliteModule + : aosConfig.module; + scheduler = isArweaveAddress(scheduler) ? scheduler! : aosConfig.scheduler; - const walletInstance = await Wallet.load(wallet) - const owner = await walletInstance.getAddress() - const signer = aoconnect.createDataItemSigner(walletInstance.jwk) - services = this.#validateServices(services) + const walletInstance = await Wallet.load(wallet); + const owner = await walletInstance.getAddress(); + const signer = aoconnect.createDataItemSigner(walletInstance.jwk); + services = this.#validateServices(services); // Initialize the AO instance with validated URLs - const aoInstance = this.#getAoInstance(services) + const aoInstance = this.#getAoInstance(services); if (!processId || (processId && !isArweaveAddress(processId))) { - processId = await this.#findProcess(name, owner, retry, services.gatewayUrl!) + processId = await this.#findProcess( + name, + owner, + retry, + services.gatewayUrl! + ); } - const isNewProcess = !processId + const isNewProcess = !processId; if (!processId) { - logger.log('Spawning new process...', false, true) - tags = Array.isArray(tags) ? tags : [] + logger.log("Spawning new process...", false, true); + tags = Array.isArray(tags) ? tags : []; tags = [ - { name: 'App-Name', value: APP_NAME }, - { name: 'Name', value: name }, - { name: 'aos-Version', value: 'REPLACE-AO-DEPLOY-VERSION' }, - { name: 'Authority', value: aosConfig.authority }, - ...tags, - ] + { name: "App-Name", value: APP_NAME }, + { name: "Name", value: name }, + { name: "aos-Version", value: "REPLACE-AO-DEPLOY-VERSION" }, + { name: "Authority", value: aosConfig.authority }, + ...tags + ]; if (cron) { - this.#validateCron(cron) - tags = [...tags, { name: 'Cron-Interval', value: cron }, { name: 'Cron-Tag-Action', value: 'Cron' }] + this.#validateCron(cron); + tags = [ + ...tags, + { name: "Cron-Interval", value: cron }, + { name: "Cron-Tag-Action", value: "Cron" } + ]; } - const data = '1984' + const data = "1984"; processId = await retryWithDelay( () => aoInstance.spawn({ module, signer, tags, data, scheduler }), retry.count, - retry.delay, - ) - await sleep(1000) - } - else { - logger.log('Updating existing process...', false, true) + retry.delay + ); + await sleep(1000); + } else { + logger.log("Updating existing process...", false, true); } - const loader = new LuaProjectLoader(configName, luaPath) - const contractSrc = await loader.loadContract(contractPath) + const loader = new LuaProjectLoader(configName, luaPath); + const contractSrc = await loader.loadContract(contractPath); - logger.log(`Deploying: ${contractPath}`, false, true) + logger.log(`Deploying: ${contractPath}`, false, true); // Load contract to process const messageId = await retryWithDelay( async () => aoInstance.message({ process: processId, - tags: [{ name: 'Action', value: 'Eval' }], + tags: [{ name: "Action", value: "Eval" }], data: contractSrc, - signer, + signer }), retry.count, - retry.delay, - ) + retry.delay + ); const { Output, Error: error } = await retryWithDelay( - async () => aoInstance.result({ - process: processId, - message: messageId, - }), + async () => + aoInstance.result({ + process: processId, + message: messageId + }), retry.count, - retry.delay, - ) + retry.delay + ); - let errorMessage = null + let errorMessage = null; if (Output?.data?.output) { - errorMessage = Output.data.output - } - else if (error) { - if (typeof error === 'object' && Object.keys(error).length > 0) { - errorMessage = JSON.stringify(error) - } - else { - errorMessage = String(error) + errorMessage = Output.data.output; + } else if (error) { + if (typeof error === "object" && Object.keys(error).length > 0) { + errorMessage = JSON.stringify(error); + } else { + errorMessage = String(error); } } if (errorMessage) { - throw new Error(errorMessage) + throw new Error(errorMessage); } - return { name, processId, messageId, isNewProcess, configName } + return { name, processId, messageId, isNewProcess, configName }; } /** @@ -218,11 +251,16 @@ export class DeploymentsManager { * @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 + 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; } } @@ -231,9 +269,11 @@ export class DeploymentsManager { * @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) +export async function deployContract( + deployConfig: DeployConfig +): Promise { + const manager = new DeploymentsManager(); + return manager.deployContract(deployConfig); } /** @@ -242,7 +282,10 @@ export async function deployContract(deployConfig: DeployConfig): 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) +export async function deployContracts( + deployConfigs: DeployConfig[], + concurrency: number = 5 +): Promise[]> { + const manager = new DeploymentsManager(); + return manager.deployContracts(deployConfigs, concurrency); } diff --git a/src/lib/loader.ts b/src/lib/loader.ts index ba873de..37ae0ae 100644 --- a/src/lib/loader.ts +++ b/src/lib/loader.ts @@ -6,207 +6,242 @@ * 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' +import chalk from "chalk"; +import { exec } from "node:child_process"; +import { constants, promises as fs } from "node:fs"; +import path from "node:path"; +import process from "node:process"; +import util from "node:util"; +import pLimit from "p-limit"; // @ts-expect-error types missing -import createFileTree from 'pretty-file-tree' -import chalk from 'chalk' -import pLimit from 'p-limit' -import type { BundleResult, BundlingConfig, Module } from '../types' -import { Logger } from './logger' -import { writeFileToProjectDir } from './utils' +import createFileTree from "pretty-file-tree"; +import type { BundleResult, BundlingConfig, Module } from "../types"; +import { Logger } from "./logger"; +import { writeFileToProjectDir } from "./utils"; -const execAsync = util.promisify(exec) +const execAsync = util.promisify(exec); export class LuaProjectLoader { - #luaPath: string - #logger: Logger + #luaPath: string; + #logger: Logger; constructor(name: string, luaPath?: string) { - this.#luaPath = luaPath || '' - this.#logger = Logger.init(name) + 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 + 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`) + const modPath = path.join(cwd, `${module.replace(/\./g, "/")}.lua`); if (await this.#fileExists(modPath)) { - return modPath + return modPath; } - const luaCode = `print(package.searchpath('${module}', package.path .. ';' .. '${this.#luaPath}'))` - const command = `lua -e "${luaCode}"` + const luaCode = `print(package.searchpath('${module}', package.path .. ';' .. '${this.#luaPath}'))`; + const command = `lua -e "${luaCode}"`; - const { stdout, stderr } = await execAsync(command) + const { stdout, stderr } = await execAsync(command); if (stderr) { - return + return; } if (stdout) { - const potentialPath = stdout.trim() + const potentialPath = stdout.trim(); if (await this.#fileExists(potentialPath)) { - return potentialPath + return potentialPath; } } + } catch { + /* empty */ } - catch { } } #createExecutableFromProject(project: Module[]) { - const getModFnName = (name: string) => name.replace(/\./g, '_').replace(/^_/, '') - const contents: { name: string, path: string, code: string }[] = [] + 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)}()` + 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, - }) + code: moduleContent + requireMapper + }); } - return contents.reduce((acc, con) => `${acc}\n\n${con.code}`, '') + return contents.reduce((acc, con) => `${acc}\n\n${con.code}`, ""); } #topologicalSort(moduleMap: Map) { - const visited = new Set() - const result: Module[] = [] + const visited = new Set(); + const result: Module[] = []; function visit(modName: string) { if (visited.has(modName)) { - return + return; } - const mod = moduleMap.get(modName) + const mod = moduleMap.get(modName); if (!mod) { - throw new Error(`Module ${modName} is not found in the module map.`) + throw new Error(`Module ${modName} is not found in the module map.`); } - visited.add(modName) - mod.dependencies?.forEach(depName => visit(depName)) - result.push(mod) + visited.add(modName); + mod.dependencies?.forEach((depName) => visit(depName)); + result.push(mod); } - moduleMap.forEach((_, modName) => visit(modName)) + moduleMap.forEach((_, modName) => visit(modName)); - return result + return result; } async #createProjectStructure(mainFile: string, cwd: string) { - // initial set of modules - const modules = await this.#findRequires(mainFile, cwd) + // 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])) + 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) { + 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) + 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) + moduleMap.set(requirement.name, requirement); } - mod.dependencies = (mod.dependencies || new Set()).add(requirement.name) + mod.dependencies = (mod.dependencies || new Set()).add( + requirement.name + ); } } } // Perform a topological sort based on dependencies - const sortedModules = this.#topologicalSort(moduleMap) + const sortedModules = this.#topologicalSort(moduleMap); // Filter out modules without content (if any) - return sortedModules.filter(mod => mod.content) + return sortedModules.filter((mod) => mod.content); } async #findRequires(data: string, cwd: string): Promise { - // eslint-disable-next-line regexp/no-super-linear-backtracking - const requirePattern = /(?<=(require( *)(\n*)(\()?( *)("|'))).*(?=("|'))/g - const requiredModules = (data.match(requirePattern) || []).map(async (mod) => { - const modPath = await this.#getModulePath(mod, cwd) + 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 modPath + ? { name: mod, path: modPath, content: undefined } + : null; + } + ); - return (await Promise.all(requiredModules)).filter(m => !!m) as Module[] + return (await Promise.all(requiredModules)).filter((m) => !!m) as Module[]; } async loadContract(contractPath: string) { if (/\.lua$/.test(contractPath)) { - let filePath = contractPath + let filePath = contractPath; if (!path.isAbsolute(filePath)) { - filePath = path.resolve(path.join(process.cwd(), contractPath)) + filePath = path.resolve(path.join(process.cwd(), contractPath)); } if (!(await this.#fileExists(filePath))) { - throw new Error(chalk.red(`${filePath} file not found.`)) + throw new Error(chalk.red(`${filePath} file not found.`)); } - this.#logger.log(`Loading: ${contractPath}`, false, true) - let line = await fs.readFile(filePath, 'utf-8') + this.#logger.log(`Loading: ${contractPath}`, false, true); + let line = await fs.readFile(filePath, "utf-8"); - this.#logger.log(`Parsing contract structure...`, false, true) + this.#logger.log(`Parsing contract structure...`, false, true); - const projectStructure = await this.#createProjectStructure(line, path.dirname(filePath)) + 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 loaded:`), false, true) - console.log(chalk.dim(createFileTree([...projectStructure.map(m => m.path), `${filePath} ${chalk.reset(chalk.bgGreen(' MAIN '))}`]))) - console.log('') + line = `${this.#createExecutableFromProject(projectStructure)}\n\n${line}`; + + this.#logger.log( + chalk.yellow(`The following files will be loaded:`), + 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('A `*.lua` file is required.')) + return line.trim(); + } else { + throw new Error(chalk.red("A `*.lua` file is required.")); } } async loadAndBundleContract(config: BundlingConfig): Promise { try { - const contractSrc = await this.loadContract(config.contractPath) - await writeFileToProjectDir(contractSrc, config.outDir, config.name) + const contractSrc = await this.loadContract(config.contractPath); + await writeFileToProjectDir(contractSrc, config.outDir, config.name); return { configName: config.name, outDir: config.outDir, size: new TextEncoder().encode(contractSrc).length, - name: config.name, - } - } - catch { - throw new Error(chalk.red(`Failed to load and bundle contract at: ${config.contractPath}`)) + name: config.name + }; + } catch { + throw new Error( + chalk.red( + `Failed to load and bundle contract at: ${config.contractPath}` + ) + ); } } } -export async function loadAndBundleContracts(configs: BundlingConfig[], concurrency: number = 5): Promise[]> { - const limit = pLimit(concurrency) - const promises = configs.map(config => limit(() => { - const loader = new LuaProjectLoader(config.name, config.luaPath) +export async function loadAndBundleContracts( + configs: BundlingConfig[], + concurrency: number = 5 +): Promise[]> { + const limit = pLimit(concurrency); + const promises = configs.map((config) => + limit(() => { + const loader = new LuaProjectLoader(config.name, config.luaPath); - return loader.loadAndBundleContract(config) - })) + return loader.loadAndBundleContract(config); + }) + ); - return await Promise.allSettled(promises) + return await Promise.allSettled(promises); } diff --git a/src/lib/logger.ts b/src/lib/logger.ts index 66f5040..f94c5f3 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -1,54 +1,81 @@ -import chalk from 'chalk' -import { APP_NAME } from './utils' +import chalk from "chalk"; +import { APP_NAME } from "./utils"; export class Logger { - static #instances: Map = new Map() - #name: string + static #instances: Map = new Map(); + #name: string; constructor(name: string) { - this.#name = name + this.#name = name; } static #getInstance(name: string): Logger { if (!Logger.#instances.has(name)) { - Logger.#instances.set(name, new Logger(name)) + Logger.#instances.set(name, new Logger(name)); } - return Logger.#instances.get(name)! + return Logger.#instances.get(name)!; } static init(name: string) { - return this.#getInstance(name) + return this.#getInstance(name); } #logMessage(message: string, prefixNewLine: boolean, suffixNewLine: boolean) { - const prefix = prefixNewLine ? '\n' : '' - const suffix = suffixNewLine ? '\n' : '' - console.log(`${prefix}${message}${suffix}`) + 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) + 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) + 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) + 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 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 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) + static error( + name: string, + message: string, + prefixNewLine = false, + suffixNewLine = false + ) { + this.#getInstance(name).error(message, prefixNewLine, suffixNewLine); } } -export const defaultLogger = Logger.init(APP_NAME) +export const defaultLogger = Logger.init(APP_NAME); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 5de8b56..8e98ba0 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,20 +1,20 @@ -import path from 'node:path' -import process from 'node:process' -import { writeFile } from 'node:fs/promises' -import { existsSync, mkdirSync, rmSync } from 'node:fs' -import { URL } from 'node:url' -import Arweave from 'arweave' +import Arweave from "arweave"; +import { existsSync, mkdirSync, rmSync } from "node:fs"; +import { writeFile } from "node:fs/promises"; +import path from "node:path"; +import process from "node:process"; +import { URL } from "node:url"; -export const APP_NAME = 'ao-deploy' +export const APP_NAME = "ao-deploy"; /** * Initializes a default Arweave instance. */ export const arweave = Arweave.init({ - host: 'arweave.net', + host: "arweave.net", port: 443, - protocol: 'https', -}) + protocol: "https" +}); /** * Parses a gateway URL and returns an object containing the host, port, and protocol. @@ -22,13 +22,17 @@ export const arweave = Arweave.init({ * @param url - The gateway URL to be parsed. * @returns An object with the host, port, and protocol of the URL. */ -function parseGatewayUrl(url: string): { host: string, port: number, protocol: string } { - const parsedUrl = new URL(url) +function parseGatewayUrl(url: string): { + host: string; + port: number; + protocol: string; +} { + const parsedUrl = new URL(url); return { host: parsedUrl.hostname, port: parsedUrl.port ? Number.parseInt(parsedUrl.port, 10) : 443, - protocol: parsedUrl.protocol.replace(':', ''), - } + protocol: parsedUrl.protocol.replace(":", "") + }; } /** @@ -39,20 +43,19 @@ function parseGatewayUrl(url: string): { host: string, port: number, protocol: s */ export function getArweave(gateway: string) { try { - const { host, port, protocol } = parseGatewayUrl(gateway) - return Arweave.init({ host, port, protocol }) - } - catch { - return arweave + const { host, port, protocol } = parseGatewayUrl(gateway); + return Arweave.init({ host, port, protocol }); + } catch { + return arweave; } } export function isArweaveAddress(address: any): boolean { - return typeof address === 'string' && /^[\w-]{43}$/.test(address) + return typeof address === "string" && /^[\w-]{43}$/.test(address); } export async function sleep(delay: number = 3000) { - return new Promise((resolve, _) => setTimeout(resolve, delay)) + return new Promise((resolve) => setTimeout(resolve, delay)); } /** @@ -65,56 +68,58 @@ export async function sleep(delay: number = 3000) { export async function retryWithDelay( fn: () => Promise, maxAttempts: number = 3, - delay: number = 1000, + delay: number = 1000 ): Promise { - let attempts = 0 + let attempts = 0; const attempt = async (): Promise => { try { - return await fn() - } - catch (error) { - attempts += 1 + 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 new Promise((resolve) => + setTimeout(() => resolve(attempt()), delay) + ); + } else { + throw error; } } - } + }; - return attempt() + return attempt(); } -export async function writeFileToProjectDir(data: string, outDir: string, fileName: string) { +export async function writeFileToProjectDir( + data: string, + outDir: string, + fileName: string +) { try { - const fullPath = path.join(process.cwd(), `${outDir}/${fileName}.lua`) - const dirName = path.dirname(fullPath) + const fullPath = path.join(process.cwd(), `${outDir}/${fileName}.lua`); + const dirName = path.dirname(fullPath); if (!existsSync(dirName)) { - mkdirSync(dirName) + mkdirSync(dirName); } - await writeFile(fullPath, data) - } - catch { - throw new Error(`Failed to write bundle to ${outDir}`) + await writeFile(fullPath, data); + } catch { + throw new Error(`Failed to write bundle to ${outDir}`); } } export async function clearBuildOutDir(outDir: string) { try { - const fullPath = path.join(process.cwd(), `${outDir}`) - const dirName = path.dirname(fullPath) + const fullPath = path.join(process.cwd(), `${outDir}`); + const dirName = path.dirname(fullPath); if (!existsSync(dirName)) { - return true + return true; } - rmSync(outDir, { recursive: true, force: true }) - } - catch { - throw new Error(`Failed to clear ${outDir}`) + rmSync(outDir, { recursive: true, force: true }); + } catch { + throw new Error(`Failed to clear ${outDir}`); } } @@ -126,15 +131,14 @@ export async function clearBuildOutDir(outDir: string) { */ export function isUrl(url?: string): boolean { try { - if (!url || typeof url !== 'string') { - return false + if (!url || typeof url !== "string") { + return false; } // eslint-disable-next-line no-new - new URL(url) - return true - } - catch { - return false + new URL(url); + return true; + } catch { + return false; } } @@ -146,15 +150,18 @@ export function isUrl(url?: string): boolean { * @param defaultValue - The default value to return if parsing fails. * @returns The parsed integer or the default value if parsing fails. */ -export function parseToInt(value: string | number | undefined, defaultValue: number): number { +export function parseToInt( + value: string | number | undefined, + defaultValue: number +): number { if (value === undefined) { - return defaultValue + return defaultValue; } - const parsedValue = Number.parseInt(value.toString()) + const parsedValue = Number.parseInt(value.toString()); if (Number.isNaN(parsedValue)) { - return defaultValue + return defaultValue; } - return parsedValue + return parsedValue; } /** @@ -165,45 +172,48 @@ export function parseToInt(value: string | number | undefined, defaultValue: num * @param defaultValue - The default value to return if the URL is not valid. * @returns The URL if valid, or the default value if the URL is not valid. */ -export function parseUrl(value: string | undefined, defaultValue: string): string { +export function parseUrl( + value: string | undefined, + defaultValue: string +): string { if (value === undefined) { - return defaultValue + return defaultValue; } - const urlValid = isUrl(value) + const urlValid = isUrl(value); if (!urlValid) { - return defaultValue + return defaultValue; } - return value + return value; } export const defaultServices = { - gatewayUrl: 'https://arweave.net', - cuUrl: 'https://cu.ao-testnet.xyz', - muUrl: 'https://mu.ao-testnet.xyz', -} + gatewayUrl: "https://arweave.net", + cuUrl: "https://cu.ao-testnet.xyz", + muUrl: "https://mu.ao-testnet.xyz" +}; export function jsonStringify(value?: any): string { try { - return JSON.stringify(value, null, 2) - } - catch { - return value + return JSON.stringify(value, null, 2); + } catch { + return value; } } export function isLuaFile(fileName: string): boolean { if (!fileName) { - return false + return false; } - return fileName.toLowerCase().endsWith('.lua') + return fileName.toLowerCase().endsWith(".lua"); } export function isCronPattern(cron: string): boolean { if (!cron) { - return false + return false; } - const cronRegex = /^\d+-(?:Second|second|Minute|minute|Hour|hour|Day|day|Month|month|Year|year|Block|block)s?$/ - return cronRegex.test(cron) + const cronRegex = + /^\d+-(?:Second|second|Minute|minute|Hour|hour|Day|day|Month|month|Year|year|Block|block)s?$/; + return cronRegex.test(cron); } export const AOS_QUERY = `query ($owners: [String!]!, $names: [String!]!) { @@ -222,4 +232,4 @@ export const AOS_QUERY = `query ($owners: [String!]!, $names: [String!]!) { } } } - }` + }`; diff --git a/src/lib/wallet.ts b/src/lib/wallet.ts index 0c33ecb..15b29a8 100644 --- a/src/lib/wallet.ts +++ b/src/lib/wallet.ts @@ -1,14 +1,14 @@ -import fs from 'node:fs' -import path from 'node:path' -import os from 'node:os' -import type { JWKInterface } from 'arweave/node/lib/wallet' -import { arweave } from './utils' +import fs from "node:fs"; +import path from "node:path"; +import os from "node:os"; +import type { JWKInterface } from "arweave/node/lib/wallet"; +import { arweave } from "./utils"; export class Wallet { - #jwk: JWKInterface + #jwk: JWKInterface; constructor(jwk: JWKInterface) { - this.#jwk = jwk + this.#jwk = jwk; } /** @@ -17,55 +17,61 @@ export class Wallet { * @returns {boolean} True if it's a valid Arweave JWK, otherwise false. */ static isJwk(obj: any): boolean { - if (typeof obj !== 'object') { - return false + if (typeof obj !== "object") { + return false; } - const requiredKeys = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi'] - return requiredKeys.every(key => key in obj) + 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') + throw new Error("Wallet not loaded yet"); } } - static async getWallet(jwkOrPath?: fs.PathOrFileDescriptor | JWKInterface): Promise { + static async getWallet( + jwkOrPath?: fs.PathOrFileDescriptor | JWKInterface + ): Promise { try { if (!jwkOrPath) { - throw new Error('Wallet not specified') + throw new Error("Wallet not specified"); } if (this.isJwk(jwkOrPath)) { - return jwkOrPath as JWKInterface + return jwkOrPath as JWKInterface; } - const jwk = fs.readFileSync(jwkOrPath as string, 'utf8') - return JSON.parse(jwk) - } - catch { + const jwk = fs.readFileSync(jwkOrPath as string, "utf8"); + return JSON.parse(jwk); + } catch { if (fs.existsSync(path.resolve(`${os.homedir()}/.aos.json`))) { - return JSON.parse(fs.readFileSync(path.resolve(`${os.homedir()}/.aos.json`), 'utf-8')) + return JSON.parse( + fs.readFileSync(path.resolve(`${os.homedir()}/.aos.json`), "utf-8") + ); } - const wallet = await arweave.wallets.generate() - fs.writeFileSync(path.resolve(`${os.homedir()}/.aos.json`), JSON.stringify(wallet)) - return wallet + const wallet = await arweave.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) + const jwk = await this.getWallet(jwkOrPath); + return new Wallet(jwk); } async getAddress() { - this.#checkIfWalletLoaded() - return await arweave.wallets.getAddress(this.#jwk) + this.#checkIfWalletLoaded(); + return await arweave.wallets.getAddress(this.#jwk); } get jwk() { - this.#checkIfWalletLoaded() - return this.#jwk + this.#checkIfWalletLoaded(); + return this.#jwk; } } diff --git a/src/types/index.ts b/src/types/index.ts index ef4df04..98d2faa 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,27 +1,30 @@ -import type { JWKInterface } from 'arweave/node/lib/wallet' +import type { JWKInterface } from "arweave/node/lib/wallet"; -export type ConfigName = string +export type ConfigName = string; -export interface Tag { name: string, value: string } +export interface Tag { + name: string; + value: string; +} export interface Services { /** * The URL of the desired Gateway. * @default "https://arweave.net" */ - gatewayUrl?: string + gatewayUrl?: string; /** * The URL of the desired AO Compute Unit. * @default "https://cu.ao-testnet.xyz" */ - cuUrl?: string + cuUrl?: string; /** * The URL of the desired AO Messenger Unit. * @default "https://mu.ao-testnet.xyz" */ - muUrl?: string + muUrl?: string; } export interface DeployConfig { @@ -29,49 +32,49 @@ export interface DeployConfig { * Process name to spawn * @default "default" */ - name?: string + name?: string; /** * Config name used for logging */ - configName?: string + configName?: string; /** * Path to contract main file */ - contractPath: string + contractPath: string; /** * The module source to use to spin up Process * @default "Fetches from `https://raw.githubusercontent.com/pawanpaudel93/ao-deploy-config/main/config.json`" */ - module?: string + module?: string; /** * Scheduler to use for Process * @default "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" */ - scheduler?: string + scheduler?: string; /** * Additional tags to use for spawning Process */ - tags?: Tag[] + tags?: Tag[]; /** * Cron interval to use for Process i.e (1-minute, 5-minutes) */ - cron?: string + cron?: string; /** * Wallet path or JWK itself */ - wallet?: JWKInterface | string + wallet?: JWKInterface | string; /** * lua path to find the lua modules */ - luaPath?: string + luaPath?: string; /** * Retry options @@ -81,65 +84,70 @@ export interface DeployConfig { * Retry count * @default 10 */ - count?: number + count?: number; /** * Retry delay in milliseconds * @default 3000 */ - delay?: number - } + delay?: number; + }; /** * Process Id of an existing process */ - processId?: string + processId?: string; /** * Output directory of bundle */ - outDir?: string + outDir?: string; /** * Use sqlite aos module when spawning new process * @default false */ - sqlite?: boolean + sqlite?: boolean; /** * Configuration for various AO services */ - services?: Services + services?: Services; } -export type Config = Record +export type Config = Record; export interface DeployResult { - name: string - configName: string - messageId: string - processId: string - isNewProcess: boolean + name: string; + configName: string; + messageId: string; + processId: string; + isNewProcess: boolean; } export interface BundleResult { - name: string - configName: string - outDir: string - size: number + name: string; + configName: string; + outDir: string; + size: number; } export interface BundlingConfig { - name: string - contractPath: string - outDir: string - luaPath?: string + name: string; + contractPath: string; + outDir: string; + luaPath?: string; } -export interface Module { name: string, path: string, content?: string, dependencies?: Set } +export interface Module { + name: string; + path: string; + content?: string; + dependencies?: Set; +} export interface AosConfig { - module: string - sqliteModule: string - scheduler: string - authority: string + module: string; + sqliteModule: string; + scheduler: string; + authority: string; } diff --git a/test/index.test.ts b/test/index.test.ts index 401553c..8c8ddda 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it } from "vitest"; -describe('should', () => { - it('exported', () => { - expect(1).toEqual(1) - }) -}) +describe("should", () => { + it("exported", () => { + expect(1).toEqual(1); + }); +});