diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfb3abb..de6aac5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,30 +1,65 @@ -name: release and publish +name: release on: workflow_dispatch: + inputs: + mode: + type: choice + required: true + options: + - prerelease + - release + version-type: + type: choice + required: true + options: + - patch + - minor + - major + prerelease-type: + type: choice + required: true + options: + - rc + - beta + - alpha + dry-run: + type: choice + default: "" + options: + - -d + - "" + +permissions: + id-token: write + contents: write + packages: write + jobs: release: runs-on: ubuntu-latest steps: - - name: Checkout source code - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: - ref: release/latest fetch-depth: 0 - - name: Install dependencies - run: npm ci + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - - name: initialize git user + - name: git config run: | - git config --global user.email "shaadcode@gmail.com" - git config --global user.name "shaadcode" - - name: initialize the npm config - run: npm config set //registry.npmjs.org/:_authToken $NPM_TOKEN + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + + - run: bun i --frozen-lockfile + - run: bun i -g npm@latest + - if: inputs.mode == 'prerelease' + run: npm run pre-release -- -i ${{ inputs.version-type }} --preRelease=${{ inputs.prerelease-type }} ${{inputs.dry-run}} env: - NPM_TOKEN: ${{secrets.NPM_TOKEN}} - - name: Run release - run: npm run release + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - if: inputs.mode == 'release' + run: npm run release -- -i ${{ inputs.version-type }} ${{inputs.dry-run}} env: - NPM_TOKEN: ${{secrets.NPM_TOKEN}} - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.release-it.prerelease.ts b/.release-it.prerelease.ts index 257f7c9..ee39a3c 100644 --- a/.release-it.prerelease.ts +++ b/.release-it.prerelease.ts @@ -1,68 +1,85 @@ -import type { Config } from 'release-it' +import type { Config } from 'release-it'; +import { execSync } from 'child_process'; +function getCommitAuthor(commitHash: string): string { + try { + const author = execSync( + `git show -s --format="%an" ${commitHash}`, + { encoding: 'utf-8' } + ).trim(); + return author || 'unknown'; + } catch { + return 'unknown'; + } +} export default { - git: { - commitMessage: 'chore: release v${version}', - tagName: 'v${version}', - push: true, - }, - github: { - releaseName: 'v${version}', - release: true, - preRelease: true, - }, - npm: { - publish: true, - }, - plugins: { - '@release-it/conventional-changelog': { - infile: 'CHANGELOG.md', - header: '# Changelog', - preset: { - name: 'conventionalcommits', - types: [ - { - type: 'feat', - section: '🚀 Features', - hidden: false, - }, - { - type: 'fix', - section: '🐞 Bug Fixes', - hidden: false, - }, - { - type: 'chore', - section: '🧹 Chores', - hidden: false, - }, - { - type: 'docs', - section: '📚 Documentation', - hidden: false, - }, - { - type: 'refactor', - section: '🔧 Refactoring', - hidden: false, - }, - { - type: 'perf', - section: '⚡ Performance', - hidden: false, - }, - { - type: 'test', - section: '✅ Tests', - hidden: false, - }, - { - type: 'style', - section: '🎨 Styles', - hidden: false, - }, - ], - }, + git: { + requireBranch: "main" }, - }, -} satisfies Config + hooks: { + "before:init": ["git pull"] + }, + github: { + "preRelease": true, + release: true, + }, + "npm": { + "publish": true, + skipChecks: true, + publishArgs: ["--registry", "https://registry.npmjs.org/"], + }, + "plugins": { + "@release-it/conventional-changelog": { + "infile": "CHANGELOG.md", + "header": "# Changelog", + writerOpts: { + commitPartial: (ctx: any, commit: any) => { + const scope = ctx.scope + const subject = ctx.subject + const shortHash = ctx.raw.hash + const hash = ctx.hash + const owner = getCommitAuthor(hash) + const type = ctx.raw.type + return `- ${type}${scope ? `(${scope})` : ""}: ${subject} by **${owner}** in ${shortHash}\n`; + } + }, + "preset": { + "name": "conventionalcommits", + "types": [ + { + "type": "feat", + "section": "🚀 Features", + }, + { + "type": "fix", + "section": "🐞 Bug Fixes", + }, + { + "type": "chore", + "section": "🧹 Chores", + }, + { + "type": "docs", + "section": "📚 Documentation", + }, + { + "type": "refactor", + "section": "🔧 Refactoring", + }, + { + "type": "perf", + "section": "⚡ Performance", + }, + { + "type": "test", + "section": "✅ Tests", + }, + { + "type": "style", + "section": "🎨 Styles", + } + ] + } + } + } +} satisfies Config; diff --git a/.release-it.ts b/.release-it.ts index 3acfaca..e5dcb86 100644 --- a/.release-it.ts +++ b/.release-it.ts @@ -1,76 +1,86 @@ -import type { Config } from 'release-it' +import { execSync } from 'child_process'; +import type { Config } from 'release-it'; +function getCommitAuthor(commitHash: string): string { + try { + const author = execSync( + `git show -s --format="%an" ${commitHash}`, + { encoding: 'utf-8' } + ).trim(); + return author || 'unknown'; + } catch { + return 'unknown'; + } +} export default { git: { - commitMessage: 'chore: release v${version}', - tagName: 'v${version}', - push: true, - pushRepo: 'origin', - requireBranch: 'release/latest', - getLatestTagFromAllRefs: true + requireBranch: "main" }, hooks: { - 'before:init': ['git fetch --tags', 'git pull'], + "before:init": ["git pull"], }, github: { - release: true, - releaseName: 'v${version}', + "release": true, }, - npm: { - publish: true, + "npm": { + "publish": true, + skipChecks: true, + publishArgs: ["--registry", "https://registry.npmjs.org/"], + }, - plugins: { - '@release-it/conventional-changelog': { - infile: 'CHANGELOG.md', - header: '# Changelog', + "plugins": { + "@release-it/conventional-changelog": { + "infile": "CHANGELOG.md", + "header": "# Changelog", + strictSemVer: true, writerOpts: { - commitPartial: - '{{subject}}{{#if references}} in {{#each references}}#{{this.issue}}{{/each}}{{/if}} ({{shortHash}})\n', + commitPartial: (ctx: any, commit: any) => { + const scope = ctx.scope + const subject = ctx.subject + const shortHash = ctx.raw.hash + const hash = ctx.hash + const owner = getCommitAuthor(hash) + const type = ctx.raw.type + return `- ${type}${scope ? `(${scope})` : ""}: ${subject} by **${owner}** in ${shortHash}\n`; + } }, - preset: { - name: 'conventionalcommits', - types: [ + "preset": { + "name": "conventionalcommits", + "types": [ { - type: 'feat', - section: '🚀 Features', - hidden: false, + "type": "feat", + "section": "🚀 Features", }, { - type: 'fix', - section: '🐞 Bug Fixes', - hidden: false, + "type": "fix", + "section": "🐞 Bug Fixes", }, { - type: 'chore', - hidden: true, + "type": "chore", + "section": "🧹 Chores", }, { - type: 'docs', - section: '📚 Documentation', - hidden: false, + "type": "docs", + "section": "📚 Documentation", }, { - type: 'refactor', - section: '🔧 Refactoring', - hidden: false, + "type": "refactor", + "section": "🔧 Refactoring", }, { - type: 'perf', - section: '⚡ Performance', - hidden: false, + "type": "perf", + "section": "⚡ Performance", }, { - type: 'test', - section: '✅ Tests', - hidden: true, + "type": "test", + "section": "✅ Tests", }, { - type: 'style', - section: '🎨 Styles', - hidden: true, - }, - ], - }, - }, - }, -} satisfies Config + "type": "style", + "section": "🎨 Styles", + } + ] + } + } + } +} satisfies Config; diff --git a/bun.lock b/bun.lock index f3aa118..b516e23 100644 --- a/bun.lock +++ b/bun.lock @@ -5,45 +5,45 @@ "": { "name": "payload-auditor", "devDependencies": { - "@antfu/eslint-config": "^7.4.3", - "@commitlint/cli": "^20.4.1", - "@commitlint/config-conventional": "^20.4.1", - "@eslint-react/eslint-plugin": "^2.12.4", - "@next/eslint-plugin-next": "^16.0.6", - "@payloadcms/db-mongodb": "^3.76.1", - "@payloadcms/next": "^3.76.1", - "@payloadcms/richtext-lexical": "^3.76.1", - "@payloadcms/translations": "^3.76.1", - "@payloadcms/ui": "^3.76.1", - "@release-it/conventional-changelog": "^10.0.1", - "@swc-node/register": "^1.11.1", - "@swc/cli": "^0.8.0", - "@swc/core": "^1.15.11", - "@types/node": "^25.2.3", - "@types/react": "^19.2.14", + "@antfu/eslint-config": "^9.1.0", + "@commitlint/cli": "^21.2.1", + "@commitlint/config-conventional": "^21.2.0", + "@eslint-react/eslint-plugin": "^5.17.1", + "@next/eslint-plugin-next": "^16.2.10", + "@payloadcms/db-mongodb": "^3.86.0", + "@payloadcms/next": "^3.86.0", + "@payloadcms/richtext-lexical": "^3.86.0", + "@payloadcms/translations": "^3.86.0", + "@payloadcms/ui": "^3.86.0", + "@release-it/conventional-changelog": "^11.0.1", + "@swc-node/register": "^1.12.1", + "@swc/cli": "^0.8.1", + "@swc/core": "^1.15.43", + "@types/node": "^26.1.1", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript/native-preview": "^7.0.0-dev.20260629.1", - "conventional-changelog-conventionalcommits": "^8.0.0", + "@typescript/native-preview": "^7.0.0-dev.20260707.2", + "conventional-changelog-conventionalcommits": "^10.2.1", "copyfiles": "2.4.1", "cross-env": "^10.1.0", - "cz-git": "^1.11.1", - "eslint": "^9.39.1", - "eslint-plugin-perfectionist": "^5.5.0", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.0", - "graphql": "^16.12.0", + "cz-git": "^1.13.1", + "eslint": "^10.7.0", + "eslint-plugin-perfectionist": "^5.10.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.3", + "graphql": "^17.0.2", "lefthook": "^2.1.10", - "next": "^16.2.0-canary.10", - "payload": "^3.76.1", + "next": "^16.2.10", + "payload": "^3.86.0", "payload-auditor": "^1.11.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "release-it": "^19.0.6", - "rimraf": "^6.1.2", - "sharp": "^0.34.5", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "release-it": "^20.2.1", + "rimraf": "^6.1.3", + "sharp": "^0.35.3", "type-fest": "^5.8.0", - "typescript": "^5.9.3", - "vitest": "^4.0.18", + "typescript": "6", + "vitest": "^4.1.10", }, "peerDependencies": { "payload": "^3.76.1", @@ -51,7 +51,7 @@ }, }, "packages": { - "@antfu/eslint-config": ["@antfu/eslint-config@7.7.3", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@clack/prompts": "^1.1.0", "@e18e/eslint-plugin": "^0.2.0", "@eslint-community/eslint-plugin-eslint-comments": "^4.7.1", "@eslint/markdown": "^7.5.1", "@stylistic/eslint-plugin": "^5.10.0", "@typescript-eslint/eslint-plugin": "^8.57.0", "@typescript-eslint/parser": "^8.57.0", "@vitest/eslint-plugin": "^1.6.10", "ansis": "^4.2.0", "cac": "^7.0.0", "eslint-config-flat-gitignore": "^2.2.1", "eslint-flat-config-utils": "^3.0.2", "eslint-merge-processors": "^2.0.0", "eslint-plugin-antfu": "^3.2.2", "eslint-plugin-command": "^3.5.2", "eslint-plugin-import-lite": "^0.5.2", "eslint-plugin-jsdoc": "^62.7.1", "eslint-plugin-jsonc": "^3.1.1", "eslint-plugin-n": "^17.24.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-perfectionist": "^5.6.0", "eslint-plugin-pnpm": "^1.6.0", "eslint-plugin-regexp": "^3.1.0", "eslint-plugin-toml": "^1.3.1", "eslint-plugin-unicorn": "^63.0.0", "eslint-plugin-unused-imports": "^4.4.1", "eslint-plugin-vue": "^10.8.0", "eslint-plugin-yml": "^3.3.1", "eslint-processor-vue-blocks": "^2.0.0", "globals": "^17.4.0", "local-pkg": "^1.1.2", "parse-gitignore": "^2.0.0", "toml-eslint-parser": "^1.0.3", "vue-eslint-parser": "^10.4.0", "yaml-eslint-parser": "^2.0.0" }, "peerDependencies": { "@angular-eslint/eslint-plugin": "^21.1.0", "@angular-eslint/eslint-plugin-template": "^21.1.0", "@angular-eslint/template-parser": "^21.1.0", "@eslint-react/eslint-plugin": "^2.11.0", "@next/eslint-plugin-next": ">=15.0.0", "@prettier/plugin-xml": "^3.4.1", "@unocss/eslint-plugin": ">=0.50.0", "astro-eslint-parser": "^1.0.2", "eslint": "^9.10.0 || ^10.0.0", "eslint-plugin-astro": "^1.2.0", "eslint-plugin-format": ">=0.1.0", "eslint-plugin-jsx-a11y": ">=6.10.2", "eslint-plugin-react-hooks": "^7.0.0", "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-solid": "^0.14.3", "eslint-plugin-svelte": ">=2.35.1", "eslint-plugin-vuejs-accessibility": "^2.4.1", "prettier-plugin-astro": "^0.14.0", "prettier-plugin-slidev": "^1.0.5", "svelte-eslint-parser": ">=0.37.0" }, "optionalPeers": ["@angular-eslint/eslint-plugin", "@angular-eslint/eslint-plugin-template", "@angular-eslint/template-parser", "@eslint-react/eslint-plugin", "@next/eslint-plugin-next", "@prettier/plugin-xml", "@unocss/eslint-plugin", "astro-eslint-parser", "eslint-plugin-astro", "eslint-plugin-format", "eslint-plugin-jsx-a11y", "eslint-plugin-react-hooks", "eslint-plugin-react-refresh", "eslint-plugin-solid", "eslint-plugin-svelte", "eslint-plugin-vuejs-accessibility", "prettier-plugin-astro", "prettier-plugin-slidev", "svelte-eslint-parser"], "bin": { "eslint-config": "bin/index.mjs" } }, "sha512-BtroDxTvmWtvr3yJkdWVCvwsKlnEdkreoeOyrdNezc/W5qaiQNf2xjcsQ3N5Yy0x27h+0WFfW8rG8YlVioG6dw=="], + "@antfu/eslint-config": ["@antfu/eslint-config@9.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@clack/prompts": "^1.6.0", "@e18e/eslint-plugin": "^0.5.1", "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2", "@eslint/markdown": "^8.0.2", "@stylistic/eslint-plugin": "^5.10.0", "@typescript-eslint/eslint-plugin": "^8.62.0", "@typescript-eslint/parser": "^8.62.0", "@vitest/eslint-plugin": "^1.6.20", "ansis": "^4.3.1", "cac": "^7.0.0", "eslint-config-flat-gitignore": "^2.3.0", "eslint-flat-config-utils": "^3.2.0", "eslint-merge-processors": "^2.0.0", "eslint-plugin-antfu": "^3.2.3", "eslint-plugin-command": "^3.5.2", "eslint-plugin-import-lite": "^0.6.0", "eslint-plugin-jsdoc": "^63.0.7", "eslint-plugin-jsonc": "^3.2.0", "eslint-plugin-n": "^18.1.0", "eslint-plugin-no-only-tests": "^3.4.0", "eslint-plugin-perfectionist": "^5.9.1", "eslint-plugin-pnpm": "^1.6.1", "eslint-plugin-regexp": "^3.1.0", "eslint-plugin-toml": "^1.4.0", "eslint-plugin-unicorn": "^68.0.0", "eslint-plugin-unused-imports": "^4.4.1", "eslint-plugin-vue": "^10.9.2", "eslint-plugin-yml": "^3.5.0", "eslint-processor-vue-blocks": "^2.0.0", "globals": "^17.7.0", "local-pkg": "^1.2.1", "parse-gitignore": "^2.0.0", "toml-eslint-parser": "^1.0.3", "vue-eslint-parser": "^10.4.1", "yaml-eslint-parser": "^2.0.0" }, "peerDependencies": { "@angular-eslint/eslint-plugin": "^21.1.0", "@angular-eslint/eslint-plugin-template": "^21.1.0", "@angular-eslint/template-parser": "^21.1.0", "@eslint-react/eslint-plugin": "^5.6.0", "@next/eslint-plugin-next": ">=15.0.0", "@prettier/plugin-xml": "^3.4.1", "@unocss/eslint-plugin": ">=0.50.0", "astro-eslint-parser": "^1.0.2", "eslint": "^9.10.0 || ^10.0.0", "eslint-plugin-astro": "^1.2.0", "eslint-plugin-format": ">=0.1.0", "eslint-plugin-jsx-a11y": ">=6.10.2", "eslint-plugin-react-refresh": "^0.5.0", "eslint-plugin-solid": "^0.14.3", "eslint-plugin-svelte": ">=2.35.1", "eslint-plugin-vuejs-accessibility": "^2.4.1", "prettier-plugin-astro": "^0.14.0", "prettier-plugin-slidev": "^1.0.5", "svelte-eslint-parser": ">=0.37.0" }, "optionalPeers": ["@angular-eslint/eslint-plugin", "@angular-eslint/eslint-plugin-template", "@angular-eslint/template-parser", "@eslint-react/eslint-plugin", "@next/eslint-plugin-next", "@prettier/plugin-xml", "@unocss/eslint-plugin", "astro-eslint-parser", "eslint-plugin-astro", "eslint-plugin-format", "eslint-plugin-jsx-a11y", "eslint-plugin-react-refresh", "eslint-plugin-solid", "eslint-plugin-svelte", "eslint-plugin-vuejs-accessibility", "prettier-plugin-astro", "prettier-plugin-slidev", "svelte-eslint-parser"], "bin": { "eslint-config": "./bin/index.mjs" } }, "sha512-Vtjt+W/6/bV9hgQG8AiWG66OpAeLKmpo5bZaAmUdRvZsMyirVvIJeHnbM4XUJf4urIuLvK0gGSvXD74PI3ZnGQ=="], "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], @@ -97,42 +97,44 @@ "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], - "@commitlint/cli": ["@commitlint/cli@20.5.3", "", { "dependencies": { "@commitlint/format": "^20.5.0", "@commitlint/lint": "^20.5.3", "@commitlint/load": "^20.5.3", "@commitlint/read": "^20.5.0", "@commitlint/types": "^20.5.0", "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, "bin": { "commitlint": "./cli.js" } }, "sha512-OJdL0EXWD5y9LPa0nr/geOwzaS8BsdaybKkcloB0JgsguGxNv2R+hC2FTPqrAcprg35zF33KOQerY0x8W1aesA=="], + "@commitlint/cli": ["@commitlint/cli@21.2.1", "", { "dependencies": { "@commitlint/config-conventional": "^21.2.0", "@commitlint/format": "^21.2.0", "@commitlint/lint": "^21.2.0", "@commitlint/load": "^21.2.0", "@commitlint/read": "^21.2.1", "@commitlint/types": "^21.2.0", "tinyexec": "^1.0.0", "yargs": "^18.0.0" }, "bin": { "commitlint": "cli.js" } }, "sha512-blsZGe29hJ72VGEFVl72IVYX+1vsfINpjA9yWQA6i7OKD/McGEOXg08sKIRKjFk4JvzhV/9n0l3i6NooPLTNfg=="], - "@commitlint/config-conventional": ["@commitlint/config-conventional@20.5.3", "", { "dependencies": { "@commitlint/types": "^20.5.0", "conventional-changelog-conventionalcommits": "^9.2.0" } }, "sha512-j34Qqeaa152chJgz2ysyk0BCpHenJn1lV0Rx0VXf8k3ccQcED+48EZrzMvo9jLmJUyBrrBwvu89I+2er4gW7QQ=="], + "@commitlint/config-conventional": ["@commitlint/config-conventional@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "conventional-changelog-conventionalcommits": "^10.0.0" } }, "sha512-Qf8WRDVcyVd14if6VTWenebxFbKnVnbzPUJjlzjkyJGeHK2xCGd63Dr1XZzj0plXKQb9P0BfOxoc1HVeCo2BWQ=="], - "@commitlint/config-validator": ["@commitlint/config-validator@20.5.0", "", { "dependencies": { "@commitlint/types": "^20.5.0", "ajv": "^8.11.0" } }, "sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw=="], + "@commitlint/config-validator": ["@commitlint/config-validator@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "ajv": "^8.11.0" } }, "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA=="], - "@commitlint/ensure": ["@commitlint/ensure@20.5.3", "", { "dependencies": { "@commitlint/types": "^20.5.0", "es-toolkit": "^1.46.0" } }, "sha512-4i4AgNvH62owG9MwSiWKrle7HGNpBHHdLnWFIp5fTsHUYe5kRuh15t08L/0pdbbrRk8JKXQxxN4hZQcn+szkrw=="], + "@commitlint/ensure": ["@commitlint/ensure@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "es-toolkit": "^1.46.0" } }, "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg=="], - "@commitlint/execute-rule": ["@commitlint/execute-rule@20.0.0", "", {}, "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw=="], + "@commitlint/execute-rule": ["@commitlint/execute-rule@21.0.1", "", {}, "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA=="], - "@commitlint/format": ["@commitlint/format@20.5.0", "", { "dependencies": { "@commitlint/types": "^20.5.0", "picocolors": "^1.1.1" } }, "sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q=="], + "@commitlint/format": ["@commitlint/format@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "picocolors": "^1.1.1" } }, "sha512-c4q64xaav2U83t7k7RyzJerBZurPer7FxUOY0RL5L/6CZijZ7K+s6HIBGIghj0ey1P2+seRX0J9XQYtDued6tg=="], - "@commitlint/is-ignored": ["@commitlint/is-ignored@20.5.0", "", { "dependencies": { "@commitlint/types": "^20.5.0", "semver": "^7.6.0" } }, "sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg=="], + "@commitlint/is-ignored": ["@commitlint/is-ignored@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "semver": "^7.6.0" } }, "sha512-4/eB0vBN7L88O/oC4ajAEqi7j2ZfNgxl/+11RfAV9YosejZgDXhY2C9VcHnHJhOzPLoSy5P3Mg/46kqeyJfXKw=="], - "@commitlint/lint": ["@commitlint/lint@20.5.3", "", { "dependencies": { "@commitlint/is-ignored": "^20.5.0", "@commitlint/parse": "^20.5.0", "@commitlint/rules": "^20.5.3", "@commitlint/types": "^20.5.0" } }, "sha512-M7JbWBNr2gXKaPc4i/KipsuW1gkDHpj35KPjWtKy3Z+2AQw5wu1gBi1LIO0uoaij67CqY4K8PxPZSGens4evCw=="], + "@commitlint/lint": ["@commitlint/lint@21.2.0", "", { "dependencies": { "@commitlint/is-ignored": "^21.2.0", "@commitlint/parse": "^21.2.0", "@commitlint/rules": "^21.2.0", "@commitlint/types": "^21.2.0" } }, "sha512-ceO5dp9pLjEZ6y6qbq/uXWXDPykqqlTsyzoQ0NzecpisSJhK3kTy9qzQoPeJuWG/IMNdV1lO0RgmzqoAlSi1uw=="], - "@commitlint/load": ["@commitlint/load@20.5.3", "", { "dependencies": { "@commitlint/config-validator": "^20.5.0", "@commitlint/execute-rule": "^20.0.0", "@commitlint/resolve-extends": "^20.5.3", "@commitlint/types": "^20.5.0", "cosmiconfig": "^9.0.1", "cosmiconfig-typescript-loader": "^6.1.0", "es-toolkit": "^1.46.0", "is-plain-obj": "^4.1.0", "picocolors": "^1.1.1" } }, "sha512-1FDZWuKyu98Myb8i7Tp31jPU2rZpOwAdYRyJcy2KoGg7Xk2A+bgHN8smhMaaNSNkmE8fwt53BokywZq8Gv/5XQ=="], + "@commitlint/load": ["@commitlint/load@21.2.0", "", { "dependencies": { "@commitlint/config-validator": "^21.2.0", "@commitlint/execute-rule": "^21.0.1", "@commitlint/resolve-extends": "^21.2.0", "@commitlint/types": "^21.2.0", "cosmiconfig": "^9.0.1", "cosmiconfig-typescript-loader": "^6.1.0", "es-toolkit": "^1.46.0", "is-plain-obj": "^4.1.0", "picocolors": "^1.1.1" } }, "sha512-RjlzWQqruRwIenJEfZtq7kG97co97nKoHpflE5YnF61tDLXxHPrdWImgzw6VL6MlFyaOcVlk74eBV8ZQmc3oIA=="], - "@commitlint/message": ["@commitlint/message@20.4.3", "", {}, "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ=="], + "@commitlint/message": ["@commitlint/message@21.2.0", "", {}, "sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g=="], - "@commitlint/parse": ["@commitlint/parse@20.5.0", "", { "dependencies": { "@commitlint/types": "^20.5.0", "conventional-changelog-angular": "^8.2.0", "conventional-commits-parser": "^6.3.0" } }, "sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA=="], + "@commitlint/parse": ["@commitlint/parse@21.2.0", "", { "dependencies": { "@commitlint/types": "^21.2.0", "conventional-changelog-angular": "^9.0.0", "conventional-commits-parser": "^7.0.0" } }, "sha512-QHWxG4d0PLTF634/AdyZ0MQS+CLn5YOuJlCFhMMlSGKFxzYGUetkHBj18xgBD+6fVzUrA2lrCdi/vlS2f/oYXg=="], - "@commitlint/read": ["@commitlint/read@20.5.0", "", { "dependencies": { "@commitlint/top-level": "^20.4.3", "@commitlint/types": "^20.5.0", "git-raw-commits": "^5.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" } }, "sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w=="], + "@commitlint/read": ["@commitlint/read@21.2.1", "", { "dependencies": { "@commitlint/top-level": "^21.2.0", "@commitlint/types": "^21.2.0", "@conventional-changelog/git-client": "^3.0.0", "tinyexec": "^1.0.0" } }, "sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA=="], - "@commitlint/resolve-extends": ["@commitlint/resolve-extends@20.5.3", "", { "dependencies": { "@commitlint/config-validator": "^20.5.0", "@commitlint/types": "^20.5.0", "es-toolkit": "^1.46.0", "global-directory": "^5.0.0", "import-meta-resolve": "^4.0.0", "resolve-from": "^5.0.0" } }, "sha512-+ogW9v/u9JqpvAgTrLra/YTFo0KkjU6iNblF89pPsj4NebNc+DAWctsludwezI8YnsjBmfHpApSwcXprN/f/ew=="], + "@commitlint/resolve-extends": ["@commitlint/resolve-extends@21.2.0", "", { "dependencies": { "@commitlint/config-validator": "^21.2.0", "@commitlint/types": "^21.2.0", "es-toolkit": "^1.46.0", "global-directory": "^5.0.0", "resolve-from": "^5.0.0" } }, "sha512-4O/1j51+79Wth9s/MGxt/5gs0XYLDgNlYpltQfhAvLE0itusLKs9zruxbiNg1oOkmkb9L9L4USYGjEj7n87NxA=="], - "@commitlint/rules": ["@commitlint/rules@20.5.3", "", { "dependencies": { "@commitlint/ensure": "^20.5.3", "@commitlint/message": "^20.4.3", "@commitlint/to-lines": "^20.0.0", "@commitlint/types": "^20.5.0" } }, "sha512-MPlMnb9D3wbszYMp+1hPtuhtPJndRo6I6yfkZVA4+jR8w7Kqp0u2u/Y+gzbaItx5Lltq5rw7FSZQWJMoXUC4NQ=="], + "@commitlint/rules": ["@commitlint/rules@21.2.0", "", { "dependencies": { "@commitlint/ensure": "^21.2.0", "@commitlint/message": "^21.2.0", "@commitlint/to-lines": "^21.0.1", "@commitlint/types": "^21.2.0" } }, "sha512-C2yXMNpiB8ETZKfx5JD8+ExgF8vTU1VQMKPSUUYwqKpw9oJWQBrlXBpdU038mj2WPjof7o9UzFpmTyBeGMZwZg=="], - "@commitlint/to-lines": ["@commitlint/to-lines@20.0.0", "", {}, "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw=="], + "@commitlint/to-lines": ["@commitlint/to-lines@21.0.1", "", {}, "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw=="], - "@commitlint/top-level": ["@commitlint/top-level@20.4.3", "", { "dependencies": { "escalade": "^3.2.0" } }, "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ=="], + "@commitlint/top-level": ["@commitlint/top-level@21.2.0", "", { "dependencies": { "escalade": "^3.2.0" } }, "sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ=="], - "@commitlint/types": ["@commitlint/types@20.5.0", "", { "dependencies": { "conventional-commits-parser": "^6.3.0", "picocolors": "^1.1.1" } }, "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA=="], + "@commitlint/types": ["@commitlint/types@21.2.0", "", { "dependencies": { "conventional-commits-parser": "^7.0.0", "picocolors": "^1.1.1" } }, "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw=="], "@conventional-changelog/git-client": ["@conventional-changelog/git-client@2.7.0", "", { "dependencies": { "@simple-libs/child-process-utils": "^1.0.0", "@simple-libs/stream-utils": "^1.2.0", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.4.0" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw=="], + "@conventional-changelog/template": ["@conventional-changelog/template@1.2.1", "", {}, "sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w=="], + "@date-fns/tz": ["@date-fns/tz@1.2.0", "", {}, "sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg=="], "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="], @@ -145,7 +147,7 @@ "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], - "@e18e/eslint-plugin": ["@e18e/eslint-plugin@0.2.0", "", { "dependencies": { "eslint-plugin-depend": "^1.4.0" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0", "oxlint": "^1.41.0" }, "optionalPeers": ["eslint", "oxlint"] }, "sha512-mXgODVwhuDjTJ+UT+XSvmMmCidtGKfrV5nMIv1UtpWex2pYLsIM3RSpT8HWIMAebS9qANbXPKlSX4BE7ZvuCgA=="], + "@e18e/eslint-plugin": ["@e18e/eslint-plugin@0.5.1", "", { "dependencies": { "empathic": "^2.0.1", "module-replacements": "^3.0.0-beta.8", "semver": "^7.8.2" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0", "oxlint": "^1.68.0" }, "optionalPeers": ["eslint", "oxlint"] }, "sha512-mqUozeyNI9xvJbjrOO7y765dT7Kud3bwCm/DHwctxdEngPdJWQaS9BNGgpM1wCCzZfOtlKQh4ZRhm3VRomT9KA=="], "@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], @@ -239,35 +241,33 @@ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint-react/ast": ["@eslint-react/ast@2.13.0", "", { "dependencies": { "@eslint-react/eff": "2.13.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/typescript-estree": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "string-ts": "^2.3.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-43+5gmqV3MpatTzKnu/V2i/jXjmepvwhrb9MaGQvnXHQgq9J7/C7VVCCcwp6Rvp2QHAFquAAdvQDSL8IueTpeA=="], + "@eslint-react/ast": ["@eslint-react/ast@5.17.1", "", { "dependencies": { "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/typescript-estree": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "string-ts": "^2.3.1" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-C/Xu7inuG//EU4+LfDWO79GE71y94Ae0X1SSzGFu7IoplTH10tyjd6jQNMG4VYxI1zSMgCg0h+QcCWoBGV+ZWA=="], - "@eslint-react/core": ["@eslint-react/core@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-m62XDzkf1hpzW4sBc7uh7CT+8rBG2xz/itSADuEntlsg4YA7Jhb8hjU6VHf3wRFDwyfx5VnbV209sbJ7Azey0Q=="], + "@eslint-react/core": ["@eslint-react/core@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/jsx": "5.17.1", "@eslint-react/shared": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/scope-manager": "^8.64.0", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-bf2XjVvqxiKF0B1h6csLWiKG5dQvDgltki6voRSfK5oGMyiwYD27ODczLAwVubggqTeZNOStQY+dZzfVE1ePCQ=="], - "@eslint-react/eff": ["@eslint-react/eff@2.13.0", "", {}, "sha512-rEH2R8FQnUAblUW+v3ZHDU1wEhatbL1+U2B1WVuBXwSKqzF7BGaLqCPIU7o9vofumz5MerVfaCtJgI8jYe2Btg=="], + "@eslint-react/eslint": ["@eslint-react/eslint@5.17.1", "", { "dependencies": { "@typescript-eslint/utils": "^8.64.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-8HH62nFp1AoESCQaQUHtRvs3SBDn28NWIg818+c4AAFTCTkUYjLEqBrJHJxc/eSF4MduLCy06xnWMXE4J6LtDQ=="], - "@eslint-react/eslint-plugin": ["@eslint-react/eslint-plugin@2.13.0", "", { "dependencies": { "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/type-utils": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "eslint-plugin-react-dom": "2.13.0", "eslint-plugin-react-hooks-extra": "2.13.0", "eslint-plugin-react-naming-convention": "2.13.0", "eslint-plugin-react-rsc": "2.13.0", "eslint-plugin-react-web-api": "2.13.0", "eslint-plugin-react-x": "2.13.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-iaMXpqnJCTW7317hg8L4wx7u5aIiPzZ+d1p59X8wXFgMHzFX4hNu4IfV8oygyjmWKdLsjKE9sEpv/UYWczlb+A=="], + "@eslint-react/eslint-plugin": ["@eslint-react/eslint-plugin@5.17.1", "", { "dependencies": { "@eslint-react/shared": "5.17.1", "eslint-plugin-react-dom": "5.17.1", "eslint-plugin-react-jsx": "5.17.1", "eslint-plugin-react-naming-convention": "5.17.1", "eslint-plugin-react-rsc": "5.17.1", "eslint-plugin-react-web-api": "5.17.1", "eslint-plugin-react-x": "5.17.1" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-wXd5WHjSbWlAUye+Y1P0KSf5xpuKTikLimZBXlRNlV2sgatSYnLgxyS7JfNJmD02gSMRMu8vJ7tgZlgBO9mVpA=="], - "@eslint-react/shared": ["@eslint-react/shared@2.13.0", "", { "dependencies": { "@eslint-react/eff": "2.13.0", "@typescript-eslint/utils": "^8.55.0", "ts-pattern": "^5.9.0", "zod": "^3.25.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-IOloCqrZ7gGBT4lFf9+0/wn7TfzU7JBRjYwTSyb9SDngsbeRrtW95ZpgUpS8/jen1wUEm6F08duAooTZ2FtsWA=="], + "@eslint-react/jsx": ["@eslint-react/jsx@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/shared": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-1uTcGS+yevc/RW7A25z+X8P9qq7HC8zYEO3lXHrVBruHyY8jhd7k+/iLQI3JpKlE/QPmPjxo+H/p0/FFyBU0bQ=="], - "@eslint-react/var": ["@eslint-react/var@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-dM+QaeiHR16qPQoJYg205MkdHYSWVa2B7ore5OFpOPlSwqDV3tLW7I+475WjbK7potq5QNPTxRa7VLp9FGeQqA=="], - - "@eslint/compat": ["@eslint/compat@2.1.0", "", { "dependencies": { "@eslint/core": "^1.2.1" }, "peerDependencies": { "eslint": "^8.40 || 9 || 10" }, "optionalPeers": ["eslint"] }, "sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g=="], + "@eslint-react/shared": ["@eslint-react/shared@5.17.1", "", { "dependencies": { "@eslint-react/eslint": "5.17.1", "@typescript-eslint/utils": "^8.64.0", "ts-pattern": "^5.9.0", "zod": "^3.25.0 || ^4.0.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-3210sOtv7b18qVo0QCCl+bmgb3r1pmeLkcF2JwqnTGH5jPNReWYX524xQqMdQqy7O73BBO5nPG0MnBMPdMHT/Q=="], - "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + "@eslint-react/var": ["@eslint-react/var@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/eslint": "5.17.1", "@typescript-eslint/scope-manager": "^8.64.0", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-UPfhOHUHGecm7QFc2KLf+XoW7NOgR6A2me9SGvo5DRu4GZAbJ1bvn3/3h+10sCK5MS5pS16m9hilZLfQfYdE4w=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/compat": ["@eslint/compat@2.1.0", "", { "dependencies": { "@eslint/core": "^1.2.1" }, "peerDependencies": { "eslint": "^8.40 || 9 || 10" }, "optionalPeers": ["eslint"] }, "sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.6", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], - "@eslint/js": ["@eslint/js@9.39.5", "", {}, "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A=="], + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/markdown": ["@eslint/markdown@7.5.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "@eslint/plugin-kit": "^0.4.1", "github-slugger": "^2.0.0", "mdast-util-from-markdown": "^2.0.2", "mdast-util-frontmatter": "^2.0.1", "mdast-util-gfm": "^3.1.0", "micromark-extension-frontmatter": "^2.0.0", "micromark-extension-gfm": "^3.0.0", "micromark-util-normalize-identifier": "^2.0.1" } }, "sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ=="], + "@eslint/markdown": ["@eslint/markdown@8.0.3", "", { "dependencies": { "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "github-slugger": "^2.0.0", "mdast-util-from-markdown": "^2.0.2", "mdast-util-frontmatter": "^2.0.1", "mdast-util-gfm": "^3.1.0", "mdast-util-math": "^3.0.0", "micromark-extension-frontmatter": "^2.0.0", "micromark-extension-gfm": "^3.0.0", "micromark-extension-math": "^3.1.0", "micromark-util-normalize-identifier": "^2.0.1" } }, "sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A=="], - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], "@faceless-ui/modal": ["@faceless-ui/modal@3.0.0", "", { "dependencies": { "body-scroll-lock": "4.0.0-beta.0", "focus-trap": "7.5.4", "react-transition-group": "4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-o3oEFsot99EQ8RJc1kL3s/nNMHX+y+WMXVzSSmca9L0l2MR6ez2QM1z1yIelJX93jqkLXQ9tW+R9tmsYa+O4Qg=="], @@ -297,85 +297,89 @@ "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.2" }, "os": "darwin", "cpu": "arm64" }, "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.2" }, "os": "darwin", "cpu": "x64" }, "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.3", "", { "dependencies": { "@img/sharp-wasm32": "0.35.3" }, "os": "freebsd" }, "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA=="], - "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw=="], - "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.2", "", { "os": "linux", "cpu": "none" }, "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.2" }, "os": "linux", "cpu": "arm" }, "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.2" }, "os": "linux", "cpu": "arm64" }, "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ=="], - "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.2" }, "os": "linux", "cpu": "ppc64" }, "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA=="], - "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.2" }, "os": "linux", "cpu": "none" }, "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.2" }, "os": "linux", "cpu": "s390x" }, "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.2" }, "os": "linux", "cpu": "x64" }, "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" }, "os": "linux", "cpu": "arm64" }, "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.2" }, "os": "linux", "cpu": "x64" }, "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg=="], "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], - "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.3", "", { "dependencies": { "@img/sharp-wasm32": "0.35.3" }, "cpu": "none" }, "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw=="], - "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.3", "", { "os": "win32", "cpu": "x64" }, "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA=="], - "@inquirer/checkbox": ["@inquirer/checkbox@4.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA=="], + "@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="], - "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="], + "@inquirer/checkbox": ["@inquirer/checkbox@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw=="], - "@inquirer/core": ["@inquirer/core@10.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A=="], + "@inquirer/confirm": ["@inquirer/confirm@6.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ=="], - "@inquirer/editor": ["@inquirer/editor@4.2.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ=="], + "@inquirer/core": ["@inquirer/core@11.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA=="], - "@inquirer/expand": ["@inquirer/expand@4.0.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew=="], + "@inquirer/editor": ["@inquirer/editor@5.2.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/external-editor": "^3.0.3", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg=="], - "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], + "@inquirer/expand": ["@inquirer/expand@5.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g=="], - "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], + "@inquirer/external-editor": ["@inquirer/external-editor@3.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA=="], - "@inquirer/input": ["@inquirer/input@4.3.1", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g=="], + "@inquirer/figures": ["@inquirer/figures@2.0.7", "", {}, "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw=="], - "@inquirer/number": ["@inquirer/number@3.0.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg=="], + "@inquirer/input": ["@inquirer/input@5.1.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg=="], - "@inquirer/password": ["@inquirer/password@4.0.23", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA=="], + "@inquirer/number": ["@inquirer/number@4.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA=="], - "@inquirer/prompts": ["@inquirer/prompts@7.10.1", "", { "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", "@inquirer/editor": "^4.2.23", "@inquirer/expand": "^4.0.23", "@inquirer/input": "^4.3.1", "@inquirer/number": "^3.0.23", "@inquirer/password": "^4.0.23", "@inquirer/rawlist": "^4.1.11", "@inquirer/search": "^3.2.2", "@inquirer/select": "^4.4.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg=="], + "@inquirer/password": ["@inquirer/password@5.1.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg=="], - "@inquirer/rawlist": ["@inquirer/rawlist@4.1.11", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw=="], + "@inquirer/prompts": ["@inquirer/prompts@8.4.2", "", { "dependencies": { "@inquirer/checkbox": "^5.1.4", "@inquirer/confirm": "^6.0.12", "@inquirer/editor": "^5.1.1", "@inquirer/expand": "^5.0.13", "@inquirer/input": "^5.0.12", "@inquirer/number": "^4.0.12", "@inquirer/password": "^5.0.12", "@inquirer/rawlist": "^5.2.8", "@inquirer/search": "^4.1.8", "@inquirer/select": "^5.1.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q=="], - "@inquirer/search": ["@inquirer/search@3.2.2", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA=="], + "@inquirer/rawlist": ["@inquirer/rawlist@5.3.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og=="], - "@inquirer/select": ["@inquirer/select@4.4.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w=="], + "@inquirer/search": ["@inquirer/search@4.2.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g=="], - "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="], + "@inquirer/select": ["@inquirer/select@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw=="], + + "@inquirer/type": ["@inquirer/type@4.0.7", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -537,8 +541,6 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@nodeutils/defaults-deep": ["@nodeutils/defaults-deep@1.1.0", "", { "dependencies": { "lodash": "^4.15.0" } }, "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg=="], - "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], "@octokit/core": ["@octokit/core@7.0.6", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="], @@ -625,7 +627,7 @@ "@preact/signals-core": ["@preact/signals-core@1.14.4", "", {}, "sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA=="], - "@release-it/conventional-changelog": ["@release-it/conventional-changelog@10.0.6", "", { "dependencies": { "@conventional-changelog/git-client": "^2.6.0", "concat-stream": "^2.0.0", "conventional-changelog": "^7.2.0", "conventional-changelog-angular": "^8.3.0", "conventional-changelog-conventionalcommits": "^9.3.0", "conventional-recommended-bump": "^11.2.0", "semver": "^7.7.4" }, "peerDependencies": { "release-it": "^18.0.0 || ^19.0.0" } }, "sha512-aUb0IkcsBTMcOH5PPQ9Jv9lEOOVu2+rSgkE1ny+dzsTziQm2BhDRAtaFK/dw/HflthuXMWrqhhyfJhAV1AOEPQ=="], + "@release-it/conventional-changelog": ["@release-it/conventional-changelog@11.0.1", "", { "dependencies": { "@conventional-changelog/git-client": "^2.7.0", "concat-stream": "^2.0.0", "conventional-changelog": "^7.2.0", "conventional-changelog-angular": "^8.3.1", "conventional-changelog-conventionalcommits": "^9.3.1", "conventional-recommended-bump": "^11.2.0", "semver": "^7.7.4" }, "peerDependencies": { "release-it": "^18.0.0 || ^19.0.0 || ^20.0.0" } }, "sha512-SHAnHfOFhazpDeYuQSqH8Qm8RJa2oREn2ILSod+9s8dqiA18mBgpPyYlpvRaqISCVerSmLzEZghQBKphkrf4IQ=="], "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="], @@ -679,7 +681,7 @@ "@swc-node/core": ["@swc-node/core@1.15.0", "", { "peerDependencies": { "@swc/core": ">= 1.13.3", "@swc/types": ">= 0.1" } }, "sha512-WAerrrl087WgenB92XG4Th2t0NQFfMNLYSe0sW2cEMMqM/LQmP4rozsDJl0vuzTrbewjpKQryxFXI+aYig/dBg=="], - "@swc-node/register": ["@swc-node/register@1.12.0", "", { "dependencies": { "@node-rs/xxhash": "^1.7.6", "@swc-node/core": "1.15.0", "@swc-node/sourcemap-support": "^0.6.1", "colorette": "^2.0.20", "debug": "^4.4.1", "json-stable-stringify": "^1.3.0", "oxc-resolver": "^11.6.1", "pirates": "^4.0.7", "tslib": "^2.8.1" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3 < 7" } }, "sha512-RnkF4NOHqv3JAKJS9YguLeFH81NPv8VQKTXt5lMJfOujB7qvZXJRei5LJeulihF0ZMD1UIruIA0gm9it/bH37g=="], + "@swc-node/register": ["@swc-node/register@1.12.1", "", { "dependencies": { "@node-rs/xxhash": "^1.7.6", "@swc-node/core": "1.15.0", "@swc-node/sourcemap-support": "^0.6.1", "colorette": "^2.0.20", "debug": "^4.4.1", "fast-json-stable-stringify": "^2.1.0", "oxc-resolver": "^11.6.1", "pirates": "^4.0.7", "tslib": "^2.8.1" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3 < 7" } }, "sha512-t6t+0bDos+bj0+jcSqKl7+ys/i1an5cEViC0LuIskJFSHONX871nXN8j+gxdKVOgCCpjs0buXUPNnp/0DaV4EQ=="], "@swc-node/sourcemap-support": ["@swc-node/sourcemap-support@0.6.1", "", { "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.8.1" } }, "sha512-ovltDVH5QpdHXZkW138vG4+dgcNsxfwxHVoV6BtmTbz2KKl1A8ZSlbdtxzzfNjCjbpayda8Us9eMtcHobm38dA=="], @@ -721,8 +723,6 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@types/acorn": ["@types/acorn@4.0.6", "", { "dependencies": { "@types/estree": "*" } }, "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ=="], @@ -735,6 +735,8 @@ "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], @@ -745,13 +747,15 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/katex": ["@types/katex@0.16.8", "", {}, "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg=="], + "@types/lodash": ["@types/lodash@4.17.24", "", {}, "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], @@ -863,13 +867,13 @@ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "agent-base": ["agent-base@8.0.0", "", {}, "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg=="], "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], @@ -879,6 +883,8 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "argue-cli": ["argue-cli@3.1.0", "", {}, "sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw=="], + "array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], @@ -949,12 +955,6 @@ "cacheable-request": ["cacheable-request@13.0.19", "", { "dependencies": { "@types/http-cache-semantics": "^4.2.0", "get-stream": "^9.0.1", "http-cache-semantics": "^4.2.0", "keyv": "^5.6.0", "mimic-response": "^4.0.0", "normalize-url": "^8.1.1", "responselike": "^4.0.2" } }, "sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg=="], - "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], @@ -963,7 +963,7 @@ "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], @@ -985,8 +985,6 @@ "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], - "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], - "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="], @@ -995,7 +993,7 @@ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], @@ -1007,7 +1005,7 @@ "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], - "comment-parser": ["comment-parser@1.4.6", "", {}, "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg=="], + "comment-parser": ["comment-parser@1.4.7", "", {}, "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ=="], "compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="], @@ -1031,7 +1029,7 @@ "conventional-changelog-angular": ["conventional-changelog-angular@8.3.1", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg=="], - "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@8.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA=="], + "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@10.2.1", "", { "dependencies": { "@conventional-changelog/template": "^1.2.1" } }, "sha512-n4Kr1HFMTf3iMbES0TMxKIcYtUUv4rKqyQQp2JwfOEfFCOfGT3Tq4mCyJ8S9/YPyWhydjfKrrvnyl+gCjA+mJQ=="], "conventional-changelog-preset-loader": ["conventional-changelog-preset-loader@5.0.0", "", {}, "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA=="], @@ -1039,7 +1037,7 @@ "conventional-commits-filter": ["conventional-commits-filter@5.0.0", "", {}, "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q=="], - "conventional-commits-parser": ["conventional-commits-parser@6.4.0", "", { "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { "conventional-commits-parser": "dist/cli/index.js" } }, "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw=="], + "conventional-commits-parser": ["conventional-commits-parser@7.1.0", "", { "dependencies": { "@simple-libs/stream-utils": "^2.0.0", "argue-cli": "^3.1.0" }, "bin": { "conventional-commits-parser": "./dist/cli/index.js" } }, "sha512-DPp6hkUjvwIivxbkrTiLXeRswNv1A/4GFA2X6scXma0AMa9632V3TwxmrlkUIEtUktiM3Ln+RrSH2xlP3/jUTw=="], "conventional-recommended-bump": ["conventional-recommended-bump@11.2.0", "", { "dependencies": { "@conventional-changelog/git-client": "^2.5.1", "conventional-changelog-preset-loader": "^5.0.0", "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.1.0", "meow": "^13.0.0" }, "bin": { "conventional-recommended-bump": "dist/cli/index.js" } }, "sha512-lqIdmw330QdMBgfL0e6+6q5OMKyIpy4OZNmepit6FS3GldhkG+70drZjuZ0A5NFpze5j85dlYs3GabQXl6sMHw=="], @@ -1073,7 +1071,7 @@ "cz-git": ["cz-git@1.13.1", "", {}, "sha512-xeMA5ci+gkBY6uKmqc6nzhG/Q4pmK1DKbVVUgByOTBgregoiYE0f3otEF0ADelyEWH4vNsO1W2o7QZYEe7Nwlw=="], - "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + "data-uri-to-buffer": ["data-uri-to-buffer@7.0.0", "", {}, "sha512-CuRUx0TXGSbbWdEci3VK/XOZGP3n0P4pIKpsqpVtBqaIIuj3GKK8H45oAqA4Rg8FHipc+CzRdUzmD4YQXxv66Q=="], "dataloader": ["dataloader@2.2.3", "", {}, "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA=="], @@ -1095,18 +1093,18 @@ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + "degenerator": ["degenerator@6.0.0", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" }, "peerDependencies": { "quickjs-wasi": "^0.0.1" } }, "sha512-j5MdXdefrecJeSqTpUrgZd4fBsD2IxZx0JlJD+n1Q7+aTf7/HcyXSfHsicPW6ekPurX159v1ZYla6OJgSPh2Dw=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], @@ -1121,11 +1119,9 @@ "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "electron-to-chromium": ["electron-to-chromium@1.5.393", "", {}, "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg=="], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "empathic": ["empathic@2.0.1", "", {}, "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q=="], @@ -1139,14 +1135,10 @@ "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], "es-module-lexer": ["es-module-lexer@2.3.1", "", {}, "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA=="], - "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], - "es-toolkit": ["es-toolkit@1.49.0", "", {}, "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g=="], "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], @@ -1159,7 +1151,7 @@ "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "eslint": ["eslint@9.39.5", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.6", "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw=="], + "eslint": ["eslint@10.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ=="], "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], @@ -1175,17 +1167,15 @@ "eslint-plugin-command": ["eslint-plugin-command@3.5.3", "", { "dependencies": { "@es-joy/jsdoccomment": "^0.88.0" }, "peerDependencies": { "@typescript-eslint/typescript-estree": "*", "@typescript-eslint/utils": "*", "eslint": "*" } }, "sha512-JIhmUOW2K2Dw1K+p4mtj5potkqTZ4ZaicrTkgCygPZCWErP2+O2F46n7ZwGKapeEjiwcVqoY8u01SxNUUXWPeQ=="], - "eslint-plugin-depend": ["eslint-plugin-depend@1.5.0", "", { "dependencies": { "empathic": "^2.0.0", "module-replacements": "^2.10.1", "semver": "^7.6.3" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "sha512-i3UeLYmclf1Icp35+6W7CR4Bp2PIpDgBuf/mpmXK5UeLkZlvYJ21VuQKKHHAIBKRTPivPGX/gZl5JGno1o9Y0A=="], - "eslint-plugin-es-x": ["eslint-plugin-es-x@7.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ=="], - "eslint-plugin-import-lite": ["eslint-plugin-import-lite@0.5.2", "", { "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-XvfdWOC5dSLEI9krIPRlNmKSI2ViIE9pVylzfV9fCq0ZpDaNeUk6o0wZv0OzN83QdadgXp1NsY0qjLINxwYCsw=="], + "eslint-plugin-import-lite": ["eslint-plugin-import-lite@0.6.0", "", { "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "sha512-80vevx2A7i3H7n1/6pqDO8cc5wRz6OwLDvIyVl9UflBV1N1f46e9Ihzi65IOLYoSxM6YykK2fTw1xm0Ixx6aTQ=="], - "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@62.9.0", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.86.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.6", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^11.2.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA=="], + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@63.1.0", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.88.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.7", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^11.2.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", "semver": "^7.8.5", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-Vo0Mvhxi6B63gLIDI86QChkiKE79MxxM0I16gMN/HJn0rvJvMIG/nmn+KPcsx+GWYDQq6X0UfNRjRK1+97NYVg=="], "eslint-plugin-jsonc": ["eslint-plugin-jsonc@3.3.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.1", "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.7.0", "@ota-meshi/ast-token-store": "^0.3.0", "diff-sequences": "^29.6.3", "eslint-json-compat-utils": "^0.2.3", "jsonc-eslint-parser": "^3.1.0", "natural-compare": "^1.4.0", "synckit": "^0.11.12" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-CsTR8aDcShDg6A71ZppLaWiPoSo2J1Ivjm5/c4Mnb9sxgwWq+WG2PgeoAnj7SwzDPJB75tlHvLrGy6ntooIitg=="], - "eslint-plugin-n": ["eslint-plugin-n@17.24.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3", "ts-declaration-location": "^1.0.6" }, "peerDependencies": { "eslint": ">=8.23.0" } }, "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw=="], + "eslint-plugin-n": ["eslint-plugin-n@18.2.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3" }, "peerDependencies": { "eslint": ">=8.57.1", "ts-declaration-location": "^1.0.6", "typescript": ">=5.0.0" }, "optionalPeers": ["ts-declaration-location", "typescript"] }, "sha512-gOO0lIqwEjZ750kv9/SptCWArUoAZXJoBr0vYWTO2dCBxctHUXlBIigiC8xuxxr/NKqgIT6Ehz1xRcilj8a5cA=="], "eslint-plugin-no-only-tests": ["eslint-plugin-no-only-tests@3.4.0", "", {}, "sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg=="], @@ -1193,27 +1183,27 @@ "eslint-plugin-pnpm": ["eslint-plugin-pnpm@1.6.1", "", { "dependencies": { "empathic": "^2.0.1", "jsonc-eslint-parser": "^3.1.0", "pathe": "^2.0.3", "pnpm-workspace-yaml": "1.6.1", "tinyglobby": "^0.2.16", "yaml": "^2.9.0", "yaml-eslint-parser": "^2.0.0" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "sha512-pgcaJclu3YxZ/WMsiKMF58bHQasbGVARSMqCJvFaETYxSc7KcR2H74UVWV6exuGv9nNv9c0KKqn4PVHQlzMSEg=="], - "eslint-plugin-react-dom": ["eslint-plugin-react-dom@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/core": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "compare-versions": "^6.1.1", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-+2IZzQ1WEFYOWatW+xvNUqmZn55YBCufzKA7hX3XQ/8eu85Mp4vnlOyNvdVHEOGhUnGuC6+9+zLK+IlEHKdKLQ=="], + "eslint-plugin-react-dom": ["eslint-plugin-react-dom@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/jsx": "5.17.1", "@eslint-react/shared": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "compare-versions": "^6.1.1" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-Tb1Tahle1L03x3JnU88Te7P13V695zdPE86pAElMbfJqN9Wz+hSxXt0l7HRzFSw9zzY2LmbLEWs5Tfj2aJ15CQ=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="], - "eslint-plugin-react-hooks-extra": ["eslint-plugin-react-hooks-extra@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/core": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/type-utils": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qIbha1nzuyhXM9SbEfrcGVqmyvQu7GAOB2sy9Y4Qo5S8nCqw4fSBxq+8lSce5Tk5Y7XzIkgHOhNyXEvUHRWFMQ=="], + "eslint-plugin-react-jsx": ["eslint-plugin-react-jsx@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/core": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/jsx": "5.17.1", "@eslint-react/shared": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-BkDgTNQz8IjoebL9BKK8FyQn0GNnGN6dNDIm+ne6uLwnHf4SPpeBciC1kEnCygiCX5Y8XmAj3NEDLHxRAFJn1Q=="], - "eslint-plugin-react-naming-convention": ["eslint-plugin-react-naming-convention@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/core": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/type-utils": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "compare-versions": "^6.1.1", "string-ts": "^2.3.1", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-uSd25JzSg2R4p81s3Wqck0AdwRlO9Yc+cZqTEXv7vW8exGGAM3mWnF6hgrgdqVJqBEGJIbS/Vx1r5BdKcY/MHA=="], + "eslint-plugin-react-naming-convention": ["eslint-plugin-react-naming-convention@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/core": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-Y8Czg68OHg/zfP1p+JMaCMeEhW1Pv9PUGnuQJsP/0kDCCjHb6aXI2pRHIQPcwAeFEAgOFUsB2DURESlsx6XUAA=="], "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.5.3", "", { "peerDependencies": { "eslint": "^9 || ^10" } }, "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA=="], - "eslint-plugin-react-rsc": ["eslint-plugin-react-rsc@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-RaftgITDLQm1zIgYyvR51sBdy4FlVaXFts5VISBaKbSUB0oqXyzOPxMHasfr9BCSjPLKus9zYe+G/Hr6rjFLXQ=="], + "eslint-plugin-react-rsc": ["eslint-plugin-react-rsc@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/core": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/shared": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-4numrKqQd2ld62sAVZDmcXkS3bOmzSCNNz5Tlpu7q8hjLt9cgD4+yFdx3zHdC1WZt8JV0emfM1Xwea8Bkoxvnw=="], - "eslint-plugin-react-web-api": ["eslint-plugin-react-web-api@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/core": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "birecord": "^0.1.1", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nmJbzIAte7PeAkp22CwcKEASkKi49MshSdiDGO1XuN3f4N4/8sBfDcWbQuLPde6JiuzDT/0+l7Gi8wwTHtR1kg=="], + "eslint-plugin-react-web-api": ["eslint-plugin-react-web-api@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/core": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/shared": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "birecord": "^0.1.2", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-QUVp4mRpsnFgdVAx58lv5+tKmbuKkJgaHRSTELRCKyVePPGWwqF++MW1YXcqp1nY7XTuio21iLLDQJBd4h6Kiw=="], - "eslint-plugin-react-x": ["eslint-plugin-react-x@2.13.0", "", { "dependencies": { "@eslint-react/ast": "2.13.0", "@eslint-react/core": "2.13.0", "@eslint-react/eff": "2.13.0", "@eslint-react/shared": "2.13.0", "@eslint-react/var": "2.13.0", "@typescript-eslint/scope-manager": "^8.55.0", "@typescript-eslint/type-utils": "^8.55.0", "@typescript-eslint/types": "^8.55.0", "@typescript-eslint/utils": "^8.55.0", "compare-versions": "^6.1.1", "is-immutable-type": "^5.0.1", "ts-api-utils": "^2.4.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-cMNX0+ws/fWTgVxn52qAQbaFF2rqvaDAtjrPUzY6XOzPjY0rJQdR2tSlWJttz43r2yBfqu+LGvHlGpWL2wfpTQ=="], + "eslint-plugin-react-x": ["eslint-plugin-react-x@5.17.1", "", { "dependencies": { "@eslint-react/ast": "5.17.1", "@eslint-react/core": "5.17.1", "@eslint-react/eslint": "5.17.1", "@eslint-react/jsx": "5.17.1", "@eslint-react/shared": "5.17.1", "@eslint-react/var": "5.17.1", "@typescript-eslint/scope-manager": "^8.64.0", "@typescript-eslint/type-utils": "^8.64.0", "@typescript-eslint/types": "^8.64.0", "@typescript-eslint/typescript-estree": "^8.64.0", "@typescript-eslint/utils": "^8.64.0", "compare-versions": "^6.1.1", "string-ts": "^2.3.1", "ts-api-utils": "^2.5.0", "ts-pattern": "^5.9.0" }, "peerDependencies": { "eslint": "*", "typescript": "*" } }, "sha512-PE/PYQP8aYdLit3qt5/KsrHzmbRKqERGTLijVzOUjeAAylBS1JbrPdmmGJkTdsCqMamdS/UOpgArr5p6UYG0yA=="], "eslint-plugin-regexp": ["eslint-plugin-regexp@3.1.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "comment-parser": "^1.4.0", "jsdoc-type-pratt-parser": "^7.0.0", "refa": "^0.12.1", "regexp-ast-analysis": "^0.7.1", "scslre": "^0.3.0" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA=="], "eslint-plugin-toml": ["eslint-plugin-toml@1.4.0", "", { "dependencies": { "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.7.0", "@ota-meshi/ast-token-store": "^0.3.0", "debug": "^4.1.1", "toml-eslint-parser": "^1.0.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-3ErTnfUjXq/23f72XeyRcE0Y4Sd/ME1lsZeezczqpn2R4tE7+Sgco/NUKDXm0xAMz15tzcRz/9RfJRm6AqRO+A=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@63.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "@eslint-community/eslint-utils": "^4.9.0", "change-case": "^5.4.4", "ci-info": "^4.3.1", "clean-regexp": "^1.0.0", "core-js-compat": "^3.46.0", "find-up-simple": "^1.0.1", "globals": "^16.4.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.13.0", "semver": "^7.7.3", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@68.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "@eslint-community/eslint-utils": "^4.9.1", "browserslist": "^4.28.2", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.49.0", "detect-indent": "^7.0.2", "find-up-simple": "^1.0.1", "globals": "^17.6.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regjsparser": "^0.13.1", "semver": "^7.8.4", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=10.4" } }, "sha512-mHYWvX948Q4H3bGc39bsNMxD/leOuNI+Iws9NVsoSz5VA7EGP86wnz7mZ/SPSvRhefT8L4hd8DHfDuGC+lIoCQ=="], "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.4.1", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ=="], @@ -1223,11 +1213,11 @@ "eslint-processor-vue-blocks": ["eslint-processor-vue-blocks@2.0.0", "", { "peerDependencies": { "@vue/compiler-sfc": "^3.3.0", "eslint": ">=9.0.0" } }, "sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -1245,7 +1235,7 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "eta": ["eta@4.5.0", "", {}, "sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g=="], + "eta": ["eta@4.5.1", "", {}, "sha512-EaNCGm+8XEIU7YNcc+THptWAO5NfKBHHARxt+wxZljj9bTr/+arRoOm9/MpGt4n6xn9fLnPFRSoLD0WFYGFUxQ=="], "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], @@ -1333,20 +1323,14 @@ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], "get-tsconfig": ["get-tsconfig@4.8.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg=="], - "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + "get-uri": ["get-uri@7.0.0", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "7.0.0", "debug": "^4.3.4" } }, "sha512-ZsC7KQxm1Hra8yO0RvMZ4lGJT7vnBtSNpEHKq39MPN7vjuvCiu1aQ8rkXUaIXG1y/TSDez97Gmv04ibnYqCp/A=="], "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], - "git-raw-commits": ["git-raw-commits@5.0.1", "", { "dependencies": { "@conventional-changelog/git-client": "^2.6.0", "meow": "^13.0.0" }, "bin": { "git-raw-commits": "src/cli.js" } }, "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ=="], - "git-up": ["git-up@8.1.1", "", { "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^9.2.0" } }, "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g=="], "git-url-parse": ["git-url-parse@16.1.0", "", { "dependencies": { "git-up": "^8.1.0" } }, "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw=="], @@ -1363,13 +1347,11 @@ "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - "got": ["got@14.6.6", "", { "dependencies": { "@sindresorhus/is": "^7.0.1", "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", "cacheable-request": "^13.0.12", "decompress-response": "^10.0.0", "form-data-encoder": "^4.0.2", "http2-wrapper": "^2.2.1", "keyv": "^5.5.3", "lowercase-keys": "^3.0.0", "p-cancelable": "^4.0.1", "responselike": "^4.0.2", "type-fest": "^4.26.1" } }, "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphql": ["graphql@16.14.2", "", {}, "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA=="], + "graphql": ["graphql@17.0.2", "", {}, "sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ=="], "graphql-http": ["graphql-http@1.22.4", "", { "peerDependencies": { "graphql": ">=0.11 <=16" } }, "sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA=="], @@ -1383,10 +1365,6 @@ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], @@ -1403,13 +1381,13 @@ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + "http-proxy-agent": ["http-proxy-agent@8.0.0", "", { "dependencies": { "agent-base": "8.0.0", "debug": "^4.3.4" } }, "sha512-7pose0uGgrCJeH2Qh4JcNhWZp3u/oNrWjNYDK4ydOLxOpTw8V8ogHFAmkz0VWq96JBFj4umVJpvmQi287rSYLg=="], "http-status": ["http-status@2.1.0", "", {}, "sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA=="], "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], - "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "https-proxy-agent": ["https-proxy-agent@8.0.0", "", { "dependencies": { "agent-base": "8.0.0", "debug": "^4.3.4" } }, "sha512-YYeW+iCnAS3xhvj2dvVoWgsbca3RfQy/IlaNHHOtDmU0jMqPI9euIq3Y9BJETdxk16h9NHHCKqp/KB9nIMStCQ=="], "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], @@ -1425,8 +1403,6 @@ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], @@ -1437,8 +1413,6 @@ "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], - "inquirer": ["inquirer@12.11.1", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/prompts": "^7.10.1", "@inquirer/type": "^3.0.10", "mute-stream": "^2.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw=="], - "inspect-with-kind": ["inspect-with-kind@1.0.5", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g=="], "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], @@ -1471,7 +1445,7 @@ "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - "is-immutable-type": ["is-immutable-type@5.0.4", "", { "dependencies": { "@typescript-eslint/type-utils": "^8.0.0", "ts-api-utils": "^2.0.0", "ts-declaration-location": "^1.0.4" }, "peerDependencies": { "eslint": "*", "typescript": ">=4.7.4" } }, "sha512-tDf0vB9dJJt/1USS2nvHJb8UsIAhs+pF6z8UZLNdhrzB+PKMrdcN45je9jhuFpaJOjJpoRhueFmFrRs5g/TNMA=="], + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], @@ -1491,7 +1465,7 @@ "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], - "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], @@ -1521,8 +1495,6 @@ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "json-stable-stringify": ["json-stable-stringify@1.3.0", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" } }, "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg=="], - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], "json-with-bigint": ["json-with-bigint@3.5.10", "", {}, "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w=="], @@ -1531,12 +1503,12 @@ "jsonc-eslint-parser": ["jsonc-eslint-parser@3.1.0", "", { "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^5.0.0", "semver": "^7.3.5" } }, "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng=="], - "jsonify": ["jsonify@0.0.1", "", {}, "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg=="], - "jsox": ["jsox@1.2.121", "", { "bin": { "jsox": "lib/cli.js" } }, "sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw=="], "kareem": ["kareem@2.6.3", "", {}, "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q=="], + "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], @@ -1635,8 +1607,6 @@ "marked": ["marked@14.0.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], @@ -1657,6 +1627,8 @@ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + "mdast-util-math": ["mdast-util-math@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "longest-streak": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.1.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w=="], + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.1.3", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ=="], "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], @@ -1695,6 +1667,8 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + "micromark-extension-math": ["micromark-extension-math@3.1.0", "", { "dependencies": { "@types/katex": "^0.16.0", "devlop": "^1.0.0", "katex": "^0.16.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg=="], + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.1", "", { "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg=="], "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], @@ -1761,7 +1735,7 @@ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], - "module-replacements": ["module-replacements@2.11.0", "", {}, "sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA=="], + "module-replacements": ["module-replacements@3.0.0", "", {}, "sha512-tHIZqde+RlyNRobAIjfcH5UIgIrEbZbDGRL6J/x+HERX/g8O9mrm0p6knJbsTXmQtDvZ+eFP+xfOP3/9jHk6YA=="], "monaco-editor": ["monaco-editor@0.55.1", "", { "dependencies": { "dompurify": "3.2.7", "marked": "14.0.0" } }, "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A=="], @@ -1781,7 +1755,7 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], @@ -1819,8 +1793,6 @@ "object-deep-merge": ["object-deep-merge@2.0.1", "", {}, "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg=="], - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - "object-to-formdata": ["object-to-formdata@4.5.1", "", {}, "sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw=="], "obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="], @@ -1833,13 +1805,13 @@ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], - "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ora": ["ora@9.0.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.2.2", "string-width": "^8.1.0", "strip-ansi": "^7.1.2" } }, "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A=="], + "ora": ["ora@9.3.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.1", "string-width": "^8.1.0" } }, "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw=="], - "os-name": ["os-name@6.1.0", "", { "dependencies": { "macos-release": "^3.3.0", "windows-release": "^6.1.0" } }, "sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg=="], + "os-name": ["os-name@7.0.0", "", { "dependencies": { "macos-release": "^3.4.0", "windows-release": "^7.1.0" } }, "sha512-/HfRU/lPPr4T2VigM+cvM3cU77es+XF4OEAa4aE5zpdvrxHGD2NmH0AFIWpMNAb+CsZL45rlcIO49Re0ZcRseg=="], "oxc-resolver": ["oxc-resolver@11.24.2", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.24.2", "@oxc-resolver/binding-android-arm64": "11.24.2", "@oxc-resolver/binding-darwin-arm64": "11.24.2", "@oxc-resolver/binding-darwin-x64": "11.24.2", "@oxc-resolver/binding-freebsd-x64": "11.24.2", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.24.2", "@oxc-resolver/binding-linux-arm-musleabihf": "11.24.2", "@oxc-resolver/binding-linux-arm64-gnu": "11.24.2", "@oxc-resolver/binding-linux-arm64-musl": "11.24.2", "@oxc-resolver/binding-linux-ppc64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-musl": "11.24.2", "@oxc-resolver/binding-linux-s390x-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-musl": "11.24.2", "@oxc-resolver/binding-openharmony-arm64": "11.24.2", "@oxc-resolver/binding-wasm32-wasi": "11.24.2", "@oxc-resolver/binding-win32-arm64-msvc": "11.24.2", "@oxc-resolver/binding-win32-x64-msvc": "11.24.2" } }, "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw=="], @@ -1853,9 +1825,9 @@ "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + "pac-proxy-agent": ["pac-proxy-agent@8.0.0", "", { "dependencies": { "agent-base": "8.0.0", "debug": "^4.3.4", "get-uri": "7.0.0", "http-proxy-agent": "8.0.0", "https-proxy-agent": "8.0.0", "pac-resolver": "8.0.0", "quickjs-wasi": "^0.0.1", "socks-proxy-agent": "9.0.0" } }, "sha512-HyCoVbyQ/nbVlQ/R6wBu0YXhbG2oAnEK5BQ3xMyj1OffQmU5NoOnpLzgPlKHaobUzz5NK0+AZHby4TdydAEBUA=="], - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + "pac-resolver": ["pac-resolver@8.0.0", "", { "dependencies": { "degenerator": "6.0.0", "netmask": "^2.0.2" }, "peerDependencies": { "quickjs-wasi": "^0.0.1" } }, "sha512-SVNzOxVq2zuTew3WAt7U8UghwzJzuWYuJryd3y8FxyLTZdjVoCzY8kLP39PpEqQCDvlMWdQXwViu0sYT3eiU2w=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], @@ -1929,6 +1901,8 @@ "postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="], @@ -1947,7 +1921,7 @@ "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="], - "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], + "proxy-agent": ["proxy-agent@7.0.0", "", { "dependencies": { "agent-base": "8.0.0", "debug": "^4.3.4", "http-proxy-agent": "8.0.0", "https-proxy-agent": "8.0.0", "lru-cache": "^7.14.1", "pac-proxy-agent": "8.0.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "9.0.0" } }, "sha512-okTgt79rHTvMHkr/Ney5rZpgCHh3g1g3tI5uhkgN5b7OeI3n0Q/ui1uv9OdrnZNJM9WIZJqZPh/UJs+YtO/TMQ=="], "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], @@ -1965,6 +1939,8 @@ "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + "quickjs-wasi": ["quickjs-wasi@0.0.1", "", {}, "sha512-fBWNLTBkxkLAhe1AzF1hyXEvuA+N+vV1WMP2D6iiMUblvmOt8Pp5t8zUcgvz7aYA1ldUdxDlgUse15dmcKjkNg=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], @@ -1995,11 +1971,9 @@ "regexp-ast-analysis": ["regexp-ast-analysis@0.7.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.1" } }, "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A=="], - "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], - "regjsparser": ["regjsparser@0.13.2", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ=="], - "release-it": ["release-it@19.2.4", "", { "dependencies": { "@nodeutils/defaults-deep": "1.1.0", "@octokit/rest": "22.0.1", "@phun-ky/typeof": "2.0.3", "async-retry": "1.3.3", "c12": "3.3.3", "ci-info": "^4.3.1", "eta": "4.5.0", "git-url-parse": "16.1.0", "inquirer": "12.11.1", "issue-parser": "7.0.1", "lodash.merge": "4.6.2", "mime-types": "3.0.2", "new-github-release-url": "2.0.0", "open": "10.2.0", "ora": "9.0.0", "os-name": "6.1.0", "proxy-agent": "6.5.0", "semver": "7.7.3", "tinyglobby": "0.2.15", "undici": "6.23.0", "url-join": "5.0.0", "wildcard-match": "5.1.4", "yargs-parser": "21.1.1" }, "bin": { "release-it": "bin/release-it.js" } }, "sha512-BwaJwQYUIIAKuDYvpqQTSoy0U7zIy6cHyEjih/aNaFICphGahia4cjDANuFXb7gVZ51hIK9W0io6fjNQWXqICg=="], + "release-it": ["release-it@20.2.1", "", { "dependencies": { "@inquirer/prompts": "8.4.2", "@octokit/rest": "22.0.1", "@phun-ky/typeof": "2.0.3", "async-retry": "1.3.3", "c12": "3.3.3", "ci-info": "^4.4.0", "defu": "^6.1.7", "eta": "4.5.1", "git-url-parse": "16.1.0", "issue-parser": "7.0.1", "lodash.merge": "4.6.2", "mime-types": "3.0.2", "new-github-release-url": "2.0.0", "open": "11.0.0", "ora": "9.3.0", "os-name": "7.0.0", "proxy-agent": "7.0.0", "semver": "7.7.4", "tinyglobby": "0.2.15", "undici": "7.28.0", "url-join": "5.0.0", "wildcard-match": "5.1.4", "yargs-parser": "22.0.0" }, "bin": { "release-it": "bin/release-it.js" } }, "sha512-xd0mqTGduwQlEzVBKOJcoVZxDrRLzjmFv3W8tWwkPIPDYtwYBWYjULiSk6VhfuGKocfz7GmptAqViKMQV4Zzbw=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], @@ -2029,12 +2003,8 @@ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - "run-async": ["run-async@4.0.6", "", {}, "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], - "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], @@ -2059,9 +2029,7 @@ "semver-truncate": ["semver-truncate@3.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "sharp": ["sharp@0.35.3", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.5" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.3", "@img/sharp-darwin-x64": "0.35.3", "@img/sharp-freebsd-wasm32": "0.35.3", "@img/sharp-libvips-darwin-arm64": "1.3.2", "@img/sharp-libvips-darwin-x64": "1.3.2", "@img/sharp-libvips-linux-arm": "1.3.2", "@img/sharp-libvips-linux-arm64": "1.3.2", "@img/sharp-libvips-linux-ppc64": "1.3.2", "@img/sharp-libvips-linux-riscv64": "1.3.2", "@img/sharp-libvips-linux-s390x": "1.3.2", "@img/sharp-libvips-linux-x64": "1.3.2", "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", "@img/sharp-libvips-linuxmusl-x64": "1.3.2", "@img/sharp-linux-arm": "0.35.3", "@img/sharp-linux-arm64": "0.35.3", "@img/sharp-linux-ppc64": "0.35.3", "@img/sharp-linux-riscv64": "0.35.3", "@img/sharp-linux-s390x": "0.35.3", "@img/sharp-linux-x64": "0.35.3", "@img/sharp-linuxmusl-arm64": "0.35.3", "@img/sharp-linuxmusl-x64": "0.35.3", "@img/sharp-webcontainers-wasm32": "0.35.3", "@img/sharp-win32-arm64": "0.35.3", "@img/sharp-win32-ia32": "0.35.3", "@img/sharp-win32-x64": "0.35.3" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -2083,7 +2051,7 @@ "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], - "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + "socks-proxy-agent": ["socks-proxy-agent@9.0.0", "", { "dependencies": { "agent-base": "8.0.0", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-fFlbMlfsXhK02ZB8aZY7Hwxh/IHBV9b1Oq9bvBk6tkFWXvdAxUgA0wbw/NYR5liU3Y5+KI6U4FH3kYJt9QYv0w=="], "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="], @@ -2117,7 +2085,7 @@ "std-env": ["std-env@4.2.0", "", {}, "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw=="], - "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + "stdin-discarder": ["stdin-discarder@0.3.2", "", {}, "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A=="], "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], @@ -2125,7 +2093,7 @@ "string-ts": ["string-ts@2.3.1", "", {}, "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -2139,7 +2107,7 @@ "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], "strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="], @@ -2197,8 +2165,6 @@ "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], - "ts-declaration-location": ["ts-declaration-location@1.0.7", "", { "dependencies": { "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": ">=4.0.0" } }, "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA=="], - "ts-essentials": ["ts-essentials@10.0.3", "", { "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw=="], "ts-pattern": ["ts-pattern@5.9.0", "", {}, "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg=="], @@ -2213,7 +2179,7 @@ "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], @@ -2225,7 +2191,7 @@ "undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], - "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], @@ -2233,6 +2199,8 @@ "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], @@ -2285,19 +2253,19 @@ "wildcard-match": ["wildcard-match@5.1.4", "", {}, "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g=="], - "windows-release": ["windows-release@6.1.0", "", { "dependencies": { "execa": "^8.0.1" } }, "sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA=="], + "windows-release": ["windows-release@7.1.1", "", { "dependencies": { "powershell-utils": "^0.2.0" } }, "sha512-0GBwC9WmR8Bm3WYiz3FC391054BsFHZ2gzBVdYj9uj5eIVYzbn/YPYCYW9SWdh9vwnLuzpn1UGwJKiMG4F236w=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], "ws": ["ws@8.21.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw=="], - "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], @@ -2313,9 +2281,9 @@ "yaml-eslint-parser": ["yaml-eslint-parser@2.1.0", "", { "dependencies": { "eslint-visitor-keys": "^5.0.0", "yaml": "^2.0.0" } }, "sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w=="], - "yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], "yauzl": ["yauzl@3.4.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw=="], @@ -2325,8 +2293,6 @@ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], - "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], - "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], @@ -2339,33 +2305,31 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@commitlint/config-conventional/conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@9.3.1", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw=="], - "@commitlint/config-validator/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + "@commitlint/parse/conventional-changelog-angular": ["conventional-changelog-angular@9.2.1", "", { "dependencies": { "@conventional-changelog/template": "^1.2.1" } }, "sha512-oWSL6ZhnXbYraOFTK3PgRAQJ8fADDAEv5K6AdeyQPLvjFmhG8+ejL0jZZp/R7vTmGJaBvZEE+sE7dB4bCv7sAw=="], + + "@commitlint/read/@conventional-changelog/git-client": ["@conventional-changelog/git-client@3.1.0", "", { "dependencies": { "@simple-libs/child-process-utils": "^2.0.0", "@simple-libs/stream-utils": "^2.0.0", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^6.0.1", "conventional-commits-parser": "^7.0.1" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-Tqa/gHco2WJWa740NRjOrfKVvzIqxkZpecb8bemaQ8sKM5PXb1UK4uTyTb/1wIqNuOVaDOFxyBdhTIQZn6gdjQ=="], + + "@conventional-changelog/git-client/conventional-commits-parser": ["conventional-commits-parser@6.4.0", "", { "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { "conventional-commits-parser": "dist/cli/index.js" } }, "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw=="], + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], "@emotion/babel-plugin/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "@emotion/serialize/csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "@es-joy/jsdoccomment/comment-parser": ["comment-parser@1.4.7", "", {}, "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ=="], - "@eslint-community/eslint-plugin-eslint-comments/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@eslint/compat/@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "@eslint/config-array/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - - "@eslint/eslintrc/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@eslint/markdown/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], - "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + "@img/sharp-freebsd-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.3", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w=="], + + "@img/sharp-webcontainers-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.3", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w=="], "@lexical/react/react-error-boundary": ["react-error-boundary@6.1.2", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-3DpCr5HVdZ0caUjYE/kIHBEJN0mNP3ZCgf16c48uJ5TbWjorKVp+YG8W3XqlJ7vJAVNw6wNIImyPXmFydwmyng=="], @@ -2379,14 +2343,20 @@ "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + "@stylistic/eslint-plugin/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "@stylistic/eslint-plugin/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "@types/busboy/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + "@types/react/csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "@types/ws/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -2399,15 +2369,19 @@ "binary-version/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + "buffer-image-size/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + "c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "cacheable-request/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "conventional-changelog/conventional-commits-parser": ["conventional-commits-parser@6.4.0", "", { "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { "conventional-commits-parser": "dist/cli/index.js" } }, "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw=="], + + "conventional-commits-parser/@simple-libs/stream-utils": ["@simple-libs/stream-utils@2.0.0", "", {}, "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ=="], - "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "conventional-recommended-bump/conventional-commits-parser": ["conventional-commits-parser@6.4.0", "", { "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { "conventional-commits-parser": "dist/cli/index.js" } }, "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw=="], "copyfiles/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -2417,34 +2391,14 @@ "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "eslint-flat-config-utils/@eslint/config-helpers": ["@eslint/config-helpers@0.5.5", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w=="], - "eslint-plugin-jsdoc/@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.86.0", "", { "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.58.0", "comment-parser": "1.4.6", "esquery": "^1.7.0", "jsdoc-type-pratt-parser": "~7.2.0" } }, "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw=="], - - "eslint-plugin-jsdoc/espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], - - "eslint-plugin-jsonc/@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "eslint-plugin-jsonc/@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], - "eslint-plugin-n/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], "eslint-plugin-n/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], - "eslint-plugin-regexp/comment-parser": ["comment-parser@1.4.7", "", {}, "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ=="], - - "eslint-plugin-toml/@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "eslint-plugin-toml/@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], - - "eslint-plugin-unicorn/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], - - "eslint-plugin-yml/@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "eslint-plugin-yml/@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], - "eslint-plugin-yml/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "espree/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], @@ -2459,14 +2413,14 @@ "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "happy-dom/@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], + "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "jsonc-eslint-parser/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "jsonc-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "make-asynchronous/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], @@ -2485,6 +2439,8 @@ "mdast-util-gfm-task-list-item/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + "mdast-util-math/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + "mdast-util-mdx-jsx/mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -2497,14 +2453,14 @@ "new-github-release-url/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + "next/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "noms/readable-stream": ["readable-stream@1.0.34", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "nypm/citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], - "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "ora/string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -2515,20 +2471,16 @@ "payload/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "pino-pretty/strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], - "react-datepicker/date-fns": ["date-fns@3.6.0", "", {}, "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww=="], "react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "release-it/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "release-it/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "release-it/tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "release-it/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "rimraf/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "seek-bzip/commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], @@ -2539,37 +2491,37 @@ "spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-dirs/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], "through2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "toml-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], "vite/postcss": ["postcss@8.5.19", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ=="], - "vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "vue-eslint-parser/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], - "which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "vue-eslint-parser/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - "windows-release/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + "which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "windows-release/powershell-utils": ["powershell-utils@0.2.0", "", {}, "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw=="], "xss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "yaml-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "@commitlint/read/@conventional-changelog/git-client/@simple-libs/child-process-utils": ["@simple-libs/child-process-utils@2.0.0", "", { "dependencies": { "@simple-libs/stream-utils": "^2.0.0" } }, "sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A=="], + + "@commitlint/read/@conventional-changelog/git-client/@simple-libs/stream-utils": ["@simple-libs/stream-utils@2.0.0", "", {}, "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ=="], + + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], - "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "@stylistic/eslint-plugin/espree/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@types/busboy/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "@types/ws/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], @@ -2587,55 +2539,85 @@ "binary-version/execa/strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], - "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "buffer-image-size/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "copyfiles/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], "copyfiles/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + "copyfiles/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "copyfiles/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "eslint-flat-config-utils/@eslint/config-helpers/@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], - "eslint-plugin-jsdoc/espree/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], - "eslint-plugin-jsdoc/espree/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "happy-dom/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - "glob/minimatch/brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "next/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "next/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - "noms/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + "next/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - "noms/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + "next/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - "payload/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "next/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - "rimraf/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "next/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "next/sharp/@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], - "through2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "next/sharp/@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "next/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "next/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "next/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "next/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "next/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "next/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "next/sharp/@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "next/sharp/@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "next/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "next/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], - "windows-release/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + "next/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], - "windows-release/execa/human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + "next/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], - "windows-release/execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + "next/sharp/@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], - "windows-release/execa/npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + "next/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], - "windows-release/execa/onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + "next/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - "windows-release/execa/strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + "noms/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + + "payload/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "rimraf/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "through2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "vue-eslint-parser/espree/acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "vue-eslint-parser/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], @@ -2643,12 +2625,22 @@ "copyfiles/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], + "copyfiles/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "copyfiles/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "windows-release/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + "copyfiles/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], "copyfiles/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "copyfiles/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "copyfiles/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], } } diff --git a/dev/.env.example b/dev/.env.example index 5319688..036695c 100644 --- a/dev/.env.example +++ b/dev/.env.example @@ -1,2 +1,3 @@ DATABASE_URI= PAYLOAD_SECRET= +USE_HTTPS=true diff --git a/dev/app/(payload)/admin/importMap.js b/dev/app/(payload)/admin/importMap.js index eb1ae47..af86423 100644 --- a/dev/app/(payload)/admin/importMap.js +++ b/dev/app/(payload)/admin/importMap.js @@ -1,5 +1,6 @@ import { CollectionCards as CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } from '@payloadcms/next/rsc' +/** @type import('payload').ImportMap */ export const importMap = { "@payloadcms/next/rsc#CollectionCards": CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } diff --git a/dev/collections/Media.ts b/dev/collections/Media.ts index 6ab362d..8fbf336 100644 --- a/dev/collections/Media.ts +++ b/dev/collections/Media.ts @@ -1,8 +1,9 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { CollectionConfig } from 'payload'; -import { anyone } from 'helpers/access/anyone.js'; -import { authenticated } from 'helpers/access/authenticated.js'; + +import { anyone } from '../helpers/access/anyone.js'; +import { authenticated } from '../helpers/access/authenticated.js'; const filename = fileURLToPath(import.meta.url); const dirname = path.dirname(filename); diff --git a/dev/collections/media/after-middleplage.png b/dev/collections/media/after-middleplage.png new file mode 100644 index 0000000..a120d57 Binary files /dev/null and b/dev/collections/media/after-middleplage.png differ diff --git a/dev/globals/Nav.ts b/dev/globals/Nav.ts new file mode 100644 index 0000000..664b6ab --- /dev/null +++ b/dev/globals/Nav.ts @@ -0,0 +1,22 @@ +import type { GlobalConfig } from 'payload'; + +export const navigation: GlobalConfig = { + slug: 'navigation', + access: { + read: () => true, + readVersions: () => true, + update: () => true, + }, + fields: [ + { + name: 'name', + type: 'text', + defaultValue: 'nav item name', + }, + { + name: 'link', + type: 'text', + defaultValue: 'nav item href', + }, + ], +}; diff --git a/dev/payload-types.ts b/dev/payload-types.ts index 95aa61a..03fe5d0 100644 --- a/dev/payload-types.ts +++ b/dev/payload-types.ts @@ -92,9 +92,11 @@ export interface Config { }; fallbackLocale: null; globals: { + navigation: Navigation; 'payload-jobs-stats': PayloadJobsStat; }; globalsSelect: { + navigation: NavigationSelect | NavigationSelect; 'payload-jobs-stats': PayloadJobsStatsSelect | PayloadJobsStatsSelect; }; locale: null; @@ -184,13 +186,12 @@ export interface User { export interface AuditLog { id: string; operation: string; - onCollection: string; - documentId?: string | null; - user: string | User; + identifier: string; + scope: 'collection' | 'global'; userAgent?: string | null; hook?: string | null; - type: 'info' | 'debug' | 'warning' | 'error' | 'audit' | 'security' | 'unknown'; createdAt: string; + 'new-fields'?: string | null; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -419,13 +420,12 @@ export interface UsersSelect { */ export interface AuditLogSelect { operation?: T; - onCollection?: T; - documentId?: T; - user?: T; + identifier?: T; + scope?: T; userAgent?: T; hook?: T; - type?: T; createdAt?: T; + 'new-fields'?: T; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -499,6 +499,17 @@ export interface PayloadMigrationsSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "navigation". + */ +export interface Navigation { + id: string; + name?: string | null; + link?: string | null; + updatedAt?: string | null; + createdAt?: string | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-jobs-stats". @@ -517,6 +528,17 @@ export interface PayloadJobsStat { updatedAt?: string | null; createdAt?: string | null; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "navigation_select". + */ +export interface NavigationSelect { + name?: T; + link?: T; + updatedAt?: T; + createdAt?: T; + globalType?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-jobs-stats_select". diff --git a/dev/payload.config.ts b/dev/payload.config.ts index d9c7ddf..02dbcb7 100644 --- a/dev/payload.config.ts +++ b/dev/payload.config.ts @@ -3,14 +3,17 @@ import sharp from 'sharp'; import path from 'node:path'; import { buildConfig } from 'payload'; import { fileURLToPath } from 'node:url'; +import type { CollectionConfig } from 'payload'; // import { auditorPlugin } from 'payload-auditor'; import { mongooseAdapter } from '@payloadcms/db-mongodb'; import { lexicalEditor } from '@payloadcms/richtext-lexical'; +import { navigation } from './globals/Nav.js'; import { media } from './collections/Media.js'; import { users } from './collections/Users.js'; -// import { auditorPlugin } from './../dist/index.js'; -import { auditorPlugin } from '../src/index.js'; +// eslint-disable-next-line antfu/no-import-dist +import { auditorPlugin } from './../dist/index.js'; +// import { auditorPlugin } from '../src/index.js'; import { testEmailAdapter } from './helpers/testEmailAdapter.js'; const filename = fileURLToPath(import.meta.url); @@ -21,39 +24,59 @@ if (!process.env.ROOT_DIR) { } export default buildConfig({ - admin: { importMap: { baseDir: path.resolve(dirname) } }, + admin: { importMap: { baseDir: path.resolve(dirname) }, + + }, collections: [media, users], - db: mongooseAdapter({ url: process.env.DATABASE_URI || '', connectOptions: { - dbName: 'payload-auditor-db', - appName: 'payload-auditor-app', - } }), + globals: [navigation], + + db: mongooseAdapter({ + url: process.env.DATABASE_URI || '', + connectOptions: { + dbName: 'payload-auditor-db', + appName: 'payload-auditor-app', + }, + }), editor: lexicalEditor(), email: testEmailAdapter, // plugins plugins: [ auditorPlugin({ - automation: { logCleanup: { cronTime: '*/1 * * * *', queueName: 'test', olderThan: 30000 } }, - collection: { - // configureRootCollection(defaults) { - // return { - // ...defaults, - // slug: 'some-name', - // labels: { - // singular: 'some-name', - // plural: 'some-names', - // }, - // }; - // }, - trackCollections: [ + automation: { + logCleanup: { cronTime: '0/1 * * * *', queueName: 'test', olderThan: 60000 }, + }, + configureRootCollection: (collection) => { + const newCollection = { + ...collection, + fields: [ + ...collection.fields, + { + name: 'new-fields', + type: 'text', + defaultValue: 'test new fields value', + }, + ], + } as CollectionConfig; + return newCollection; + }, + globals: { + track: [ + { + slug: 'navigation', + hooks: { + beforeRead: true, + }, + }, + ], + }, + collections: { + track: [ { slug: 'media', hooks: { afterOperation: { updateByID: { enabled: true, - modes: { - debug: {}, - }, }, }, }, @@ -62,6 +85,7 @@ export default buildConfig({ }, }), ], + secret: process.env.PAYLOAD_SECRET || 'test-secret_key', sharp, typescript: { diff --git a/eslint.config.mjs b/eslint.config.mjs index 1f71965..dfe186e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,11 +8,7 @@ const ignoreFiles = [ '**/.temp', '**/.*', // ignore all dotfiles '**/.git', - '**/.hg', - '**/.pnp.*', - '**/.svn', '**/playwright.config.ts', - '**/jest.config.js', '**/tsconfig.tsbuildinfo', '**/README.md', '**/payload-types.ts', @@ -32,8 +28,6 @@ export default antfu( semi: true, }, - typescript: true, - // Configuration preferences lessOpinionated: true, // Ignored paths @@ -74,6 +68,7 @@ export default antfu( 'import/order': 'off', 'sort-imports': 'off', 'ts/ban-ts-comment': 'off', + 'ts/consistent-type-definitions': 'off', 'unused-imports/no-unused-imports': ['error'], }, }, diff --git a/package.json b/package.json index da58b80..090421f 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "node": ">=24" }, "scripts": { - "build:safe": "npm run test && npm run check-types && npm run lint && npm run copyfiles && npm run build:types && npm run build:swc", + "build:safe": "npm run test:unit && npm run check-types && npm run lint && npm run copyfiles && npm run build:types && npm run build:swc", "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", "build": "npm run copyfiles && npm run build:types && npm run build:swc", "build:types": "tsc --outDir dist --rootDir ./src", @@ -71,57 +71,57 @@ "check-types": "npx tsc --noEmit --pretty", "prepublishOnly": "npm run clean && npm run build", "test:plugin": "npm run clean && npm run build && npm run link && npm run --dir ./dev link payload-auditor && npm run dev", - "test:watch": "vitest --reporter=verbose", - "test": "vitest run", + "test:watch": "vitest", + "test:unit": "vitest run", "commit": "cz", "sync-main": "git fetch origin main && git rebase origin/main", "sync-main:fork": "git fetch upstream main && git rebase upstream/main", - "release": "release-it --config .release-it.ts", - "pre-release": "release-it --config .release-it.prerelease.ts --preRelease=beta" + "release": "release-it --config .release-it.ts --ci", + "pre-release": "release-it --config .release-it.prerelease.ts --preReleaseBase=1 --ci" }, "peerDependencies": { "payload": "^3.76.1" }, "devDependencies": { - "@antfu/eslint-config": "^7.4.3", - "@commitlint/cli": "^20.4.1", - "@commitlint/config-conventional": "^20.4.1", - "@eslint-react/eslint-plugin": "^2.12.4", - "@next/eslint-plugin-next": "^16.0.6", - "@payloadcms/db-mongodb": "^3.76.1", - "@payloadcms/next": "^3.76.1", - "@payloadcms/richtext-lexical": "^3.76.1", - "@payloadcms/translations": "^3.76.1", - "@payloadcms/ui": "^3.76.1", - "@release-it/conventional-changelog": "^10.0.1", - "@swc-node/register": "^1.11.1", - "@swc/cli": "^0.8.0", - "@swc/core": "^1.15.11", - "@types/node": "^25.2.3", - "@types/react": "^19.2.14", + "@antfu/eslint-config": "^9.1.0", + "@commitlint/cli": "^21.2.1", + "@commitlint/config-conventional": "^21.2.0", + "@eslint-react/eslint-plugin": "^5.17.1", + "@next/eslint-plugin-next": "^16.2.10", + "@payloadcms/db-mongodb": "^3.86.0", + "@payloadcms/next": "^3.86.0", + "@payloadcms/richtext-lexical": "^3.86.0", + "@payloadcms/translations": "^3.86.0", + "@payloadcms/ui": "^3.86.0", + "@release-it/conventional-changelog": "^11.0.1", + "@swc-node/register": "^1.12.1", + "@swc/cli": "^0.8.1", + "@swc/core": "^1.15.43", + "@types/node": "^26.1.1", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript/native-preview": "^7.0.0-dev.20260629.1", - "conventional-changelog-conventionalcommits": "^8.0.0", + "@typescript/native-preview": "^7.0.0-dev.20260707.2", + "conventional-changelog-conventionalcommits": "^10.2.1", "copyfiles": "2.4.1", "cross-env": "^10.1.0", - "cz-git": "^1.11.1", - "eslint": "^9.39.1", - "eslint-plugin-perfectionist": "^5.5.0", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.0", - "graphql": "^16.12.0", + "cz-git": "^1.13.1", + "eslint": "^10.7.0", + "eslint-plugin-perfectionist": "^5.10.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.3", + "graphql": "^17.0.2", "lefthook": "^2.1.10", - "next": "^16.2.0-canary.10", - "payload": "^3.76.1", + "next": "^16.2.10", + "payload": "^3.86.0", "payload-auditor": "^1.11.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "release-it": "^19.0.6", - "rimraf": "^6.1.2", - "sharp": "^0.34.5", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "release-it": "^20.2.1", + "rimraf": "^6.1.3", + "sharp": "^0.35.3", "type-fest": "^5.8.0", - "typescript": "^5.9.3", - "vitest": "^4.0.18" + "typescript": "6", + "vitest": "^4.1.10" }, "publishConfig": { "exports": { diff --git a/src/Constant/Constant.ts b/src/Constant/Constant.ts deleted file mode 100644 index 652c995..0000000 --- a/src/Constant/Constant.ts +++ /dev/null @@ -1,227 +0,0 @@ -import type { LabelFunction, StaticLabel } from 'payload'; - -import type { AllCollectionHooks } from './../types/pluginOptions.js'; -import { sharedLogic } from './../core/log-builders/collections/shared.js'; - -interface DefaultCollectionValues { - labels: - | { - plural?: LabelFunction | StaticLabel | undefined; - singular?: LabelFunction | StaticLabel; - } - | undefined; - slug: string; -} - -export const defaultCollectionValues: DefaultCollectionValues = { - slug: 'Audit-log', - labels: { - plural: 'Audit-logs', - singular: 'Audit-log', - }, -}; - -export const defaultPluginOpts = { - collection: { - trackCollections: [], - }, - enabled: true, -}; - -export const hookMap: AllCollectionHooks = { - afterChange: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterChange', - operation: args.operation, - req: args.req, - }); - - return args.doc; - }, - afterDelete: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterDelete', - operation: 'delete', - req: args.req, - }); - - return {}; - }, - afterError: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterError', - operation: 'error', - req: args.req, - }); - - return {}; - }, - afterForgotPassword: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterForgotPassword', - operation: 'forgotPassword', - req: args.args.req, - }); - - return {}; - }, - afterLogin: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterLogin', - operation: 'delete', - req: args.req, - }); - - return {}; - }, - afterLogout: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterLogout', - operation: 'logout', - req: args.req, - }); - - return {}; - }, - afterMe: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterMe', - operation: 'me', - req: args.req, - }); - - return {}; - }, - afterOperation: async (args) => { - await sharedLogic(args, { - collection: args.collection, - // @ts-ignore - context: args.context, - hook: 'afterOperation', - // @ts-ignore - operation: args.operation, - req: args.req, - }); - return args.result; - }, - afterRead: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterRead', - operation: 'read', - req: args.req, - }); - - return args.doc; - }, - afterRefresh: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'afterRefresh', - operation: 'refresh', - req: args.req, - }); - return {}; - }, - beforeChange: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeChange', - operation: args.operation, - req: args.req, - }); - - return args.data; - }, - beforeDelete: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeDelete', - operation: 'delete', - req: args.req, - }); - - return {}; - }, - beforeLogin: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeLogin', - operation: 'read', - req: args.req, - }); - return args.user; - }, - // @ts-ignore - beforeOperation: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeOperation', - // @ts-ignore - operation: args.operation, - req: args.req, - }); - return args; - }, - beforeRead: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeRead', - operation: 'read', - req: args.req, - }); - - return args.doc; - }, - beforeValidate: async (args) => { - await sharedLogic(args, { - collection: args.collection, - context: args.context, - hook: 'beforeValidate', - operation: args.operation, - req: args.req, - }); - return args.data; - }, - me: async (args) => { - await sharedLogic(args, { - collection: args.args.collection.config, - // @ts-ignore - context: args.context, - hook: 'me', - operation: 'me', - req: args.args.req, - }); - }, - refresh: async (args) => { - await sharedLogic(args, { - collection: args.args.collection.config, - // @ts-ignore - context: args.context, - hook: 'refresh', - operation: 'refresh', - req: args.args.req, - }); - }, -}; diff --git a/src/collections/access/index.ts b/src/collections/access/index.ts deleted file mode 100644 index bc7095d..0000000 --- a/src/collections/access/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Access } from 'payload'; - -export const adminAccess: Access = (): boolean => { - return true; -}; diff --git a/src/collections/auditor.ts b/src/collections/auditor.ts index 700ffca..1c47ba4 100644 --- a/src/collections/auditor.ts +++ b/src/collections/auditor.ts @@ -1,36 +1,28 @@ import type { CollectionConfig } from 'payload'; -import { defaultCollectionValues } from '../Constant/Constant.js'; -import type { hookTypes } from './../pluginUtils/configHelpers.js'; -import type { AuditHookOperationType } from '../types/pluginOptions.js'; +import type { GlobalHooksKeys } from '../types/global.js'; +import type { CollectionHooksKeys, CollectionHooksOperation } from '../types/collection.js'; export interface AuditorLog { - onCollection: string; - documentId?: string; - hook: (typeof hookTypes)[number]; - operation: AuditHookOperationType; + scope: 'collection' | 'global' | 'field'; + hook: CollectionHooksKeys | GlobalHooksKeys; + operation: CollectionHooksOperation; timestamp: Date; - type: 'audit' | 'debug' | 'error' | 'info' | 'security' | 'unknown' | 'warning'; - user: unknown; userAgent?: string; + identifier: string; } export type TypedRootCollection = typeof auditor; -export const auditor: CollectionConfig = { - slug: defaultCollectionValues.slug, - access: { - admin: () => false, - create: () => false, - delete: () => false, - read: () => false, - readVersions: () => false, - unlock: () => false, - update: () => false, +export const auditor = { + slug: 'Audit-log', + labels: { + plural: 'Audit-logs', + singular: 'Audit-log', }, admin: { - defaultColumns: ['operation', 'type', 'collection', 'user', 'timestamp'], - useAsTitle: 'type', + defaultColumns: ['operation', 'hook', 'identifier', 'scope', 'timestamp', 'createdAt'], + useAsTitle: 'operation', }, fields: [ { @@ -39,19 +31,24 @@ export const auditor: CollectionConfig = { required: true, }, { - name: 'onCollection', + name: 'identifier', type: 'text', required: true, }, { - name: 'documentId', - type: 'text', - }, - { - name: 'user', - type: 'relationship', - relationTo: 'users', + name: 'scope', + type: 'select', required: true, + options: [ + { + value: 'collection', + label: 'Collection', + }, + { + value: 'global', + label: 'Global', + }, + ], }, { name: 'userAgent', @@ -61,15 +58,6 @@ export const auditor: CollectionConfig = { name: 'hook', type: 'text', }, - { - name: 'type', - type: 'select', - defaultValue: 'info', - options: ['info', 'debug', 'warning', 'error', 'audit', 'security', 'unknown'] as Array< - AuditorLog['type'] - >, - required: true, - }, { name: 'createdAt', type: 'date', @@ -80,8 +68,7 @@ export const auditor: CollectionConfig = { required: true, }, ], - labels: defaultCollectionValues.labels, timestamps: false, -}; +} as const satisfies CollectionConfig; export default auditor; diff --git a/src/core/automation/tasks/cleanup/cleanup.test.ts b/src/core/automation/tasks/cleanup/cleanup.test.ts index cd6e026..5c2915a 100644 --- a/src/core/automation/tasks/cleanup/cleanup.test.ts +++ b/src/core/automation/tasks/cleanup/cleanup.test.ts @@ -1,7 +1,8 @@ import type { TaskConfig } from 'payload'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import type { PluginOptions } from '../../../../types/pluginOptions.js'; +import { auditor } from '../../../../collections/auditor.js'; +import type { PluginConfig } from '../../../../types/config.js'; import { CLEANUP_TASK_LABEL, CLEANUP_TASK_SLUG, cleanupLogsTask, DEFAULT_CRON_TIME, DEFAULT_OLDER_THAN, DEFAULT_QUEUE_NAME } from './cleanup.js'; const mockPluginConfig = { @@ -12,7 +13,7 @@ const mockPluginConfig = { queueName: DEFAULT_QUEUE_NAME, }, }, -} as const satisfies PluginOptions; +} as const satisfies PluginConfig; const mockReq = { payload: { @@ -30,7 +31,7 @@ describe('cleanupLogsTask', () => { }); it('should return expected task', () => { - const result = cleanupLogsTask(mockPluginConfig); + const result = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig: mockPluginConfig }); const expectedResultInstance = { handler: expect.any(Function), @@ -52,8 +53,7 @@ describe('cleanupLogsTask', () => { describe('handler task', () => { it('should call payload.delete with correct parameters', async () => { - const pluginOptions: PluginOptions = {}; - const task = cleanupLogsTask(pluginOptions); + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig: mockPluginConfig }); typeof task.handler === 'function' && await task .handler({ @@ -73,15 +73,15 @@ describe('cleanupLogsTask', () => { }); it('should use configureRootCollection result when provided', async () => { - const configuredSlug = 'configured-audit-logs'; - const pluginOptions: PluginOptions = { - collection: { - configureRootCollection: vi.fn().mockReturnValue({ slug: configuredSlug }), - trackCollections: [], + const pluginConfig: PluginConfig = { + configureRootCollection: vi.fn().mockReturnValue({ slug: auditor.slug }), + collections: { + track: [], }, }; - const task = cleanupLogsTask(pluginOptions); + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); + typeof task.handler === 'function' && await task .handler({ // @ts-expect-error @@ -89,14 +89,14 @@ describe('cleanupLogsTask', () => { }); expect(mockReq.payload.delete).toHaveBeenCalledWith({ - collection: configuredSlug, + collection: auditor.slug, where: expect.any(Object), }); }); it('should use custom olderThan value', async () => { const customOlderThan = 86400000; // 1 day - const pluginOptions: PluginOptions = { + const pluginConfig: PluginConfig = { automation: { logCleanup: { olderThan: customOlderThan, @@ -104,14 +104,12 @@ describe('cleanupLogsTask', () => { }, }; - const task = cleanupLogsTask(pluginOptions); + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); typeof task.handler === 'function' && await task.handler({ // @ts-expect-error req: mockReq, }); - const expectedDate = new Date(Date.now() - customOlderThan).toISOString(); - expect(mockReq.payload.delete).toHaveBeenCalledWith({ collection: 'Audit-log', where: { @@ -123,12 +121,12 @@ describe('cleanupLogsTask', () => { const callArgs = mockReq.payload.delete.mock.calls[0][0]; const lessThanValue = callArgs.where.createdAt.less_than; - expect(lessThanValue).toBe(expectedDate); + expect(lessThanValue).toEqual(expect.any(String)); }); it('should return empty output object', async () => { - const pluginOptions: PluginOptions = {}; - const task = cleanupLogsTask(pluginOptions); + const pluginConfig: Partial = {}; + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); const result = typeof task.handler === 'function' && await task.handler({ // @ts-expect-error @@ -142,8 +140,8 @@ describe('cleanupLogsTask', () => { const mockError = new Error('Database connection failed'); mockReq.payload.delete.mockRejectedValueOnce(mockError); - const pluginOptions: PluginOptions = {}; - const task = cleanupLogsTask(pluginOptions); + const pluginConfig: Partial = {}; + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); typeof task.handler === 'function' && await task.handler({ // @ts-expect-error @@ -159,8 +157,8 @@ describe('cleanupLogsTask', () => { it('should not throw error when payload.delete fails', async () => { mockReq.payload.delete.mockRejectedValueOnce(new Error('Database error')); - const pluginOptions: PluginOptions = {}; - const task = cleanupLogsTask(pluginOptions); + const pluginConfig: Partial = {}; + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); await expect( typeof task.handler === 'function' && task.handler({ @@ -173,8 +171,9 @@ describe('cleanupLogsTask', () => { it('should log error with correct message', async () => { mockReq.payload.delete.mockRejectedValueOnce(new Error('Any error')); - const pluginOptions: PluginOptions = {}; - const task = cleanupLogsTask(pluginOptions); + const pluginConfig: Partial = {}; + + const task = cleanupLogsTask({ internalCollectionConfig: auditor, pluginConfig }); typeof task.handler === 'function' && await task.handler({ // @ts-expect-error diff --git a/src/core/automation/tasks/cleanup/cleanup.ts b/src/core/automation/tasks/cleanup/cleanup.ts index 6c682c0..fbf42d3 100644 --- a/src/core/automation/tasks/cleanup/cleanup.ts +++ b/src/core/automation/tasks/cleanup/cleanup.ts @@ -1,7 +1,6 @@ -import type { TaskConfig } from 'payload'; +import type { CollectionConfig, TaskConfig } from 'payload'; -import auditor from '../../../../collections/auditor.js'; -import type { PluginOptions } from '../../../../types/pluginOptions.js'; +import type { PluginConfig } from '../../../../types/config.js'; export const DEFAULT_OLDER_THAN = 604800000; // 1 week export const DEFAULT_CRON_TIME = '0 3 * * *'; // At 03:00 AM @@ -9,12 +8,15 @@ export const DEFAULT_QUEUE_NAME = 'payload-auditor-queue'; // default queue name export const CLEANUP_TASK_SLUG = 'cleanup-payload-auditor-log'; export const CLEANUP_TASK_LABEL = 'payload auditor - cleanup logs'; -export const cleanupLogsTask = (pluginOptions: PluginOptions): TaskConfig => { - const cronTime = pluginOptions.automation?.logCleanup?.cronTime ?? DEFAULT_CRON_TIME; - const queueName = pluginOptions.automation?.logCleanup?.queueName ?? DEFAULT_QUEUE_NAME; - const olderThan = pluginOptions.automation?.logCleanup?.olderThan ?? DEFAULT_OLDER_THAN; - const collectionSlug - = pluginOptions.collection?.slug ?? pluginOptions.collection?.configureRootCollection?.(auditor).slug ?? 'Audit-log'; +type CleanupLogsTaskParams = { + pluginConfig: PluginConfig; + internalCollectionConfig: CollectionConfig; +}; +export const cleanupLogsTask = (params: CleanupLogsTaskParams): TaskConfig => { + const cronTime = params.pluginConfig.automation?.logCleanup?.cronTime ?? DEFAULT_CRON_TIME; + const queueName = params.pluginConfig.automation?.logCleanup?.queueName ?? DEFAULT_QUEUE_NAME; + const olderThan = params.pluginConfig.automation?.logCleanup?.olderThan ?? DEFAULT_OLDER_THAN; + return { slug: CLEANUP_TASK_SLUG, label: CLEANUP_TASK_LABEL, @@ -23,7 +25,7 @@ export const cleanupLogsTask = (pluginOptions: PluginOptions): TaskConfig ({ @@ -30,15 +30,16 @@ afterEach(() => { describe('bufferManager', () => { it('should flush when buffer reaches size limit', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'size', - size: 2, - }, + buffer: { + flushStrategy: 'size', + size: 2, }, - } as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + } as PluginConfig; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); // simulate event listener const handler = mockOnEventLog.mock.calls[0][1]; @@ -52,34 +53,38 @@ describe('bufferManager', () => { it('should flush immediately in realtime mode', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'realtime', - }, + buffer: { + flushStrategy: 'realtime', }, - } as PluginOptions; + } as PluginConfig; + + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); - bufferManager(mockPayload as any, pluginOptions); const handler = mockOnEventLog.mock.calls[0][1]; await handler(sampleLog); expect(mockPayload.create).toHaveBeenCalledWith({ - collection: defaultCollectionValues.slug, + collection: auditor.slug, data: sampleLog, }); }); it('should flush periodically in time mode', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'time', - time: 2000, - }, + buffer: { + flushStrategy: 'time', + time: 2000, }, - } as unknown as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + } as unknown as PluginConfig; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); const handler = mockOnEventLog.mock.calls[0][1]; await handler(sampleLog); expect(mockPayload.create).not.toHaveBeenCalled(); @@ -87,22 +92,23 @@ describe('bufferManager', () => { vi.advanceTimersByTime(2000); expect(mockPayload.create).toHaveBeenCalledWith({ - collection: defaultCollectionValues.slug, + collection: auditor.slug, data: sampleLog, }); }); it('should flushing logs after create log when size value is 1', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'size', - size: 1, - }, + buffer: { + flushStrategy: 'size', + size: 1, }, - } as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + } as PluginConfig; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); const handler = mockOnEventLog.mock.calls[0][1]; await handler(sampleLog); @@ -114,16 +120,17 @@ describe('bufferManager', () => { }); it('should clear buffer store after flushing by size', async () => { - const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'size', - size: 2, - }, + const pluginOptions: PluginConfig = { + buffer: { + flushStrategy: 'size', + size: 2, }, - } as unknown as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + }; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); const handler = mockOnEventLog.mock.calls[0][1]; @@ -136,15 +143,16 @@ describe('bufferManager', () => { it('should clear buffer store after flushing by time', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'time', - time: 2000, - }, + buffer: { + flushStrategy: 'time', + time: 2000, }, - } as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + } as PluginConfig; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); const handler = mockOnEventLog.mock.calls[0][1]; @@ -159,14 +167,15 @@ describe('bufferManager', () => { it('should clear buffer store after flushing by realtime', async () => { const pluginOptions = { - collection: { - buffer: { - flushStrategy: 'realtime', - }, + buffer: { + flushStrategy: 'realtime', }, - } as PluginOptions; - - bufferManager(mockPayload as any, pluginOptions); + } as PluginConfig; + bufferManager({ + payload: mockPayload as any, + bufferConfig: pluginOptions.buffer, + internalCollectionConfig: auditor, + }); const handler = mockOnEventLog.mock.calls[0][1]; diff --git a/src/core/buffer/bufferManager.ts b/src/core/buffer/bufferManager.ts index c9e1d4d..4f51faf 100644 --- a/src/core/buffer/bufferManager.ts +++ b/src/core/buffer/bufferManager.ts @@ -1,10 +1,8 @@ -import type { Payload } from 'payload'; +import type { CollectionConfig, Payload } from 'payload'; +import type { BufferConfig } from './types.js'; import { onEventLog } from './../../core/events/emitter.js'; import type { AuditorLog } from '../../collections/auditor.js'; -import { defaultCollectionValues } from './../../Constant/Constant.js'; -import type { BufferConfig, PluginOptions } from './../../types/pluginOptions.js'; -import { handleBufferDebugMode } from './../../core/buffer/helpers/handleBufferDebugMode.js'; export const DEFAULT_INTERVAL_BUFFER = 10000 as NonNullable; export const DEFAULT_BUFFER_SIZE = 10 as NonNullable; @@ -12,42 +10,46 @@ export const DEFAULT_BUFFER_STRATEGY = 'time' as NonNullable { +const flushBuffer = async (params: FlushBufferParams) => { const logsToInsert = [...bufferStore]; bufferStore.length = 0; await Promise.all( logsToInsert.map(log => - payloadInstance.create({ - collection: pluginOptions.collection?.slug - ? pluginOptions.collection?.slug - : defaultCollectionValues.slug, + params.payload.create({ + collection: params.internalCollectionConfig?.slug, data: log, }), ), ); }; -export const bufferManager = (payload: Payload, pluginOptions: PluginOptions) => { - const bufferConfig = pluginOptions.collection?.buffer; +type BufferConfigParams = { + payload: Payload; + bufferConfig?: BufferConfig; + internalCollectionConfig: CollectionConfig; +}; + +export const bufferManager = (params: BufferConfigParams) => { + const bufferConfig = params.bufferConfig; const size = bufferConfig?.size ?? DEFAULT_BUFFER_SIZE; const interval = bufferConfig?.time ?? DEFAULT_INTERVAL_BUFFER; const flushStrategy = bufferConfig?.flushStrategy ?? DEFAULT_BUFFER_STRATEGY; - payloadInstance = payload; - // When the log is generated, add it to the buffer. onEventLog('logGenerated', async (log: AuditorLog) => { - handleBufferDebugMode({ flushStrategy, interval, size }, bufferConfig); bufferStore.push(log); if (flushStrategy === 'size') { if (bufferStore.length >= size) { - await flushBuffer(pluginOptions); + await flushBuffer(params); } } else if (flushStrategy === 'realtime') { - await flushBuffer(pluginOptions); + await flushBuffer(params); } }); @@ -55,7 +57,7 @@ export const bufferManager = (payload: Payload, pluginOptions: PluginOptions) => // Every few seconds, empty the buffer (even if it's not full) setInterval(async () => { if (bufferStore.length > 0) { - await flushBuffer(pluginOptions); + await flushBuffer(params); } }, interval); } diff --git a/src/core/buffer/helpers/handleBufferDebugMode.test.ts b/src/core/buffer/helpers/handleBufferDebugMode.test.ts deleted file mode 100644 index 8205771..0000000 --- a/src/core/buffer/helpers/handleBufferDebugMode.test.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -import { prettyDebugLog } from '../../../utils/prettyDebugLog.js'; -import { handleBufferDebugMode } from './handleBufferDebugMode.js'; -import type { BufferConfig, BufferDebugFields } from '../../../types/pluginOptions.js'; -import { DEFAULT_BUFFER_SIZE, DEFAULT_BUFFER_STRATEGY, DEFAULT_INTERVAL_BUFFER } from '../bufferManager.js'; - -vi.mock('../../../utils/prettyDebugLog.js'); - -const mockFields = { - flushStrategy: DEFAULT_BUFFER_STRATEGY, - size: DEFAULT_BUFFER_SIZE, - interval: DEFAULT_INTERVAL_BUFFER, -} satisfies Record; - -describe('handleBufferDebugMode', () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - describe('when debug is disabled', () => { - it('should return null and not call prettyDebugLog', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: false, - }, - }, - }; - - const result = handleBufferDebugMode(mockFields, bufferConfig); - - expect(result).toBeNull(); - expect(prettyDebugLog).not.toHaveBeenCalled(); - }); - - it('should return null when bufferConfig is undefined', () => { - const result = handleBufferDebugMode(mockFields, undefined); - - expect(result).toBeNull(); - expect(prettyDebugLog).not.toHaveBeenCalled(); - }); - - it('should return null when bufferConfig.modes is undefined', () => { - const bufferConfig: BufferConfig = {}; - - const result = handleBufferDebugMode(mockFields, bufferConfig); - - expect(result).toBeNull(); - expect(prettyDebugLog).not.toHaveBeenCalled(); - }); - }); - - describe('when debug is enabled', () => { - it('should call prettyDebugLog with all fields when debugFields is not specified', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledTimes(1); - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - mockFields, - 'table', - ); - }); - - it('should filter fields based on debugFields configuration', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - fields: { - size: true, - }, - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - const expectedFiltered = { - size: 10, - }; - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - expectedFiltered, - 'table', - ); - }); - - it('should use custom displayType when provided', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - displayType: 'manual', - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - mockFields, - 'manual', - ); - }); - - it('should use custom fields when provided in debug configuration', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - fields: { - size: true, - interval: true, - }, - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - const expectedFiltered = { - size: 10, - interval: 10000, - }; - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - expectedFiltered, - 'table', - ); - }); - }); - - describe('edge cases', () => { - it('should handle empty fields object', () => { - const emptyFields = {} as Record; - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - }, - }, - }; - - handleBufferDebugMode(emptyFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - emptyFields, - 'table', - ); - }); - - it('should handle debugFields with all false values', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - fields: { - size: false, - flushStrategy: false, - interval: false, - }, - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - {}, - 'table', - ); - }); - - it('should handle undefined displayType', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - displayType: undefined, - }, - }, - }; - - handleBufferDebugMode(mockFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledWith( - 'Buffer', - '', - mockFields, - 'table', - ); - }); - }); - - describe('multiple calls', () => { - it('should work correctly with multiple calls', () => { - const bufferConfig: BufferConfig = { - modes: { - debug: { - enabled: true, - fields: { - size: true, - interval: true, - }, - }, - }, - }; - - // فراخوانی اول - handleBufferDebugMode(mockFields, bufferConfig); - - // فراخوانی دوم با داده‌های متفاوت - const otherFields = { - ...mockFields, - size: 2048, - interval: 50000, - }; - handleBufferDebugMode(otherFields, bufferConfig); - - expect(prettyDebugLog).toHaveBeenCalledTimes(2); - - const expectedFirstFilter = { size: 10, interval: 10000 }; - const expectedSecondFilter = { size: 2048, interval: 50000 }; - - expect(prettyDebugLog).toHaveBeenNthCalledWith( - 1, - 'Buffer', - '', - expectedFirstFilter, - 'table', - ); - - expect(prettyDebugLog).toHaveBeenNthCalledWith( - 2, - 'Buffer', - '', - expectedSecondFilter, - 'table', - ); - }); - }); -}); diff --git a/src/core/buffer/helpers/handleBufferDebugMode.ts b/src/core/buffer/helpers/handleBufferDebugMode.ts deleted file mode 100644 index 4391eb2..0000000 --- a/src/core/buffer/helpers/handleBufferDebugMode.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { prettyDebugLog } from './../../../utils/prettyDebugLog.js'; -import type { BufferConfig, BufferDebugFields } from './../../../types/pluginOptions.js'; - -export const handleBufferDebugMode = ( - fields: Record, - bufferConfig: BufferConfig | undefined, -) => { - const isDebugEnabled = bufferConfig?.modes?.debug?.enabled ?? false; - - if (!isDebugEnabled) { - return null; - } - const debugFields = bufferConfig?.modes?.debug?.fields ?? fields; - const displayType = bufferConfig?.modes?.debug?.displayType ?? 'table'; - - const debugLog = Object.fromEntries( - Object.entries(fields).filter(([key]) => debugFields[key as keyof BufferDebugFields]), - ); - - prettyDebugLog('Buffer', '', debugLog, displayType); -}; diff --git a/src/core/buffer/types.ts b/src/core/buffer/types.ts new file mode 100644 index 0000000..0438250 --- /dev/null +++ b/src/core/buffer/types.ts @@ -0,0 +1,97 @@ +export interface BufferDebugFields { + flushStrategy: boolean; + interval: boolean; + size: boolean; +} + +export type BufferDebugModeConfig = { + /** + * 📝 Enable or disable debug mode + * + * 📖 long. + * + * 📌@type {'manual' | 'table'} + * + * @default false + * + */ + enabled?: boolean; +} | true; + +export interface BufferConfig { + /** + * 📝 The basics of injecting logs into the database + * + * + * + * @default "time" + * + * + * 📦 Usage Example + * + * @example 🧪 Data injection based on log count + * ```ts + * flushStrategy: 'size', + * ``` + * ### ⚠️ Critical Notes + * - If you use the size method, your logs will be stored in RAM before being injected into the database. + * + */ + flushStrategy?: 'realtime' | 'size' | 'time'; + /** + * 📝 Maximum number of logs before injection + * + * 📖 If the number of logs stored in the buffer memory reaches this number, data will be injected. + * + * 📌@type {number} + * + * @default 10 + * + * + * 📦 Usage Example + * + * @example 🧪 Up to 18 logs can be stored in memory + * ```ts + * size: 18 + * ``` + * + * --- + * ### ⚠️ Critical Notes + * - Works when flushStrategy is equal to size + * - If you enter the number 1, use the realtime method and do not define a value for this. + * ```ts + * flushStrategy: 'realtime', + * ``` + * - Very high numbers will increase RAM usage. + * - If you set a high number and on the other hand the logs produced are low, the logs will be recorded later. + * + */ + size?: number; + + /** + * 📝 Maximum time to inject logs into the buffer relative to the last injection + * + * + * 📌@type {Duration} + * + * @default 10000 + * + * + * 📦 Usage Example + * + * @example 🧪 Inject logs every 1 minute + * ```ts + * time: 5000 + * ``` + * + * --- + * ### ⚠️ Critical Notes + * - If you want to enter a value of "1s", set the flushStrategy value to time instead and do not define a value for the time property. + * ```ts + * flushStrategy: 'realtime', + * ``` + * - If you set the time too low, the CPU will be severely affected. + * - If you allow too much time, the logs will be recorded later. If the server crashes, the logs will be lost. + */ + time?: number; +} diff --git a/src/core/log-builders/collections/helpers/emitWrapper/emitWrapper.ts b/src/core/log-builders/collections/helpers/emitWrapper/emitWrapper.ts deleted file mode 100644 index 53e1ead..0000000 --- a/src/core/log-builders/collections/helpers/emitWrapper/emitWrapper.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { emitEvent } from '../../../../events/emitter.js'; -import type { AuditorLog } from '../../../../../collections/auditor.js'; -import type { - AllCollectionHooks, - HookOperationConfig, - HookTrackingOperationMap, - PluginOptions, -} from '../../../../../types/pluginOptions.js'; - -export const emitWrapper = async ( - logData: AuditorLog, - hookConfig: HookTrackingOperationMap[T], - hookName: keyof AllCollectionHooks, - operationConfig: HookOperationConfig | undefined, - pluginOpts: PluginOptions, - hookArgs: Parameters[0], - userActivatedHooks: Partial | undefined, -) => { - const customLogging = async (): Promise => { - const { hook, ...otherLogData } = logData; - - let result: AuditorLog = logData; - - if (operationConfig?.customLogger) { - result = { - ...(await operationConfig.customLogger(hookArgs, otherLogData)), - hook, - }; - } - else if (hookConfig?.customLogger) { - result = { - // @ts-ignore - ...(await hookConfig.customLogger(hookArgs, otherLogData)), - hook, - }; - } - else if (userActivatedHooks?.customLogger) { - result = { - ...(await userActivatedHooks.customLogger(hookArgs, otherLogData)), - hook, - }; - } - else if (pluginOpts?.customLogger) { - result = { - ...(await pluginOpts.customLogger(hookArgs, otherLogData)), - hook, - }; - } - - return { - ...result, - type: result.type, - onCollection: result.onCollection, - documentId: result.documentId, - hook, - operation: result.operation, - timestamp: result.timestamp, - user: result.user, - userAgent: result.userAgent, - }; - }; - - emitEvent('logGenerated', await customLogging()); -}; diff --git a/src/core/log-builders/collections/helpers/handleDebugMode.ts b/src/core/log-builders/collections/helpers/handleDebugMode.ts deleted file mode 100644 index 3fd13fd..0000000 --- a/src/core/log-builders/collections/helpers/handleDebugMode.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { AuditorLog } from './../../../../collections/auditor.js'; -import { prettyDebugLog } from './../../../../utils/prettyDebugLog.js'; -import type { - AllCollectionHooks, - AuditHookOperationType, - HookOperationConfig, - HookTrackingOperationMap, -} from './../../../../types/pluginOptions.js'; - -export const handleDebugMode = ( - hookConfig: HookTrackingOperationMap[T] | undefined, - operationConfig: HookOperationConfig | undefined, - allFields: AuditorLog, - operation: AuditHookOperationType, -) => { - const hookDebugConfig = hookConfig?.modes?.debug; - const operationDebugConfig = operationConfig?.modes?.debug; - - const isDebugEnabled - = (operationDebugConfig?.enabled ?? false) || (hookDebugConfig?.enabled ?? false); - - if (isDebugEnabled) { - const debugFields = operationDebugConfig?.fields ?? hookDebugConfig?.fields; - const debugDisplayType = operationDebugConfig?.displayType ?? hookDebugConfig?.displayType; - - const debugLog = debugFields - ? Object.fromEntries( - Object.entries(allFields).filter(([key]) => debugFields[key as keyof AuditorLog]), - ) - : allFields; - - prettyDebugLog('afterChange', operation, debugLog, debugDisplayType); - } -}; diff --git a/src/core/log-builders/collections/helpers/isOperationEnabled.ts b/src/core/log-builders/collections/helpers/isOperationEnabled.ts deleted file mode 100644 index 57478c3..0000000 --- a/src/core/log-builders/collections/helpers/isOperationEnabled.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { - AllCollectionHooks, - HookOperationConfig, - HookTrackingOperationMap, - // @ts-expect-error -} from 'src/types/pluginOptions.js'; - -export const checkOperationEnabled = ( - userHookOperationConfig: HookOperationConfig | undefined, - userHookConfig: HookTrackingOperationMap[T] | undefined, -): boolean => { - if (userHookConfig?.enabled === false) { - return false; - } - else if (userHookConfig?.enabled === true && userHookOperationConfig?.enabled !== false) { - return true; - } - else if (userHookConfig?.enabled === true && userHookOperationConfig?.enabled === false) { - return false; - } - else if (userHookOperationConfig?.enabled) { - return true; - } - else { - return false; - } -}; diff --git a/src/core/log-builders/collections/hooks.ts b/src/core/log-builders/collections/hooks.ts deleted file mode 100644 index c24d6cf..0000000 --- a/src/core/log-builders/collections/hooks.ts +++ /dev/null @@ -1,269 +0,0 @@ -import type { - CollectionAfterChangeHook, - CollectionAfterDeleteHook, - CollectionAfterErrorHook, - CollectionAfterForgotPasswordHook, - CollectionAfterLoginHook, - CollectionAfterLogoutHook, - CollectionAfterMeHook, - CollectionAfterOperationHook, - CollectionAfterReadHook, - CollectionAfterRefreshHook, - CollectionBeforeChangeHook, - CollectionBeforeDeleteHook, - CollectionBeforeLoginHook, - CollectionBeforeOperationHook, - CollectionBeforeReadHook, - CollectionBeforeValidateHook, - CollectionMeHook, - CollectionRefreshHook, -} from 'payload'; - -import type { SharedArgs } from './shared.js'; -import { handleDebugMode } from './helpers/handleDebugMode.js'; -import { emitWrapper } from './helpers/emitWrapper/emitWrapper.js'; -import type { AuditorLog } from './../../../collections/auditor.js'; -import type { - AllCollectionHooks, - HookOperationConfig, - HookTrackingOperationMap, - PluginOptions, -} from './../../../types/pluginOptions.js'; - -export const hookHandlers = { - afterChange: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'audit'; - baseLog.documentId = args.doc.id; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - - return args.doc; - }, - afterDelete: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'audit'; - baseLog.documentId = args.doc.id; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - afterError: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'error'; - baseLog.documentId = 'unknown'; - baseLog.user = sharedArgs.req?.user?.id || null; - }, - afterForgotPassword: async ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'security'; - baseLog.user = 'anonymous'; - - const email = args.args.data?.email; - const userDoc = await sharedArgs.req.payload.find({ - collection: sharedArgs.collection.slug, - limit: 1, - where: { email: { equals: email } }, - }); - - const userId = userDoc?.docs?.[0]?.id; - baseLog.user = userId; - }, - afterLogin: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'security'; - baseLog.operation = 'login'; - baseLog.user = args.user.id || 'anonymous'; - }, - afterLogout: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Omit, - ) => { - baseLog.type = 'security'; - baseLog.user = sharedArgs.req.user?.id || 'anonymous'; - }, - afterMe: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Omit, - ) => { - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - baseLog.type = 'info'; - }, - afterOperation: async ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - data: { - pluginOpts: PluginOptions; - userActivatedHooks: Partial | undefined; - userHookConfig: HookTrackingOperationMap; - userHookOperationConfig: HookOperationConfig; - }, - ) => { - baseLog.type = 'audit'; - baseLog.documentId = 'unknown'; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - - switch (args.operation) { - case 'create': - case 'deleteByID': - case 'findByID': - case 'updateByID': { - baseLog.documentId = args.result ? args.result?.id.toString() : 'unknown'; - - break; - } - case 'delete': - case 'update': { - if (args.result?.docs?.length) { - for (const doc of args.result.docs) { - baseLog.documentId = doc.id.toString(); - - handleDebugMode( - data.userHookConfig as HookTrackingOperationMap[T], - data.userHookOperationConfig, - baseLog as AuditorLog, - args.operation, - ); - await emitWrapper( - baseLog as AuditorLog, - data.userHookConfig as HookTrackingOperationMap[T], - sharedArgs.hook, - data.userHookOperationConfig, - data.pluginOpts, - args, - data.userActivatedHooks, - ); - } - } - break; - } - case 'login': - case 'refresh': { - baseLog.user = args.result.user.id.toString(); - break; - } - } - }, - afterRead: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'info'; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - afterRefresh: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'info'; - baseLog.user = sharedArgs.req.user?.id || 'anonymous'; - }, - beforeChange: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'audit'; - baseLog.documentId = args.originalDoc?.id; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - beforeDelete: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'audit'; - baseLog.documentId = args.id.toString(); - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - beforeLogin: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'security'; - baseLog.user = args.user.id || 'anonymous'; - }, - beforeOperation: async ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'audit'; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - - switch (args.operation) { - case 'create': - case 'refresh': - case 'update': - break; - case 'delete': - // @ts-ignore - baseLog.documentId = args.args.id ? args.args.id.toString() : 'unknown'; - break; - case 'forgotPassword': - case 'login': { - const email = args.args.data?.email; - const result = await args.req.payload.find({ - collection: sharedArgs.collection.slug, - limit: 1, - where: { email: { equals: email } }, - }); - const userId = result?.docs?.[0]?.id; - baseLog.user = userId || 'anonymous'; - break; - } - } - }, - beforeRead: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'info'; - baseLog.documentId = args.doc.id; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - beforeValidate: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'debug'; - baseLog.documentId = args.operation === 'update' ? args.originalDoc?.id : 'unknown'; - baseLog.user = sharedArgs.req?.user?.id || 'anonymous'; - }, - me: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'info'; - baseLog.user = args.user.id || 'anonymous'; - }, - refresh: ( - args: Parameters[0], - sharedArgs: SharedArgs, - baseLog: Partial, - ) => { - baseLog.type = 'info'; - baseLog.user = args.user?.id || 'anonymous'; - }, -}; diff --git a/src/core/log-builders/collections/shared.ts b/src/core/log-builders/collections/shared.ts deleted file mode 100644 index 234c0d6..0000000 --- a/src/core/log-builders/collections/shared.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { PayloadRequest, RequestContext, SanitizedCollectionConfig } from 'payload'; - -import { hookHandlers } from './hooks.js'; -import { handleDebugMode } from './helpers/handleDebugMode.js'; -import { emitWrapper } from './helpers/emitWrapper/emitWrapper.js'; -import type { AuditorLog } from './../../../collections/auditor.js'; -import { checkOperationEnabled } from './helpers/isOperationEnabled.js'; -import type { hookTypes } from './../../../pluginUtils/configHelpers.js'; -import type { - AllCollectionHooks, - AuditHookOperationType, - HookOperationConfig, - HookTrackingOperationMap, -} from './../../../types/pluginOptions.js'; - -export interface SharedArgs { - collection: SanitizedCollectionConfig; - context: RequestContext; - hook: (typeof hookTypes)[number]; - operation: AuditHookOperationType; - req: PayloadRequest; -} - -interface ExceptionsParams { - hookName: (typeof hookTypes)[number]; - operation: AuditHookOperationType; -} - -const exceptions = (params: ExceptionsParams): boolean => { - let result: boolean = false; - switch (params.hookName) { - case 'afterOperation': - if (params.operation === 'delete' || params.operation === 'update') { - result = true; - } - break; - - default: - break; - } - return result; -}; - -export const sharedLogic = async ( - args: Parameters[0], - sharedArgs: SharedArgs, -) => { - const pluginOpts = sharedArgs.context.pluginOptions; - const userActivatedHooks = sharedArgs.context.userHookConfig?.hooks; - const userHookConfig = sharedArgs.context.userHookConfig?.hooks?.[sharedArgs.hook]; - const userHookOperationConfig = ( - userHookConfig as Record | undefined> - )?.[sharedArgs.operation]; - - const isOperationEnabled = checkOperationEnabled( - userHookOperationConfig, - userHookConfig, - ); - - const baseLog: AuditorLog = { - type: 'unknown', - onCollection: sharedArgs.collection.slug, - documentId: 'unknown', - hook: sharedArgs.hook, - operation: sharedArgs.operation, - timestamp: new Date(), - user: 'anonymous', - userAgent: sharedArgs.req.headers.get('user-agent') || 'unknown', - }; - - if (!exceptions({ hookName: sharedArgs.hook, operation: sharedArgs.operation })) { - handleDebugMode( - userHookConfig as HookTrackingOperationMap[T], - userHookOperationConfig, - baseLog, - sharedArgs.operation, - ); - } - - if (isOperationEnabled) { - // @ts-ignore - await hookHandlers[sharedArgs.hook](args, sharedArgs, baseLog, { - pluginOpts, - userActivatedHooks, - userHookConfig, - userHookOperationConfig, - }); - if (!exceptions({ hookName: sharedArgs.hook, operation: sharedArgs.operation })) { - await emitWrapper( - baseLog, - userHookConfig as HookTrackingOperationMap[T], - sharedArgs.hook, - userHookOperationConfig, - pluginOpts, - args, - userActivatedHooks, - ); - } - } -}; diff --git a/src/core/log-builders/helpers/extractOperation/extractOperation.ts b/src/core/log-builders/helpers/extractOperation/extractOperation.ts new file mode 100644 index 0000000..9e7570c --- /dev/null +++ b/src/core/log-builders/helpers/extractOperation/extractOperation.ts @@ -0,0 +1,21 @@ +import type { GlobalHooksArgsParameterUnion, GlobalHooksKeys } from '../../../../types/global.js'; +import type { CollectionHooksArgsParameterUnion, CollectionHooksKeys, CollectionHooksOperation } from '../../../../types/collection.js'; + +interface Params { + hookArgs: CollectionHooksArgsParameterUnion | GlobalHooksArgsParameterUnion; + targetHookName: CollectionHooksKeys | GlobalHooksKeys; +} + +const regex = /[A-Z]?[a-z]+/g; +const splitCamelCase = (str: string) => { + return str.match(regex) || []; +}; + +export const extractOperation = (params: Params): CollectionHooksOperation => { + const operation = params + .hookArgs + // @ts-expect-error + .operation + || splitCamelCase(params.targetHookName)[1].toLowerCase(); + return operation as CollectionHooksOperation; +}; diff --git a/src/core/log-builders/helpers/handleDebugMode.ts b/src/core/log-builders/helpers/handleDebugMode.ts new file mode 100644 index 0000000..f84907c --- /dev/null +++ b/src/core/log-builders/helpers/handleDebugMode.ts @@ -0,0 +1,29 @@ +import type { AuditorLog } from '../../../collections/auditor.js'; +import { prettyDebugLog } from '../../../utils/prettyDebugLog.js'; +import type { GlobalHookConfigForTracking, GlobalHooksKeys, GlobalOperationLogConfig } from '../../../types/global.js'; +import type { CollectionHooksKeys, CollectionHooksOperation, CollectionsHookConfigForTracking } from '../../../types/collection.js'; + +type Params = { + hookLevelConfig?: CollectionsHookConfigForTracking[CollectionHooksKeys] | GlobalHookConfigForTracking[GlobalHooksKeys]; + operationLevelConfig?: GlobalOperationLogConfig; + logData: AuditorLog; + operation: CollectionHooksOperation; + hookName: CollectionHooksKeys; +}; + +export const handleDebugMode = (params: Params) => { + const hookDebugConfig = typeof params.hookLevelConfig === 'boolean' + ? undefined + : params.hookLevelConfig?.debug; + const operationDebugConfig = params.operationLevelConfig?.debug; + + const isDebugEnabled = operationDebugConfig || hookDebugConfig; + + if (isDebugEnabled) { + prettyDebugLog({ + title: params.hookName, + data: params.logData, + subtitle: params.operation, + }); + } +}; diff --git a/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.test.ts b/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.test.ts new file mode 100644 index 0000000..ac51a44 --- /dev/null +++ b/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.test.ts @@ -0,0 +1,102 @@ +import type { PartialDeep } from 'type-fest'; +import { describe, expect, it } from 'vitest'; + +import { checkIsOperationEnabled } from './isOperationEnabled.js'; +import type { TrackedCollection } from '../../../../types/collection.js'; + +describe('checkIsOperationEnabled', () => { + const createPluginConfig = (collectionConfig: PartialDeep): Parameters[0] => { + return { + hookLevelConfig: collectionConfig.hooks?.afterOperation, + // @ts-expect-error + hookOperationLevelConfig: collectionConfig.hooks?.afterOperation?.updateByID, + }; + }; + + it('should return true when explicitly true at the operation level', () => { + const configWithEnabled = checkIsOperationEnabled(createPluginConfig({ + hooks: { afterOperation: { updateByID: { enabled: true } } }, + })); + const config = checkIsOperationEnabled(createPluginConfig({ + hooks: { afterOperation: { updateByID: true } }, + })); + + expect(config).toEqual(true); + expect(configWithEnabled).toEqual(true); + }); + + it('should return true when explicitly true at the hook level', () => { + const configWithEnabled = checkIsOperationEnabled(createPluginConfig({ + hooks: { afterOperation: { enabled: true } }, + })); + const config = checkIsOperationEnabled(createPluginConfig({ hooks: { afterOperation: true } })); + + expect(config).toEqual(true); + expect(configWithEnabled).toEqual(true); + }); + + it('should return false when explicitly false at the operation level', () => { + const config = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { + updateByID: false, + }, + }, + })); + const configWithEnabled = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { updateByID: { enabled: false } }, + }, + })); + const configStrict = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { + enabled: true, + updateByID: false, + }, + }, + })); + const configWithEnabledStrict = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { + enabled: true, + updateByID: { enabled: false }, + }, + }, + })); + + expect(config).toEqual(false); + expect(configWithEnabled).toEqual(false); + expect(configStrict).toEqual(false); + expect(configWithEnabledStrict).toEqual(false); + }); + + it('should return false when explicitly false at the hook level', () => { + const config = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: false, + }, + })); + const configWithEnabled = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { enabled: false }, + }, + })); + + const configStrict = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: false, + }, + })); + const configWithEnabledStrict = checkIsOperationEnabled(createPluginConfig({ + hooks: { + afterOperation: { enabled: false, updateByID: true }, + }, + })); + + expect(config).toEqual(false); + expect(configWithEnabled).toEqual(false); + expect(configStrict).toEqual(false); + expect(configWithEnabledStrict).toEqual(false); + }); +}); diff --git a/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.ts b/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.ts new file mode 100644 index 0000000..26d5c7b --- /dev/null +++ b/src/core/log-builders/helpers/isOperationEnabled/isOperationEnabled.ts @@ -0,0 +1,24 @@ +import type { CollectionConfig } from 'payload'; + +import type { CollectionOperationLogConfig, CollectionsHookConfigForTracking } from '../../../../types/collection.js'; +import type { GlobalHookConfigForTracking, GlobalHooksKeys, GlobalOperationLogConfig } from '../../../../types/global.js'; + +type CollectionHooksKeys = keyof NonNullable; + +interface Params { + hookOperationLevelConfig?: CollectionOperationLogConfig | GlobalOperationLogConfig | true; + hookLevelConfig?: CollectionsHookConfigForTracking[CollectionHooksKeys] | GlobalHookConfigForTracking[GlobalHooksKeys]; +} + +export const isBooleanConfig = (v: T): boolean | undefined => typeof v === 'boolean' + ? v + // @ts-expect-error + : v?.enabled; + +export const checkIsOperationEnabled = (params: Params): boolean => { + const hookLevelEnabled = isBooleanConfig(params.hookLevelConfig); + const operationLevelEnabled = isBooleanConfig(params.hookOperationLevelConfig); + + return (operationLevelEnabled !== false) && (hookLevelEnabled !== false) + && !!(operationLevelEnabled || hookLevelEnabled); +}; diff --git a/src/core/log-builders/logBuilderManager/logBuilderManager.test.ts b/src/core/log-builders/logBuilderManager/logBuilderManager.test.ts new file mode 100644 index 0000000..1d99cde --- /dev/null +++ b/src/core/log-builders/logBuilderManager/logBuilderManager.test.ts @@ -0,0 +1,159 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { emitEvent } from '../../events/emitter.js'; +import { logBuilderManager } from './logBuilderManager.js'; +import type { PluginConfig } from '../../../types/config.js'; +import type { TrackedGlobal } from '../../../types/global.js'; +import type { LogBuilderManager } from './logBuilderManager.js'; +import type { TrackedCollection } from '../../../types/collection.js'; + +vi.mock('./../../events/emitter.js', () => ({ + emitEvent: vi.fn(), +})); + +const createPluginConfig = (hookLevelConfig: TrackedCollection['hooks'] | TrackedGlobal['hooks']): PluginConfig => ({ + // @ts-expect-error + collections: { track: [{ slug: 'user-collection', hooks: hookLevelConfig }] }, + // @ts-expect-error + globals: { track: [{ slug: 'user-global', hooks: hookLevelConfig }] }, +}); + +const createCollectionLogBuilderParams = (pluginConfig: PluginConfig): LogBuilderManager => ({ + scopeSlug: 'collection', + identifier: 'user-collection', + // @ts-expect-error + hookArgs: { + operation: 'updateByID', + collection: 'user-collection', + req: { headers: { get: () => 'unknown' } }, + }, + pluginConfig, + targetHookLevelConfig: pluginConfig.collections?.track[0].hooks?.afterOperation, + targetHookName: 'afterOperation', +}); + +const createGlobalLogBuilderParams = (pluginConfig: PluginConfig): LogBuilderManager => ({ + scopeSlug: 'global', + identifier: 'user-global', + // @ts-expect-error + hookArgs: { + operation: 'updateByID', + global: 'user-global', + req: { headers: { get: () => 'unknown' } }, + }, + pluginConfig, + targetHookLevelConfig: pluginConfig.collections?.track[0].hooks?.afterOperation, + targetHookName: 'afterOperation', +}); + +describe('logBuilderManager', () => { + beforeEach(() => vi.clearAllMocks()); + + describe('collections', () => { + it('should emit logGenerated event for collection scope with enabled afterOperation hook', async () => { + const pluginConfigDebugMode = createPluginConfig({ afterOperation: { updateByID: { enabled: true } } }); + const builderParams = createCollectionLogBuilderParams(pluginConfigDebugMode); + await logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledWith('logGenerated', { + operation: 'updateByID', + identifier: 'user-collection', + hook: 'afterOperation', + scope: 'collection', + userAgent: 'unknown', + timestamp: expect.any(Date), + }); + expect(emitEvent).toHaveBeenCalledTimes(1); + }); + + it('should skip save to database when debug mode is active with skipDatabaseSave flag', () => { + const pluginConfigDebugModeWithFlag = createPluginConfig({ afterOperation: { + debug: { skipDatabaseSave: true }, + } }); + const builderParams = createCollectionLogBuilderParams(pluginConfigDebugModeWithFlag); + logBuilderManager(builderParams); + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should skip save to database when debug mode is active', () => { + const pluginConfigDebugMode = createPluginConfig({ afterOperation: { debug: true } }); + const builderParams = createCollectionLogBuilderParams(pluginConfigDebugMode); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should not emit logGenerated when operation is disabled for collection', () => { + const pluginConfigDebugMode = createPluginConfig({ afterOperation: { updateByID: false } }); + const builderParams = createCollectionLogBuilderParams(pluginConfigDebugMode); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should not emit logGenerated when hook is disabled for global', () => { + const pluginConfig = createPluginConfig({ afterOperation: false }); + const builderParams = createCollectionLogBuilderParams(pluginConfig); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + }); + + describe('globals', () => { + it('should emit logGenerated event for global scope with enabled afterOperation hook', async () => { + const pluginConfig = createPluginConfig({ afterOperation: { updateByID: { enabled: true } } }); + const builderParams = createGlobalLogBuilderParams(pluginConfig); + await logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledWith('logGenerated', { + operation: 'updateByID', + identifier: 'user-global', + hook: 'afterOperation', + scope: 'global', + userAgent: 'unknown', + timestamp: expect.any(Date), + }); + expect(emitEvent).toHaveBeenCalledTimes(1); + }); + + it('should skip save to database when debug mode is active with skipDatabaseSave flag', () => { + const pluginConfigDebugModeWithFlag = createPluginConfig({ afterOperation: { + debug: { skipDatabaseSave: true }, + } }); + const builderParams = createGlobalLogBuilderParams(pluginConfigDebugModeWithFlag); + logBuilderManager(builderParams); + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should skip save to database when debug mode is active', () => { + const pluginConfigDebugMode = createPluginConfig({ afterOperation: { debug: true } }); + const builderParams = createGlobalLogBuilderParams(pluginConfigDebugMode); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should not emit logGenerated when operation is disabled for global', () => { + const pluginConfig = createPluginConfig({ afterOperation: { updateByID: false } }); + const builderParams = createGlobalLogBuilderParams(pluginConfig); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + + it('should not emit logGenerated when hook is disabled for global', () => { + const pluginConfig = createPluginConfig({ afterOperation: false }); + const builderParams = createGlobalLogBuilderParams(pluginConfig); + + logBuilderManager(builderParams); + + expect(emitEvent).toHaveBeenCalledTimes(0); + }); + }); +}); diff --git a/src/core/log-builders/logBuilderManager/logBuilderManager.ts b/src/core/log-builders/logBuilderManager/logBuilderManager.ts new file mode 100644 index 0000000..9b836dc --- /dev/null +++ b/src/core/log-builders/logBuilderManager/logBuilderManager.ts @@ -0,0 +1,78 @@ +import { emitEvent } from '../../events/emitter.js'; +import type { PluginConfig } from '../../../types/config.js'; +import { handleDebugMode } from '../helpers/handleDebugMode.js'; +import type { AuditorLog } from '../../../collections/auditor.js'; +import { extractOperation } from '../helpers/extractOperation/extractOperation.js'; +import { checkIsOperationEnabled } from '../helpers/isOperationEnabled/isOperationEnabled.js'; +import type { GlobalHookConfigForTracking, GlobalHooksArgsParameterUnion, GlobalHooksKeys, GlobalOperationLogConfig } from '../../../types/global.js'; +import type { CollectionHooksArgsParameterUnion, CollectionHooksKeys, CollectionOperationLogConfig, CollectionsHookConfigForTracking } from '../../../types/collection.js'; + +export type LogBuilderManager = { + hookArgs: CollectionHooksArgsParameterUnion | GlobalHooksArgsParameterUnion; + pluginConfig: PluginConfig; + targetHookName: CollectionHooksKeys; + targetHookLevelConfig: CollectionsHookConfigForTracking[CollectionHooksKeys] | GlobalHookConfigForTracking[GlobalHooksKeys]; + scopeSlug: AuditorLog['scope']; + identifier: string; +}; + +export const logBuilderManager = async (params: LogBuilderManager) => { + const operation = extractOperation(params); + // @ts-expect-error + const hookOperationLevelConfig = params + .targetHookLevelConfig?.[operation] as CollectionOperationLogConfig | GlobalOperationLogConfig | undefined; + const hookLevelConfig = typeof params.targetHookLevelConfig === 'boolean' + ? undefined + : params.targetHookLevelConfig; + const isOperationEnabled = checkIsOperationEnabled({ + hookLevelConfig: params.targetHookLevelConfig, + hookOperationLevelConfig, + }); + + const baseLog: AuditorLog = { + scope: params.scopeSlug, + hook: params.targetHookName, + identifier: params.identifier, + operation, + timestamp: new Date(), + // @ts-expect-error + userAgent: params.hookArgs.req.headers.get('user-agent') || 'unknown', + }; + + if (isOperationEnabled) { + const { hook, operation, ...otherLogData } = baseLog; + const customLogData = { + ...baseLog, + ...(await hookLevelConfig?.customLogger?.( + // @ts-expect-error + params.hookArgs, + otherLogData, + )), + ...(await hookOperationLevelConfig?.customLogger?.( + // @ts-expect-error + params.hookArgs, + otherLogData, + )), + hook, + operation, + } as AuditorLog; + + const skipToDatabase = hookLevelConfig?.debug === true + || hookLevelConfig?.debug?.skipDatabaseSave + || hookOperationLevelConfig?.debug === true + || hookOperationLevelConfig?.debug?.skipDatabaseSave; + + if (!skipToDatabase) { + emitEvent('logGenerated', customLogData); + } + + handleDebugMode({ + logData: customLogData, + hookLevelConfig: params.targetHookLevelConfig, + hookName: params.targetHookName, + operation, + // @ts-expect-error + operationLevelConfig: hookOperationLevelConfig, + }); + } +}; diff --git a/src/index.ts b/src/index.ts index 51d0792..d383847 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,39 +1,54 @@ import type { Config, Plugin } from 'payload'; -import { defaultPluginOpts } from './Constant/Constant.js'; -import type { PluginOptions } from './types/pluginOptions.js'; +import { auditor } from './collections/auditor.js'; +import type { PluginConfig } from './types/config.js'; +import { onInitManager } from './pluginUtils/configHelpers.js'; import { cleanupLogsTask } from './core/automation/tasks/cleanup/cleanup.js'; -import { - attachCollectionConfig, - buildAccessControl, - onInitManager, -} from './pluginUtils/configHelpers.js'; +import { attachGlobalConfig } from './pluginUtils/attachGlobalConfig/attachGlobalConfig.js'; +import { attachCollectionConfig } from './pluginUtils/attachCollectionConfig/attachCollectionConfig.js'; /** * 📝 The main function of plugin packaging * * - * 📌@type {(opts?: PluginOptions) => Plugin} + * 📌@type {(pluginConfig?: PluginConfig) => Plugin} * - * @param opts + * @param pluginConfig * */ export const auditorPlugin - = (opts: PluginOptions = defaultPluginOpts): Plugin => - async (incomingConfig: Config): Promise => { - const config = { ...incomingConfig }; - if (opts.enabled === false) { - return config; + = (pluginConfig: PluginConfig): Plugin => + async (payloadConfig: Config): Promise => { + if (pluginConfig.disabled === true) { + return payloadConfig; } - // Accessibility customization - // TODO: combine to attachCollectionConfig function - buildAccessControl(opts); + const config = { ...payloadConfig }; + + const updatedCollection = pluginConfig.configureRootCollection?.(auditor) ?? auditor; + + config.collections = attachCollectionConfig(config.collections, pluginConfig); + config.globals = attachGlobalConfig(config.globals, pluginConfig); + + config.collections = [ + ...(config?.collections ?? []), + updatedCollection, + ]; - config.collections = attachCollectionConfig(config.collections, opts); config.jobs = { ...config.jobs, - tasks: [...(config.jobs?.tasks ?? []), cleanupLogsTask(opts)], + tasks: [ + ...(config.jobs?.tasks ?? []), + cleanupLogsTask({ + pluginConfig, + internalCollectionConfig: updatedCollection, + }), + ], }; - config.onInit = onInitManager(config, opts); + + config.onInit = onInitManager({ + payloadConfig: config, + internalCollectionConfig: updatedCollection, + pluginConfig, + }); return config; }; diff --git a/src/pluginUtils/attachCollectionConfig/attachCollectionConfig.ts b/src/pluginUtils/attachCollectionConfig/attachCollectionConfig.ts new file mode 100644 index 0000000..9e8a8b4 --- /dev/null +++ b/src/pluginUtils/attachCollectionConfig/attachCollectionConfig.ts @@ -0,0 +1,48 @@ +import type { Config } from 'payload'; + +import type { PluginConfig } from '../../types/config.js'; +import type { CollectionHooksKeys } from '../../types/collection.js'; +import { logBuilderManager } from '../../core/log-builders/logBuilderManager/logBuilderManager.js'; + +export const attachCollectionConfig = ( + userCollectionsConfig: Config['collections'], + pluginOpts: PluginConfig, +) => { + const pluginCollectionsConfig = pluginOpts.collections; + + const trackedCollections = pluginCollectionsConfig?.track ?? []; + + // Attaching Log Builders + if (trackedCollections.length) { + userCollectionsConfig = (userCollectionsConfig || []).map((collection) => { + const trackedCollectionConfig = pluginCollectionsConfig?.track.find( + tc => tc.slug === collection.slug, + ); + + if (trackedCollectionConfig?.hooks) { + collection.hooks = collection.hooks ?? {}; + + for (const hookName in trackedCollectionConfig?.hooks) { + const typedHookName = hookName as CollectionHooksKeys; + // @ts-expect-error + collection.hooks[typedHookName] = [ + ...(collection.hooks?.[typedHookName] || []), + // @ts-ignore + async args => logBuilderManager({ + scopeSlug: 'collection', + hookArgs: args, + pluginConfig: pluginOpts, + targetHookLevelConfig: trackedCollectionConfig.hooks?.[typedHookName], + targetHookName: typedHookName, + identifier: collection.slug, + }), + ]; + } + } + + return collection; + }); + } + + return userCollectionsConfig ?? []; +}; diff --git a/src/pluginUtils/attachGlobalConfig/attachGlobalConfig.ts b/src/pluginUtils/attachGlobalConfig/attachGlobalConfig.ts new file mode 100644 index 0000000..5979d24 --- /dev/null +++ b/src/pluginUtils/attachGlobalConfig/attachGlobalConfig.ts @@ -0,0 +1,53 @@ +import type { Config } from 'payload'; + +import type { PluginConfig } from '../../types/config.js'; +import type { GlobalHooksKeys } from '../../types/global.js'; +import { logBuilderManager } from '../../core/log-builders/logBuilderManager/logBuilderManager.js'; + +export const attachGlobalConfig = ( + userGlobalConfig: Config['globals'], + pluginOpts: PluginConfig, +) => { + const pluginGlobalsConfig = pluginOpts.globals; + if (!pluginGlobalsConfig) { + return userGlobalConfig; + } + + const trackedGlobals = pluginGlobalsConfig.track ?? []; + + // Attaching Log Builders + if (trackedGlobals.length) { + userGlobalConfig = (userGlobalConfig || []).map((global) => { + const tracked = pluginGlobalsConfig.track.find( + tc => tc.slug === global.slug, + ); + + if (tracked) { + global.hooks = global.hooks || {}; + + if (tracked?.hooks) { + for (const hookName in tracked?.hooks) { + const typedHookName = hookName as GlobalHooksKeys; + // @ts-expect-error + global.hooks[typedHookName] = [ + ...(global.hooks[typedHookName] || []), + // @ts-ignore + async args => logBuilderManager({ + scopeSlug: 'collection', + hookArgs: args, + pluginConfig: pluginOpts, + targetHookLevelConfig: tracked.hooks?.[typedHookName], + targetHookName: typedHookName, + identifier: global.slug, + }), + ]; + } + } + } + + return global; + }); + } + + return userGlobalConfig ?? []; +}; diff --git a/src/pluginUtils/configHelpers.ts b/src/pluginUtils/configHelpers.ts index 8980fd7..382e710 100644 --- a/src/pluginUtils/configHelpers.ts +++ b/src/pluginUtils/configHelpers.ts @@ -1,152 +1,29 @@ -import type { Access, BasePayload, Config } from 'payload'; +import type { BasePayload, CollectionConfig, Config } from 'payload'; -import auditor from '../collections/auditor.js'; +import type { PluginConfig } from '../types/config.js'; import { bufferManager } from './../core/buffer/bufferManager.js'; -import { defaultCollectionValues, hookMap } from './../Constant/Constant.js'; import { DEFAULT_QUEUE_NAME } from '../core/automation/tasks/cleanup/cleanup.js'; -import type { AllCollectionHooks, PluginOptions } from './../types/pluginOptions.js'; -type AccessOps = 'create' | 'delete' | 'read' | 'update'; - -type RoleAccessMap = Partial>; - -type CustomAccessMap = Partial>; - -export const hookTypes = [ - 'beforeOperation', - 'beforeValidate', - 'beforeDelete', - 'beforeChange', - 'beforeRead', - 'afterChange', - 'afterRead', - 'afterDelete', - 'afterOperation', - 'afterError', - 'beforeLogin', - 'afterLogin', - 'afterLogout', - 'afterRefresh', - 'afterMe', - 'afterForgotPassword', - 'refresh', - 'me', -] as const; - -export const buildAccessControl = (pluginOpts: PluginOptions) => { - const roles: RoleAccessMap = pluginOpts?.collection?.Accessibility?.roles ?? {}; - const customAccess: CustomAccessMap = pluginOpts?.collection?.Accessibility?.customAccess ?? {}; - - const defaultAccess: Access = ({ req }) => req.user?.role === 'admin'; - - const accessOps: AccessOps[] = ['read']; - - const access: Partial> = {}; - - accessOps.forEach((op) => { - if (roles[op] && roles[op].length > 0) { - access[op] = ({ req }) => roles[op]!.includes(req.user?.role); - } - else if (customAccess[op]) { - access[op] = customAccess[op]; - } - else { - access[op] = defaultAccess; - } - }); - - auditor.access = { ...auditor.access, ...access }; -}; - -export const attachCollectionConfig = ( - userCollectionsConfig: Config['collections'], - pluginOpts: PluginOptions, -) => { - const pluginCollectionsConfig = pluginOpts.collection; - if (!pluginCollectionsConfig) { - return userCollectionsConfig; - } - - // attach localization - for (const field of auditor.fields) { - // @ts-ignore - field.label = pluginCollectionsConfig.locale?.collection?.fields?.[field.name] ?? field.label; - } - - // Attach Slug - if (pluginCollectionsConfig.slug && pluginCollectionsConfig.slug.length > 0) { - auditor.slug = pluginCollectionsConfig.slug; - } - - // Attaching Log Builders - if ( - pluginCollectionsConfig.trackCollections - && pluginCollectionsConfig.trackCollections.length > 0 - ) { - userCollectionsConfig = (userCollectionsConfig || []).map((collection) => { - const tracked = pluginCollectionsConfig.trackCollections.find( - tc => tc.slug === collection.slug, - ); - - if (tracked && !tracked.disabled) { - collection.hooks = collection.hooks || {}; - - if (tracked.hooks) { - for (const hookName in tracked?.hooks) { - const typedHookName = hookName as keyof AllCollectionHooks; - // @ts-ignore - collection.hooks[typedHookName] = [ - ...(collection.hooks[typedHookName] || []), - async (args: any) => - await hookMap[typedHookName]({ - ...args, - context: { - pluginOptions: pluginOpts, - userHookConfig: tracked, - }, - }), - ]; - } - } - } - - return collection; - }); - } - - // add root collection to payload config - const rootCollection = pluginCollectionsConfig.configureRootCollection - ? { - ...auditor, - ...pluginCollectionsConfig.configureRootCollection(auditor), - } - : auditor; - - // attach collection slug - const collectionSlug = rootCollection.slug ? rootCollection.slug : pluginCollectionsConfig.slug; - pluginCollectionsConfig.slug = collectionSlug; - - userCollectionsConfig = [ - ...(userCollectionsConfig || []), - { ...rootCollection, slug: collectionSlug || defaultCollectionValues.slug }, - ]; - // Attaching settings to plugin's internal collection hooks - - return userCollectionsConfig; +type OnInitManagerParams = { + payloadConfig: Config; + pluginConfig: PluginConfig; + internalCollectionConfig: CollectionConfig; }; -export const onInitManager = (incomingConfig: Config, pluginOptions: PluginOptions) => { - const originalOnInit = incomingConfig.onInit; +export const onInitManager = (params: OnInitManagerParams) => { + const originalOnInit = params.payloadConfig.onInit; + const bufferConfig = params.pluginConfig.buffer; + const internalCollectionConfig = params.internalCollectionConfig; return async (payload: BasePayload) => { if (originalOnInit) { await originalOnInit(payload); } - bufferManager(payload, pluginOptions); + bufferManager({ payload, bufferConfig, internalCollectionConfig }); let autoRun = payload.config.jobs?.autoRun ?? []; - const queueName = pluginOptions.automation?.logCleanup?.queueName ?? DEFAULT_QUEUE_NAME; + const queueName = params.pluginConfig.automation?.logCleanup?.queueName ?? DEFAULT_QUEUE_NAME; if (Array.isArray(autoRun)) { autoRun = [...(autoRun ?? []), { queue: queueName }]; } diff --git a/src/types/collection.ts b/src/types/collection.ts new file mode 100644 index 0000000..f46e48b --- /dev/null +++ b/src/types/collection.ts @@ -0,0 +1,70 @@ +import type { AllOperations, CollectionConfig, PayloadTypes } from 'payload'; + +import type { AuditorLog } from '../collections/auditor.js'; + +export type OperationDebugConfig = { + skipDatabaseSave?: boolean; +} | true; + +export type CollectionHookDebugConfig = { + skipDatabaseSave?: true; +} | true; + +export type CollectionHooksKeys = keyof NonNullable; +export type CollectionHooksOperation = AllOperations | 'read' | 'delete' | 'error' | 'login' | 'logout' | 'me' | 'refresh' | 'forgotPassword' | ''; +export type CollectionHooksArgsParameterUnion = Parameters< + NonNullable< + NonNullable< + CollectionConfig['hooks'] + >[CollectionHooksKeys] + >[number] +>[0]; + +export type PayloadCollectionHooksMap = { + [K in CollectionHooksKeys]: NonNullable[K]>[number] +}; +export type CollectionsHookConfigForTracking = { + [K in keyof NonNullable]: + Partial< + { + // @ts-expect-error + [O in Parameters< + NonNullable< + NonNullable< + CollectionConfig['hooks'] + >[K] + >[number] + >[0]['operation']]: CollectionOperationLogConfig | boolean + } & CollectionHookLevelLogConfig + > | boolean +}; + +export interface CollectionOperationLogConfig< + HookName extends CollectionHooksKeys = CollectionHooksKeys, +> { + customLogger?: ( + args: Parameters[0], + fields: Omit, + ) => Omit | Promise>; + enabled?: boolean; + debug?: OperationDebugConfig; +} + +export interface CollectionHookLevelLogConfig< + HookName extends CollectionHooksKeys = CollectionHooksKeys, +> { + customLogger?: ( + args: Parameters[0], + fields: Omit, + ) => Omit | Promise>; + enabled?: boolean; + debug?: CollectionHookDebugConfig; +} + +export interface TrackedCollection { + hooks?: Partial; + slug: keyof PayloadTypes['collections']; +} +export interface CollectionsTrackConfig { + track: TrackedCollection[]; +} diff --git a/src/types/config.ts b/src/types/config.ts new file mode 100644 index 0000000..0abf942 --- /dev/null +++ b/src/types/config.ts @@ -0,0 +1,52 @@ +import type { + CollectionConfig, +} from 'payload'; + +import type { GlobalsTrackConfig } from './global.js'; +import type { auditor } from '../collections/auditor.js'; +import type { BufferConfig } from '../core/buffer/types.js'; +import type { CollectionsTrackConfig } from './collection.js'; + +export interface AutomationConfig { + logCleanup?: { + /** + * @default 604800000 // 1 week + */ + olderThan?: number; + /** + * @default "payload-auditor-queue" + */ + queueName?: string; + /** + * The cron for scheduling the job. + * + * @default '0 3 * * *' // At 03:00 AM + * + * @example + * ┌───────────── (optional) second (0 - 59) + * │ ┌───────────── minute (0 - 59) + * │ │ ┌───────────── hour (0 - 23) + * │ │ │ ┌───────────── day of the month (1 - 31) + * │ │ │ │ ┌───────────── month (1 - 12) + * │ │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday) + * │ │ │ │ │ │ + * │ │ │ │ │ │ + * - '* 0 * * * *' every hour at minute 0 + * - '* 0 0 * * *' daily at midnight + * - '* 0 0 * * 0' weekly at midnight on Sundays + * - '* 0 0 1 * *' monthly at midnight on the 1st day of the month + * - '* 0/5 * * * *' every 5 minutes + * - '* * * * * *' every second + */ + cronTime?: string; + }; +} + +export interface PluginConfig { + automation?: AutomationConfig; + collections?: CollectionsTrackConfig; + buffer?: BufferConfig; + configureRootCollection?: (defaults: typeof auditor) => CollectionConfig; + globals?: GlobalsTrackConfig; + disabled?: boolean; +} diff --git a/src/types/global.ts b/src/types/global.ts new file mode 100644 index 0000000..26ae63b --- /dev/null +++ b/src/types/global.ts @@ -0,0 +1,67 @@ +import type { GlobalConfig, PayloadTypes } from 'payload'; + +import type { AuditorLog } from '../collections/auditor.js'; +import type { CollectionHookDebugConfig } from './collection.js'; + +export type GlobalHooksKeys = keyof NonNullable; + +export type GlobalOperationDebugConfig = { + skipDatabaseSave?: boolean; +} | true; + +export type GlobalHookConfigForTracking = { + [K in keyof NonNullable]: + Partial< + { + // @ts-expect-error + [O in Parameters< + NonNullable< + NonNullable< + GlobalConfig['hooks'] + >[K] + >[number] + >[0]['operation']]: GlobalOperationLogConfig | boolean + } & GlobalHookLevelLogConfig + > | boolean +}; + +export interface GlobalOperationLogConfig< + HookName extends GlobalHooksKeys = GlobalHooksKeys, +> { + customLogger?: ( + args: Parameters[HookName]>[number]>[0], + fields: Omit, + ) => Omit | Promise>; + enabled?: boolean; + debug?: GlobalOperationDebugConfig; +} + +export interface GlobalHookLevelLogConfig< + HookName extends GlobalHooksKeys = GlobalHooksKeys, +> { + customLogger?: ( + args: Parameters[HookName]>[number]>[0], + fields: Omit, + ) => Omit + | Promise>; + enabled?: boolean; + debug?: GlobalHookDebugConfig; +} + +export type GlobalHookDebugConfig = CollectionHookDebugConfig; +export interface TrackedGlobal { + hooks?: Partial; + slug: keyof PayloadTypes['globals']; +} + +export interface GlobalsTrackConfig { + track: TrackedGlobal[]; +} + +export type GlobalHooksArgsParameterUnion = Parameters< + NonNullable< + NonNullable< + GlobalConfig['hooks'] + >[GlobalHooksKeys] + >[number] +>[0]; diff --git a/src/types/pluginOptions.ts b/src/types/pluginOptions.ts deleted file mode 100644 index a36f25f..0000000 --- a/src/types/pluginOptions.ts +++ /dev/null @@ -1,2039 +0,0 @@ -import type { - Access, - CollectionAfterChangeHook, - CollectionAfterDeleteHook, - CollectionAfterErrorHook, - CollectionAfterForgotPasswordHook, - CollectionAfterLoginHook, - CollectionAfterLogoutHook, - CollectionAfterMeHook, - CollectionAfterOperationHook, - CollectionAfterReadHook, - CollectionAfterRefreshHook, - CollectionBeforeChangeHook, - CollectionBeforeDeleteHook, - CollectionBeforeLoginHook, - CollectionBeforeOperationHook, - CollectionBeforeReadHook, - CollectionBeforeValidateHook, - CollectionConfig, - CollectionMeHook, - CollectionRefreshHook, - HookOperationType, - LabelFunction, - StaticLabel, -} from 'payload'; - -import type { AuditorLog } from './../collections/auditor.js'; - -export type HookStage - = | 'afterChange' - | 'afterDelete' - | 'afterError' - | 'afterForgotPassword' - | 'afterLogin' - | 'afterLogout' - | 'afterMe' - | 'afterRead' - | 'afterRefresh' - | 'beforeChange' - | 'beforeDelete' - | 'beforeLogin' - | 'beforeOperation' - | 'beforeRead' - | 'beforeValidate' - | 'refresh'; - -export type AuditHookOperationType - = | 'deleteByID' - | 'error' - | 'find' - | 'findByID' - | 'forgotPassword' - | 'logout' - | 'me' - | 'refresh' - | 'updateByID' - | HookOperationType; - -export interface HookOperations { - afterChange: Parameters[0]['operation']; - afterDelete: 'delete'; - afterError: 'error'; - afterForgotPassword: 'afterForgotPassword'; - afterLogin: 'login'; - afterLogout: 'logout'; - afterMe: 'me'; - afterOperation: Parameters[0]['operation']; - afterRead: 'read'; - afterRefresh: 'refresh'; - beforeChange: Parameters[0]['operation']; - beforeDelete: 'delete'; - beforeLogin: 'login'; - beforeOperation: Parameters[0]['operation']; - beforeRead: 'read'; - beforeValidate: Parameters[0]['operation']; - me: 'me'; - refresh: 'refresh'; -} - -export interface AllCollectionHooks { - afterChange: CollectionAfterChangeHook; - afterDelete: CollectionAfterDeleteHook; - afterError: CollectionAfterErrorHook; - afterForgotPassword: CollectionAfterForgotPasswordHook; - afterLogin: CollectionAfterLoginHook; - afterLogout: CollectionAfterLogoutHook; - afterMe: CollectionAfterMeHook; - afterOperation: CollectionAfterOperationHook; - afterRead: CollectionAfterReadHook; - afterRefresh: CollectionAfterRefreshHook; - beforeChange: CollectionBeforeChangeHook; - beforeDelete: CollectionBeforeDeleteHook; - beforeLogin: CollectionBeforeLoginHook; - beforeOperation: CollectionBeforeOperationHook; - beforeRead: CollectionBeforeReadHook; - beforeValidate: CollectionBeforeValidateHook; - me: CollectionMeHook; - refresh: CollectionRefreshHook; -} - -export interface HookOperationDebugModeConfig { - /** - * 📝 How to display debug logs - * - * 📖 long. - * - * 📌@type {'manual' | 'table'} - * - * @default "table" - * - * ``` - * - * ``` - * - * --- - * - * ### ⚠️ Critical Notes - * - The timeStamp field is not displayed in the table type - * - */ - displayType?: 'manual' | 'table'; - /** - * 📝 Enable or disable debug mode - * - * 📖 long. - * - * 📌@type {'manual' | 'table'} - * - * @default false - * - * ``` - * - * ``` - * - * --- - * - * ### ⚠️ Critical Notes - * - The timeStamp field is not displayed in the table type - * - */ - enabled?: boolean; - /** - * 📝 Select the required fields - * - * 📖 To reduce confusion, you can log only the fields you need. - * - * 📌@type {Partial>} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Only the true field is included in the log - * ```ts - * fields:{ - * type:true - * } - * ``` - * - */ - fields?: Partial>; -} - -export interface HookModesConfig { - /** - * 📝 Debug mode for better inspection of logging performance - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enable debug mode - * ```ts - * debug: { - * enabled: boolean - * } - * - * ``` - * ### ⚠️ Critical Notes - * - The generated logs are only displayed in the console and are not stored in the database. - */ - debug?: HookOperationDebugModeConfig; -} - -export interface HookOperationConfig { - /** - * 📝 Custom log creation at a operation level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for the create operation - * ```ts - * create: { - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * }, - * enabled: true, - * }, - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for the current operation - * - Has the highest priority in execution - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Specifies whether logging is enabled or disabled for this operation within the hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Activating the create operation - * ```ts - * create: { - * enabled: true, - * }, - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - If the enabled value is not entered, it is considered false. - * - */ - enabled?: boolean; - - /** - * 📝 Auxiliary side modes - * - * - - */ - modes?: HookModesConfig; -} - -export interface HookTrackingOperationMap { - afterChange: { - /** - * Create operation - * - * Triggered when a new item is created. - */ - create?: HookOperationConfig<'afterChange'>; - - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterChange hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Update operation - * - * Triggered when an existing item is updated. - */ - update?: HookOperationConfig<'afterChange'>; - }; - afterDelete: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterDelete hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * Delete operation - * - * Triggered when an item is deleted. - */ - delete?: HookOperationConfig<'afterDelete'>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterError: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterError hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Error operation - * - * Triggered when an error occurs during another operation. - */ - error?: HookOperationConfig<'afterError'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterForgotPassword: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterForgotPassword hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Forgot password operation - * - * Triggered when a password recovery request is made. - */ - forgotPassword?: HookOperationConfig<'afterForgotPassword'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterLogin: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterLogin hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Login operation - * - * Triggered when a user logs in. - */ - login?: HookOperationConfig<'afterLogin'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterLogout: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterLogout hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Logout operation - * - * Triggered when a user logs out. - */ - logout?: HookOperationConfig<'afterLogout'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterMe: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterMe hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Me operation - * - * Triggered when a user fetches their own profile information. - */ - me?: HookOperationConfig<'afterMe'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - afterOperation: { - countVersions?: HookOperationConfig<'afterOperation'>; - /** - * Create operation - * - * Triggered when a new item is created. - */ - create?: HookOperationConfig<'afterOperation'>; - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterOperation hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * Delete operation - * - * Triggered when an item is deleted. - */ - delete?: HookOperationConfig<'afterOperation'>; - /** - * Delete by ID operation - * - * Triggered when a specific item is deleted by its ID. - */ - deleteByID?: HookOperationConfig<'afterOperation'>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Find operation - * - * Triggered when items are queried based on specific conditions. - */ - find?: HookOperationConfig<'afterOperation'>; - /** - * Find by ID operation - * - * Triggered when a specific item is retrieved by its ID. - */ - findByID?: HookOperationConfig<'afterOperation'>; - /** - * Forgot password operation - * - * Triggered when a password recovery request is made. - */ - forgotPassword?: HookOperationConfig<'afterOperation'>; - /** - * Login operation - * - * Triggered when a user logs in. - */ - login?: HookOperationConfig<'afterOperation'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Refresh operation - * - * Triggered when authentication tokens are refreshed. - */ - refresh?: HookOperationConfig<'afterOperation'>; - - /** - * Update operation - * - * Triggered when an existing item is updated. - */ - update?: HookOperationConfig<'afterOperation'>; - /** - * Update by ID operation - * - * Triggered when a specific item is updated by its ID. - */ - updateByID?: HookOperationConfig<'afterOperation'>; - }; - afterRead: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterRead hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Read operation - * - * Triggered when data is read. - */ - read?: HookOperationConfig<'afterRead'>; - }; - afterRefresh: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all afterRefresh hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Refresh operation - * - * Triggered when authentication tokens are refreshed. - */ - refresh?: HookOperationConfig<'afterRefresh'>; - }; - beforeChange: { - /** - * Create operation - * - * Triggered when a new item is created. - */ - create?: HookOperationConfig<'beforeChange'>; - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeChange hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Update operation - * - * Triggered when an existing item is updated. - */ - update?: HookOperationConfig<'beforeChange'>; - }; - beforeDelete: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeDelete hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * Delete operation - * - * Triggered when an item is deleted. - */ - delete?: HookOperationConfig<'beforeDelete'>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - beforeLogin: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeLogin hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Login operation - * - * Triggered when a user logs in. - */ - login?: HookOperationConfig<'beforeLogin'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - beforeOperation: { - /** - * Create operation - * - * Triggered when a new item is created. - */ - create?: HookOperationConfig<'beforeOperation'>; - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeOperation hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * Delete operation - * - * Triggered when an item is deleted. - */ - delete?: HookOperationConfig<'beforeOperation'>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Forgot password operation - * - * Triggered when a password recovery request is made. - */ - forgotPassword?: HookOperationConfig<'beforeOperation'>; - /** - * Login operation - * - * Triggered when a user logs in. - */ - login?: HookOperationConfig<'beforeOperation'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Read operation - * - * Triggered when data is read. - */ - read?: HookOperationConfig<'beforeOperation'>; - /** - * Refresh operation - * - * Triggered when authentication tokens are refreshed. - */ - refresh?: HookOperationConfig<'beforeOperation'>; - /** - * Update operation - * - * Triggered when an existing item is updated. - */ - update?: HookOperationConfig<'beforeOperation'>; - }; - beforeRead: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeRead hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Read operation - * - * Triggered when data is read. - */ - read?: HookOperationConfig<'beforeRead'>; - }; - beforeValidate: { - /** - * Create operation - * - * Triggered when a new item is created. - */ - create?: HookOperationConfig<'beforeValidate'>; - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all beforeValidate hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Update operation - * - * Triggered when an existing item is updated. - */ - update?: HookOperationConfig<'beforeValidate'>; - }; - /** - * 📝 Custom log creation at a hooks level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the type value for all operations within all hooks - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, type: 'error' } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for all operations and hooks that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hook-level customLogger (which is only for a specific hook)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - - me: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all me hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * Me operation - * - * Triggered when a user fetches their own profile information. - */ - me?: HookOperationConfig<'me'>; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - }; - refresh: { - /** - * 📝 Custom log creation at a hook level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the user value for all refresh hook operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, user: null } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for operations that do not have a dedicated customLogger - * - Do not confuse this customLogger with the hooks-level customLogger (which is for all hooks)! - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - /** - * 📝 Enabling all supported operations within the afterChange hook - * - * 📌@type {boolean} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enabling all operations - * ```ts - * enabled: true - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for operations whose enabled property value is not false - * - If the value is false, it disables all operations (even explicitly enabled operations) - * - */ - enabled?: boolean; - /** - * 📝 Auxiliary side modes - * - * ### ⚠️ Critical Notes - * - By enabling debug mode at the hook level, all operations of that hook are logged - */ - modes?: HookModesConfig; - /** - * Refresh operation - * - * Triggered when authentication tokens are refreshed. - */ - refresh?: HookOperationConfig<'refresh'>; - }; -} - -export interface TrackedCollection { - /** - * 📝 Globally disable tracking for this collection - * - * 📌@type {boolean} - * - * @default undefined - * - */ - disabled?: boolean; - - /** - * 📝 Define payload cms hooks for each collection being tracked - * - * - * 📌@type {Partial} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Define an afterChange hook for a collection - * ```ts - * hooks: { afterChange: { create: { enabled: true } } } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Each hook performs only its own operations - * - Authentication hooks are only triggered when authentication is enabled for the collection - * - * Read more: - * @see {@link https://payloadcms.com/docs/hooks/collections} - */ - hooks?: Partial; - /** Optional label or description for UI/doc */ - label?: string; - - /** - * 📝 The original name of your collection for tracking - * - * 📌@type {string} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Collection tracking posts - * ```ts - * { slug: 'posts' }, - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Make sure the value entered exactly matches the value in your main collection configuration. - * @see {@link https://payloadcms.com/docs/configuration/collections#config-options} - */ - slug: string; -} - -// eslint-disable-next-line unused-imports/no-unused-vars -const allowedSlugs = ['activities', 'auditor', 'logger'] as const; - -export interface BufferDebugFields { - flushStrategy: boolean; - interval: boolean; - size: boolean; -} - -export interface BufferModesConfig { - /** - * 📝 Debug mode for better inspection of logging performance - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Enable debug mode - * ```ts - * debug: { - * enabled: boolean - * } - * - * ``` - * ### ⚠️ Critical Notes - * - The generated logs are only displayed in the console and are not stored in the database. - */ - debug?: { - /** - * 📝 How to display debug logs - * - * 📖 long. - * - * 📌@type {'manual' | 'table'} - * - * @default "table" - * - */ - displayType?: 'manual' | 'table'; - /** - * 📝 Enable or disable debug mode - * - * 📖 long. - * - * 📌@type {'manual' | 'table'} - * - * @default false - * - */ - enabled?: boolean; - /** - * 📝 Select the required fields - * - * 📖 To reduce confusion, you can log only the fields you need. - * - * 📌@type {BufferDebugFields} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Only the size field is included in the log - * ```ts - * fields:{ - * size: true - * } - * ``` - */ - fields?: Partial; - }; -} - -export interface BufferConfig { - /** - * 📝 The basics of injecting logs into the database - * - * - * - * @default "time" - * - * - * 📦 Usage Example - * - * @example 🧪 Data injection based on log count - * ```ts - * flushStrategy: 'size', - * ``` - * ### ⚠️ Critical Notes - * - If you use the size method, your logs will be stored in RAM before being injected into the database. - * - */ - flushStrategy?: 'realtime' | 'size' | 'time'; - /** - * 📝 Auxiliary side modes - */ - modes?: BufferModesConfig; - /** - * 📝 Maximum number of logs before injection - * - * 📖 If the number of logs stored in the buffer memory reaches this number, data will be injected. - * - * 📌@type {number} - * - * @default 10 - * - * - * 📦 Usage Example - * - * @example 🧪 Up to 18 logs can be stored in memory - * ```ts - * size: 18 - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Works when flushStrategy is equal to size - * - If you enter the number 1, use the realtime method and do not define a value for this. - * ```ts - * flushStrategy: 'realtime', - * ``` - * - Very high numbers will increase RAM usage. - * - If you set a high number and on the other hand the logs produced are low, the logs will be recorded later. - * - */ - size?: number; - - /** - * 📝 Maximum time to inject logs into the buffer relative to the last injection - * - * - * 📌@type {Duration} - * - * @default 10000 - * - * - * 📦 Usage Example - * - * @example 🧪 Inject logs every 1 minute - * ```ts - * time: 5000 - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - If you want to enter a value of "1s", set the flushStrategy value to time instead and do not define a value for the time property. - * ```ts - * flushStrategy: 'realtime', - * ``` - * - If you set the time too low, the CPU will be severely affected. - * - If you allow too much time, the logs will be recorded later. If the server crashes, the logs will be lost. - */ - time?: number; -} - -export interface Localization { - collection?: { - fields?: Partial>; - }; -} -export interface PluginCollectionConfig { - /** - * 📝 auditor Collection Accessibility Settings - * - * 📖 Determine who can access the collection for what purposes. You can even fully customize each operation. - * - * - * @default undefined - * - * --- - * ### ⚠️ Critical Notes - * - If you do not define a value, the default access rule is used, which is as follows: - * ```({ req }) => req.user?.role === 'admin'``` - * - Currently only read operations are available - */ - Accessibility?: { - /** - * 📝 Full accessibility customization for collections in every operation - * - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Allow only specific users to read. - * ```ts - * customAccess: { - * read: ({ req }) => req.user?.email === 'admin@example.com', - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - For any operation (such as reading), it works when you have not defined any custom roles in roles for that operation. - * - */ - customAccess?: { - read?: Access; - }; - /** - * 📝 Define which roles are allowed for each operation. - * - * - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Only super-admin and CEO roles can view (read) logs - * ```ts - * roles: { - * read: ['CEO', 'super-admin'], - * }, - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - When you have defined specific roles for an operation, customAccess values for that operation are ignored. - * - */ - roles?: { - read: string[]; - }; - }; - /** - * 📝 Buffer management for injecting data into the database - * - * - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Data Injection into Database Based on Time - * ```ts - * buffer: { - * flushStrategy: 'time', - * } - * ``` - * - * --- - * ## ⚠️ Critical Notes - * - These settings are very important, to change these settings, consider all aspects including RAM and server power. - * - */ - buffer?: BufferConfig; - /** - * 📝 Collection main configuration - * - * You can fully customize the entire root collection - * - * 📌@type {TypedRootCollection} - * - * @default undefined - * - * @example 🧪 Rename the slug, add a new field, and change the collection label - * - *```ts - * rootCollectionConfig: (defaults) => { - * const prevConf = defaults - * return { - * ...prevConf, - * slug: 'new slug', - * fields: [ - * ...prevConf.fields, - * { - * name: 'product', - * type: 'text', - * }, - * ], - * labels: { - * plural: 'logs', - * singular: 'log', - * }, - * } - * }, - *``` - * --- - * ### ⚠️ Critical Notes - * - Changing collection values requires a lot of testing to make sure everything works correctly - * - In each property, either change all the values or use the default values of the same property (which is for the plugin itself) in the context, otherwise you will encounter an error - * ```ts - * rootCollectionConfig: (defaults) => { - * const prevConf = defaults - * return { - * ...prevConf, - * slug: 'new slug', - * hooks:{ - * ...prevConf.hooks, - * // your hooks ... - * } - * } - * }, - * ``` - */ - configureRootCollection?: (defaults: CollectionConfig) => Partial; - /** - * 📝 Internationalization for the plugin - * - * 📌@type {Localization} - * - * @default undefined - */ - locale?: Localization; - /** - * 📝 Uses internal payload CMS configuration for slug - * - * 📖 You can customize the plugin's built-in collection slug. - * - * @see {@link https://payloadcms.com/docs/configuration/collections#config-options} - * - * ### ⚠️ Critical Notes - * - If you define a slug name in the `configureRootCollection` property, this value is ignored. - * - */ - slug?: (typeof allowedSlugs)[number] | ({} & string); - /** - * 📝 Collection tracking management - * - * 📖 You should define the collections you want to track in this section. - * You can specify which hook each collection should use and what operations (within each hook) should generate logs. - * - * 📌@type {TrackedCollection[]} - * - * @default [] - * - * - * - * 📦 Usage Example - * - * @example 🧪 Track post collections when a new post is created - * ```ts - * trackCollections: [ - * { slug: 'posts', hooks: { afterChange: { create: { enabled: true } } } }, - * ], - * ``` - * @example 🧪 Temporarily disable tracking for a collection - * ```ts - * trackCollections: [ - * { slug: 'slug', disabled: true, hooks: { afterChange: { create: { enabled: true } } } }, - * ], - * ``` - * --- - * ### ⚠️ Critical Notes - * - To temporarily disable tracking for any collection, you can use the disabled key. - * - */ - trackCollections: TrackedCollection[]; -} - -export interface AutomationConfig { - logCleanup?: { - /** - * @default 604800000 // 1 week - */ - olderThan?: number; - /** - * @default "payload-auditor-queue" - */ - queueName?: string; - /** - * The cron for scheduling the job. - * - * @default '0 3 * * *' // At 03:00 AM - * - * @example - * ┌───────────── (optional) second (0 - 59) - * │ ┌───────────── minute (0 - 59) - * │ │ ┌───────────── hour (0 - 23) - * │ │ │ ┌───────────── day of the month (1 - 31) - * │ │ │ │ ┌───────────── month (1 - 12) - * │ │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday) - * │ │ │ │ │ │ - * │ │ │ │ │ │ - * - '* 0 * * * *' every hour at minute 0 - * - '* 0 0 * * *' daily at midnight - * - '* 0 0 * * 0' weekly at midnight on Sundays - * - '* 0 0 1 * *' monthly at midnight on the 1st day of the month - * - '* 0/5 * * * *' every 5 minutes - * - '* * * * * *' every second - */ - cronTime?: string; - }; -} - -export interface PluginOptions { - /** - * 📝 Automatic plugin process management - * - * - * 📌@type {AutomationConfig} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Setting a strategy for the log cleaner - * ``` - * - * automation:{ - * logCleanup: { - * strategy: "time" - * } - * } - * - *``` - */ - automation?: AutomationConfig; - - /** - * 📝 Settings related to collections and the collection used by the plugin - * - * 📌@type {CollectionConfig} - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Media collection tracking - * ```ts - * trackCollections: [ - * { slug: 'media', hooks: { afterChange: { update: { enabled: true } } } }, - * ], - * ``` - * - * --- - * #### ⚠️ Critical Notes - * - If defined, you must also enter the value of trackCollections. - * - */ - collection?: PluginCollectionConfig; - /** - * 📝 Custom log creation at a global level - * - * @default undefined - * - * - * 📦 Usage Example - * - * @example 🧪 Change the userAgent value for all operations - * ```ts - * customLogger: (args, fields) => { - * return { ...fields, userAgent: 'custom user agent' } - * } - * ``` - * - * --- - * ### ⚠️ Critical Notes - * - Only works for active operations - * - This function is only executed for all operations and hooks that do not have a dedicated customLogger - * - It works for both collection hooks and globals hooks - */ - customLogger?: ( - args: Parameters[0], - fields: Omit, - ) => Omit | Promise>; - - /** - * 📝 Enable or disable the plugin - * - * 📌@type {boolean} - * - * @default "true" - */ - enabled?: boolean; -} diff --git a/src/types/types.d.ts b/src/types/types.d.ts index 0e12af0..3e054cf 100644 --- a/src/types/types.d.ts +++ b/src/types/types.d.ts @@ -1,11 +1,11 @@ import type { RequestContext as OriginalRequestContext } from 'payload'; -import type { PluginOptions, TrackedCollection } from './../types/pluginOptions.ts'; +import type { PluginConfig, TrackedCollection } from './../types/pluginOptions.ts'; declare module 'payload' { // Create a new interface that merges your additional fields with the original one export interface RequestContext extends OriginalRequestContext { - pluginOptions: PluginOptions; + pluginOptions: PluginConfig; userHookConfig?: TrackedCollection; } } diff --git a/src/utils/prettyDebugLog.ts b/src/utils/prettyDebugLog.ts index d75ba08..8b97ca4 100644 --- a/src/utils/prettyDebugLog.ts +++ b/src/utils/prettyDebugLog.ts @@ -1,33 +1,27 @@ -import type { hookTypes } from './../pluginUtils/configHelpers.js'; -import type { AuditHookOperationType } from './../types/pluginOptions.js'; - /* eslint-disable no-console */ -export const prettyDebugLog = ( - title: (typeof hookTypes)[number] | ({} & string), - subtitle: ({} & string) | AuditHookOperationType, - data: Record, - type: 'manual' | 'table' = 'table', -) => { - if (!data || Object.keys(data).length === 0) { + +import type { LiteralUnion } from 'type-fest'; + +import type { GlobalHooksKeys } from '../types/global.js'; +import type { CollectionHooksKeys, CollectionHooksOperation } from '../types/collection.js'; + +type Params = { + title: LiteralUnion; + subtitle: LiteralUnion; + data: Record; +}; + +export const prettyDebugLog = (params: Params) => { + if (!params.data || Object.keys(params.data).length === 0) { console.log('%cNo data to display', 'color: #888; font-style: italic;'); } else { - if (type === 'table') { - console.groupCollapsed( - `| %c🔍 Debug Log - ${title} [${subtitle}]`, - 'color: #007acc; font-weight: bold; font-size: 14px;', - ); - console.table(data); - console.groupEnd(); - } - else if (type === 'manual') { - console.log('-----------------------------------------'); - console.log(`| %c🔍 Debug Log - ${title} ${subtitle && `[${subtitle}]`} |`); - console.log('-----------------------------------------'); - for (const [key, value] of Object.entries(data)) { - console.log(`|- %c${key}:`, 'color: #666; font-weight: 600;', value); - } - console.log('-------------------------------------------'); + console.log('-----------------------------------------'); + console.log(`| %c🔍 Debug Log - ${params.title} ${params.subtitle && `[${params.subtitle}]`} |`); + console.log('-----------------------------------------'); + for (const [key, value] of Object.entries(params.data)) { + console.log(`|- %c${key}:`, 'color: #666; font-weight: 600;', value); } + console.log('-------------------------------------------'); } };