From 8a9056e7678a90b31e608616ea9dfcf17fa806fd Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Sat, 9 Aug 2025 12:00:40 +0000 Subject: [PATCH] feat(core): initial release of SKR03/SKR04 German accounting standards implementation - Complete implementation of German standard charts of accounts - SKR03 (Process Structure Principle) for trading/service companies - SKR04 (Financial Classification Principle) for manufacturing companies - Double-entry bookkeeping with MongoDB persistence - Comprehensive reporting suite with DATEV export - Full TypeScript support and type safety --- .gitea/workflows/default_nottags.yaml | 66 + .gitea/workflows/default_tags.yaml | 124 + .gitignore | 19 + .vscode/launch.json | 11 + .vscode/settings.json | 26 + changelog.md | 42 + npmextra.json | 17 + package.json | 62 + pnpm-lock.yaml | 9207 +++++++++++++++++++++++++ readme.hints.md | 3 + readme.md | 409 ++ readme.plan.md | 243 + services.sh | 429 ++ test/test.basic.ts | 78 + test/test.skr03.ts | 159 + test/test.skr04.ts | 194 + test/test.transactions.ts | 276 + ts/index.ts | 10 + ts/plugins.ts | 7 + ts/skr.api.ts | 533 ++ ts/skr.classes.account.ts | 238 + ts/skr.classes.chartofaccounts.ts | 508 ++ ts/skr.classes.journalentry.ts | 318 + ts/skr.classes.ledger.ts | 528 ++ ts/skr.classes.reports.ts | 721 ++ ts/skr.classes.transaction.ts | 300 + ts/skr.database.ts | 39 + ts/skr.types.ts | 154 + ts/skr03.data.ts | 901 +++ ts/skr04.data.ts | 923 +++ tsconfig.json | 15 + 31 files changed, 16560 insertions(+) create mode 100644 .gitea/workflows/default_nottags.yaml create mode 100644 .gitea/workflows/default_tags.yaml create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 changelog.md create mode 100644 npmextra.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 readme.hints.md create mode 100644 readme.md create mode 100644 readme.plan.md create mode 100755 services.sh create mode 100644 test/test.basic.ts create mode 100644 test/test.skr03.ts create mode 100644 test/test.skr04.ts create mode 100644 test/test.transactions.ts create mode 100644 ts/index.ts create mode 100644 ts/plugins.ts create mode 100644 ts/skr.api.ts create mode 100644 ts/skr.classes.account.ts create mode 100644 ts/skr.classes.chartofaccounts.ts create mode 100644 ts/skr.classes.journalentry.ts create mode 100644 ts/skr.classes.ledger.ts create mode 100644 ts/skr.classes.reports.ts create mode 100644 ts/skr.classes.transaction.ts create mode 100644 ts/skr.database.ts create mode 100644 ts/skr.types.ts create mode 100644 ts/skr03.data.ts create mode 100644 ts/skr04.data.ts create mode 100644 tsconfig.json diff --git a/.gitea/workflows/default_nottags.yaml b/.gitea/workflows/default_nottags.yaml new file mode 100644 index 0000000..0bae651 --- /dev/null +++ b/.gitea/workflows/default_nottags.yaml @@ -0,0 +1,66 @@ +name: Default (not tags) + +on: + push: + tags-ignore: + - '**' + +env: + IMAGE: code.foss.global/host.today/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} + +jobs: + security: + runs-on: ubuntu-latest + continue-on-error: true + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm and npmci + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + + - name: Run npm prepare + run: npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + if: ${{ always() }} + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci node install stable + npmci npm install + npmci npm build diff --git a/.gitea/workflows/default_tags.yaml b/.gitea/workflows/default_tags.yaml new file mode 100644 index 0000000..821d33f --- /dev/null +++ b/.gitea/workflows/default_tags.yaml @@ -0,0 +1,124 @@ +name: Default (tags) + +on: + push: + tags: + - '*' + +env: + IMAGE: code.foss.global/host.today/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} + +jobs: + security: + runs-on: ubuntu-latest + continue-on-error: true + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + if: ${{ always() }} + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci node install stable + npmci npm install + npmci npm build + + release: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Release + run: | + npmci node install stable + npmci npm publish + + metadata: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + continue-on-error: true + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @ship.zone/npmci + npmci npm prepare + + - name: Code quality + run: | + npmci command npm install -g typescript + npmci npm install + + - name: Trigger + run: npmci trigger + + - name: Build docs and upload artifacts + run: | + npmci node install stable + npmci npm install + pnpm install -g @git.zone/tsdoc + npmci command tsdoc + continue-on-error: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b26089 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.nogit/ + +# artifacts +coverage/ +public/ + +# installs +node_modules/ + +# caches +.yarn/ +.cache/ +.rpt2_cache + +# builds +dist/ +dist_*/ + +#------# custom \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..26e9f92 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "npm test", + "name": "Run npm test", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3648eaa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "json.schemas": [ + { + "fileMatch": ["/npmextra.json"], + "schema": { + "type": "object", + "properties": { + "npmci": { + "type": "object", + "description": "settings for npmci" + }, + "gitzone": { + "type": "object", + "description": "settings for gitzone", + "properties": { + "projectType": { + "type": "string", + "enum": ["website", "element", "service", "npm", "wcc"] + } + } + } + } + } + } + ] +} diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..8ae76e5 --- /dev/null +++ b/changelog.md @@ -0,0 +1,42 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.0] - 2025-01-09 + +### Added +- Initial release of @fin.cx/skr module +- Complete SKR03 implementation (Process Structure Principle) +- Complete SKR04 implementation (Financial Classification Principle) +- Double-entry bookkeeping validation system +- MongoDB persistence layer using @push.rocks/smartdata +- Comprehensive account management (100+ predefined accounts per SKR standard) +- Transaction posting and reversal capabilities +- Journal entry support with multiple lines +- Financial reporting suite: + - Trial Balance generation + - Income Statement (P&L) + - Balance Sheet + - General Ledger + - Cash Flow Statement +- DATEV-compatible export formats +- Full TypeScript support with comprehensive type definitions +- API layer for external integration +- CSV import/export functionality +- VAT handling and cost center tracking +- Automatic balance calculations +- Period closing functionality +- Batch transaction processing + +### Technical Features +- Type-safe database operations +- Indexed MongoDB collections for performance +- Transaction atomicity and consistency +- Comprehensive validation rules +- 4-digit account number validation +- Account class hierarchy (0-9) +- Support for custom accounts +- Real-time balance updates \ No newline at end of file diff --git a/npmextra.json b/npmextra.json new file mode 100644 index 0000000..495acb9 --- /dev/null +++ b/npmextra.json @@ -0,0 +1,17 @@ +{ + "npmci": { + "npmGlobalTools": [], + "npmAccessLevel": "public" + }, + "gitzone": { + "projectType": "npm", + "module": { + "githost": "code.foss.global", + "gitscope": "fin.cx", + "gitrepo": "skr", + "description": "SKR03 and SKR04 German accounting standards for double-entry bookkeeping", + "npmPackagename": "@fin.cx/skr", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9b512b5 --- /dev/null +++ b/package.json @@ -0,0 +1,62 @@ +{ + "name": "@fin.cx/skr", + "version": "1.0.0", + "description": "SKR03 and SKR04 German accounting standards for double-entry bookkeeping", + "main": "dist_ts/index.js", + "typings": "dist_ts/index.d.ts", + "type": "module", + "scripts": { + "test": "tstest test/ --verbose --logfile --timeout=60", + "build": "tsbuild --web --node", + "buildDocs": "tsdoc" + }, + "keywords": [ + "skr03", + "skr04", + "accounting", + "bookkeeping", + "double-entry", + "german", + "datev", + "mongodb", + "typescript" + ], + "author": "Fin.cx", + "license": "MIT", + "packageManager": "pnpm@10.11.0", + "dependencies": { + "@push.rocks/smartdata": "^5.15.1", + "@push.rocks/smartlog": "^3.1.8", + "@push.rocks/smarttime": "^4.1.1", + "@push.rocks/smartunique": "^3.0.9" + }, + "devDependencies": { + "@git.zone/tsbuild": "^2.6.4", + "@git.zone/tsrun": "^1.3.3", + "@git.zone/tstest": "^2.3.2" + }, + "repository": { + "type": "git", + "url": "https://code.foss.global/fin.cx/skr.git" + }, + "bugs": { + "url": "https://code.foss.global/fin.cx/skr/issues" + }, + "homepage": "https://code.foss.global/fin.cx/skr#readme", + "private": true, + "files": [ + "ts/**/*", + "ts_web/**/*", + "dist/**/*", + "dist_*/**/*", + "dist_ts/**/*", + "dist_ts_web/**/*", + "assets/**/*", + "cli.js", + "npmextra.json", + "readme.md" + ], + "pnpm": { + "overrides": {} + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..8b7883b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9207 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@push.rocks/smartdata': + specifier: ^5.15.1 + version: 5.15.1(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + '@push.rocks/smartlog': + specifier: ^3.1.8 + version: 3.1.8 + '@push.rocks/smarttime': + specifier: ^4.1.1 + version: 4.1.1 + '@push.rocks/smartunique': + specifier: ^3.0.9 + version: 3.0.9 + devDependencies: + '@git.zone/tsbuild': + specifier: ^2.6.4 + version: 2.6.4 + '@git.zone/tsrun': + specifier: ^1.3.3 + version: 1.3.3 + '@git.zone/tstest': + specifier: ^2.3.2 + version: 2.3.2(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6)(typescript@5.8.3) + +packages: + + '@api.global/typedrequest-interfaces@2.0.2': + resolution: {integrity: sha512-D+mkr4IiUZ/eUgrdp5jXjBKOW/iuMcl0z2ZLQsLLypKX/psFGD3viZJ58FNRa+/1OSM38JS5wFyoWl8oPEFLrw==} + + '@api.global/typedrequest-interfaces@3.0.19': + resolution: {integrity: sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==} + + '@api.global/typedrequest@3.1.10': + resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} + + '@api.global/typedserver@3.0.74': + resolution: {integrity: sha512-lrXaCPaVZLihlF9w39pEqTw2kiHFCheRKTZuK07S7gTGyfdXKPmccVR/EK4ox58E1gjh9A2K8yY8ZWGcjuSJkw==} + + '@api.global/typedsocket@3.0.1': + resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity@3.864.0': + resolution: {integrity: sha512-IH3RSg/Zy2+yXQ2d4jmMk2U8A+BuJ9uNUYPWAg144yUUxanN1Czb+GyFKeJO4NGhVnn5D+j1YoRLpJN8PW2B0g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-s3@3.864.0': + resolution: {integrity: sha512-QGYi9bWliewxumsvbJLLyx9WC0a4DP4F+utygBcq0zwPxaM0xDfBspQvP1dsepi7mW5aAjZmJ2+Xb7X0EhzJ/g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.864.0': + resolution: {integrity: sha512-THiOp0OpQROEKZ6IdDCDNNh3qnNn/kFFaTSOiugDpgcE5QdsOxh1/RXq7LmHpTJum3cmnFf8jG59PHcz9Tjnlw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.864.0': + resolution: {integrity: sha512-LFUREbobleHEln+Zf7IG83lAZwvHZG0stI7UU0CtwyuhQy5Yx0rKksHNOCmlM7MpTEbSCfntEhYi3jUaY5e5lg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.864.0': + resolution: {integrity: sha512-jF6xJS67nPvJ/ElvdA2Q/EDArTcd0fKS3R6zImupOkTMm9PwmEM/BM7hpQCUFkVcaUhtvPpYCtuolGq9ezuKng==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.864.0': + resolution: {integrity: sha512-StJPOI2Rt8UE6lYjXUpg6tqSZaM72xg46ljPg8kIevtBAAfdtq9K20qT/kSliWGIBocMFAv0g2mC0hAa+ECyvg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.864.0': + resolution: {integrity: sha512-E/RFVxGTuGnuD+9pFPH2j4l6HvrXzPhmpL8H8nOoJUosjx7d4v93GJMbbl1v/fkDLqW9qN4Jx2cI6PAjohA6OA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.864.0': + resolution: {integrity: sha512-PlxrijguR1gxyPd5EYam6OfWLarj2MJGf07DvCx9MAuQkw77HBnsu6+XbV8fQriFuoJVTBLn9ROhMr/ROAYfUg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.864.0': + resolution: {integrity: sha512-2BEymFeXURS+4jE9tP3vahPwbYRl0/1MVaFZcijj6pq+nf5EPGvkFillbdBRdc98ZI2NedZgSKu3gfZXgYdUhQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.864.0': + resolution: {integrity: sha512-Zxnn1hxhq7EOqXhVYgkF4rI9MnaO3+6bSg/tErnBQ3F8kDpA7CFU24G1YxwaJXp2X4aX3LwthefmSJHwcVP/2g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.864.0': + resolution: {integrity: sha512-UPyPNQbxDwHVGmgWdGg9/9yvzuedRQVF5jtMkmP565YX9pKZ8wYAcXhcYdNPWFvH0GYdB0crKOmvib+bmCuwkw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.864.0': + resolution: {integrity: sha512-nNcjPN4SYg8drLwqK0vgVeSvxeGQiD0FxOaT38mV2H8cu0C5NzpvA+14Xy+W6vT84dxgmJYKk71Cr5QL2Oz+rA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-providers@3.864.0': + resolution: {integrity: sha512-k4K7PzvHpdHQLczgWT26Yk6t+VBwZ35jkIQ3dKODvBjfzlYHTX0y+VgemmDWrat1ahKfYb/OAw/gdwmnyxsAsw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.862.0': + resolution: {integrity: sha512-Wcsc7VPLjImQw+CP1/YkwyofMs9Ab6dVq96iS8p0zv0C6YTaMjvillkau4zFfrrrTshdzFWKptIFhKK8Zsei1g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-expect-continue@3.862.0': + resolution: {integrity: sha512-oG3AaVUJ+26p0ESU4INFn6MmqqiBFZGrebST66Or+YBhteed2rbbFl7mCfjtPWUFgquQlvT1UP19P3LjQKeKpw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.864.0': + resolution: {integrity: sha512-MvakvzPZi9uyP3YADuIqtk/FAcPFkyYFWVVMf5iFs/rCdk0CUzn02Qf4CSuyhbkS6Y0KrAsMgKR4MgklPU79Wg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.862.0': + resolution: {integrity: sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.862.0': + resolution: {integrity: sha512-MnwLxCw7Cc9OngEH3SHFhrLlDI9WVxaBkp3oTsdY9JE7v8OE38wQ9vtjaRsynjwu0WRtrctSHbpd7h/QVvtjyA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.862.0': + resolution: {integrity: sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.862.0': + resolution: {integrity: sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.864.0': + resolution: {integrity: sha512-GjYPZ6Xnqo17NnC8NIQyvvdzzO7dm+Ks7gpxD/HsbXPmV2aEfuFveJXneGW9e1BheSKFff6FPDWu8Gaj2Iu1yg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.862.0': + resolution: {integrity: sha512-72VtP7DZC8lYTE2L3Efx2BrD98oe9WTK8X6hmd3WTLkbIjvgWQWIdjgaFXBs8WevsXkewIctfyA3KEezvL5ggw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.864.0': + resolution: {integrity: sha512-wrddonw4EyLNSNBrApzEhpSrDwJiNfjxDm5E+bn8n32BbAojXASH8W8jNpxz/jMgNkkJNxCfyqybGKzBX0OhbQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.864.0': + resolution: {integrity: sha512-H1C+NjSmz2y8Tbgh7Yy89J20yD/hVyk15hNoZDbCYkXg0M358KS7KVIEYs8E2aPOCr1sK3HBE819D/yvdMgokA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.862.0': + resolution: {integrity: sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.864.0': + resolution: {integrity: sha512-w2HIn/WIcUyv1bmyCpRUKHXB5KdFGzyxPkp/YK5g+/FuGdnFFYWGfcO8O+How4jwrZTarBYsAHW9ggoKvwr37w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.864.0': + resolution: {integrity: sha512-gTc2QHOBo05SCwVA65dUtnJC6QERvFaPiuppGDSxoF7O5AQNK0UR/kMSenwLqN8b5E1oLYvQTv3C1idJLRX0cg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.862.0': + resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.804.0': + resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.862.0': + resolution: {integrity: sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.804.0': + resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.862.0': + resolution: {integrity: sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==} + + '@aws-sdk/util-user-agent-node@3.864.0': + resolution: {integrity: sha512-d+FjUm2eJEpP+FRpVR3z6KzMdx1qwxEYDz8jzNKwxYLBBquaBaP/wfoMtMQKAcbrR7aT9FZVZF7zDgzNxUvQlQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.862.0': + resolution: {integrity: sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@cloudflare/workers-types@4.20250809.0': + resolution: {integrity: sha512-MAG8S0aL+/WT52/XaqXCb6qc7XyfuYqmhwnpyLsx+RUkMZJxkhpJqaOny3Wa4IlWQfpgtQXktogmEoxxCpUmfA==} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@configvault.io/interfaces@1.0.17': + resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@design.estate/dees-comms@1.0.27': + resolution: {integrity: sha512-GvzTUwkV442LD60T08iqSoqvhA02Mou5lFvvqBPc4yBUiU7cZISqBx+76xvMgMIEI9Dx9JfTl4/2nW8MoVAanw==} + + '@design.estate/dees-domtools@2.3.3': + resolution: {integrity: sha512-diIRuEWNRko508+eXDGVD9yxte+50VSuSsxBvWXUnE7ZPOLo9Y0oNyVi+R1Rb1AVJiXcGCORLdCtmCIcId40VA==} + + '@design.estate/dees-element@2.1.2': + resolution: {integrity: sha512-ZiwvE411RJPHaYio26asQLnSmtJ6G1HRLYWbxW/HvCMbFtrcrXysP1y4PQ9KjdNfiQ4yoWPjTtwYMJjLE0NcbA==} + + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@git.zone/tsbuild@2.6.4': + resolution: {integrity: sha512-eeNW5hnXHU9lPzTaMbtdYDkb6cpFFC8fF5849BiwLO4N1Ga9Q5Om/6w5SZyJQcct8rHjcTgOOWdlxhjeKCr6NQ==} + hasBin: true + + '@git.zone/tsbundle@2.5.1': + resolution: {integrity: sha512-gBskgM3ECy9FEmhCWnQahDyFCAjjw/7emjx/KYM/FOlPqGV+hmYzt368zwSlkzOGgYF8k9OZ+mp6vexDL/+f2w==} + hasBin: true + + '@git.zone/tspublish@1.10.1': + resolution: {integrity: sha512-6SisDU25m9+FDmrjd/93b7pDRhIU1svmrD42cNLL1IVt29XcD4BudpXlOXd/peuSAJLxFvE2krxOyWMU6WUHKw==} + hasBin: true + + '@git.zone/tsrun@1.3.3': + resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==} + hasBin: true + + '@git.zone/tstest@2.3.2': + resolution: {integrity: sha512-FwWU2yt8UBfua7JZD0Q7mUtzioOE8PQTeA6U6qhhuwjgaQq8bYm8RcwbDZD5wLQAXaniJ5SVfJcDJsyCNDjmUg==} + hasBin: true + + '@happy-dom/global-registrator@15.11.7': + resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} + engines: {node: '>=18.0.0'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@koa/router@9.4.0': + resolution: {integrity: sha512-dOOXgzqaDoHu5qqMEPLKEgLz5CeIA7q8+1W62mCvFVCOqeC71UoTGJ4u1xUSOpIl2J1x2pqrNULkFteUeZW3/A==} + engines: {node: '>= 8.0.0'} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@lit-labs/ssr-dom-shim@1.4.0': + resolution: {integrity: sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==} + + '@lit/reactive-element@2.1.1': + resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} + + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + + '@module-federation/error-codes@0.17.1': + resolution: {integrity: sha512-n6Elm4qKSjwAPxLUGtwnl7qt4y1dxB8OpSgVvXBIzqI9p27a3ZXshLPLnumlpPg1Qudaj8sLnSnFtt9yGpt5yQ==} + + '@module-federation/runtime-core@0.17.1': + resolution: {integrity: sha512-LCtIFuKgWPQ3E+13OyrVpuTPOWBMI/Ggwsq1Q874YeT8Px28b8tJRCj09DjyRFyhpSPyV/uG80T6iXPAUoLIfQ==} + + '@module-federation/runtime-tools@0.17.1': + resolution: {integrity: sha512-4kr6zTFFwGywJx6whBtxsc84V+COAuuBpEdEbPZN//YLXhNB0iz2IGsy9r9wDl+06h84bD+3dQ05l9euRLgXzQ==} + + '@module-federation/runtime@0.17.1': + resolution: {integrity: sha512-vKEN32MvUbpeuB/s6UXfkHDZ9N5jFyDDJnj83UTJ8n4N1jHIJu9VZ6Yi4/Ac8cfdvU8UIK9bIbfVXWbUYZUDsw==} + + '@module-federation/sdk@0.17.1': + resolution: {integrity: sha512-nlUcN6UTEi+3HWF+k8wPy7gH0yUOmCT+xNatihkIVR9REAnr7BUvHFGlPJmx7WEbLPL46+zJUbtQHvLzXwFhng==} + + '@module-federation/webpack-bundler-runtime@0.17.1': + resolution: {integrity: sha512-Swspdgf4PzcbvS9SNKFlBzfq8h/Qxwqjq/xRSqw1pqAZWondZQzwTTqPXhgrg0bFlz7qWjBS/6a8KuH/gRvGaQ==} + + '@mongodb-js/saslprep@1.3.0': + resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} + + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@oxc-project/runtime@0.80.0': + resolution: {integrity: sha512-3rzy1bJAZ4s7zV9TKT60x119RwJDCDqEtCwK/Zc2qlm7wGhiIUxLLYUhE/mN91yB0u1kxm5sh4NjU12sPqQTpg==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.80.0': + resolution: {integrity: sha512-xxHQm8wfCv2e8EmtaDwpMeAHOWqgQDAYg+BJouLXSQt5oTKu9TIXrgNMGSrM2fLvKmECsRd9uUFAAD+hPyootA==} + + '@pdf-lib/standard-fonts@1.0.0': + resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==} + + '@pdf-lib/upng@1.0.1': + resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@puppeteer/browsers@2.10.6': + resolution: {integrity: sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==} + engines: {node: '>=18'} + hasBin: true + + '@push.rocks/consolecolor@2.0.3': + resolution: {integrity: sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==} + + '@push.rocks/early@4.0.4': + resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} + + '@push.rocks/isohash@2.0.1': + resolution: {integrity: sha512-UulhEui8O9Ei9fSqTldsB73TUmAFNqEBk82tHsJSLLpNK9gJZQE82iaSNsQUakoUQ2c9KueueMfwC3IoDaYRrQ==} + + '@push.rocks/isounique@1.0.5': + resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} + + '@push.rocks/levelcache@3.1.1': + resolution: {integrity: sha512-+JpDNEt+EuvmbtADGH9SkODxBy+slHDDzs43mAbuMbwpVvi6uNuMK0Mkhrfz9UFpxUSp+cJE/jl/OxdpD0xL1A==} + + '@push.rocks/lik@6.2.2': + resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + + '@push.rocks/mongodump@1.0.8': + resolution: {integrity: sha512-oDufyjNBg8I50OaJvbHhc0RnRpJQ544dr9her0G6sA8JmI3hD2/amTdcPLVIX1kzYf5GsTUKeWuRaZgdNqz3ew==} + + '@push.rocks/qenv@6.1.0': + resolution: {integrity: sha512-1FUFMlSVwFSFg8LbqfkzJ2LLP4lMGApUtgOpsvrde6+AxBmB4gjoNgCUH7z3xXfDAtYqcrtSELXBNE0xVL1MqQ==} + + '@push.rocks/smartarchive@3.0.8': + resolution: {integrity: sha512-1jPmR0b7hXmjYQoRiTlRXrIbZcdcFmSdGOfznufjcDpGPe86Km0d8TBnzqghTx4dTihzKC67IxAaz/DM3lvxpA==} + + '@push.rocks/smartbrowser@2.0.8': + resolution: {integrity: sha512-0KWRZj3TuKo/sNwgPbiSE6WL+TMeR19t1JmXBZWh9n8iA2mpc4HhMrQAndEUdRCkx5ofSaHWojIRVFzGChj0Dg==} + + '@push.rocks/smartbucket@3.3.7': + resolution: {integrity: sha512-RiOuEtwHJ+HFbV1nlZgh5VuMvP6PXElX6rVe7OSQsyNCBybRQa/d1qDic92+2Ejx852DGeHlyREELQCxd/a/7w==} + + '@push.rocks/smartbuffer@3.0.5': + resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} + + '@push.rocks/smartcache@1.0.16': + resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==} + + '@push.rocks/smartchok@1.1.1': + resolution: {integrity: sha512-WmNigGmn1muBJMANVuJb4F8x3TzgYrnn6YZm6ixTsG+0WFbYevivEwp+J4S7npobLHsR7ynf+Ky8LxRYmsL50A==} + + '@push.rocks/smartcli@4.0.11': + resolution: {integrity: sha512-KDWfUqWBoUZsOEtsDx36d6qc8GG7Zo5E+HHamYY68KVDO8BMu6jbBucoUUPDksczLEmbXKLmroBP1mn/xozQOA==} + + '@push.rocks/smartclickhouse@2.0.17': + resolution: {integrity: sha512-IYO8Obor/Ruam2KQ2B/+5uQ+rL0exU5KZoSgOc3jkkrfjn+zZenN2xoV8lVqavAtxZVfG7MfxFrcv6I7I9ZMmA==} + + '@push.rocks/smartcrypto@2.0.4': + resolution: {integrity: sha512-1+/5bsjyataf5uUkUNnnVXGRAt+gHVk1KDzozjTqgqJxHvQk1d9fVDohL6CxUhUucTPtu5VR5xNBiV8YCDuGyw==} + + '@push.rocks/smartdata@5.15.1': + resolution: {integrity: sha512-sxMLRQpQDnF4fkAYLcnLNxF3zlRuiwb9I1P8QqBqyNsTQzvVxCuZoI3AYjg6O+j7ZgkNyrmQXHrN/7EJJx/bPg==} + + '@push.rocks/smartdelay@3.0.5': + resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} + + '@push.rocks/smartenv@5.0.13': + resolution: {integrity: sha512-ACXmUcHZHl2CF2jnVuRw9saRRrZvJblCRs2d+K5aLR1DfkYFX3eA21kcMlKeLisI3aGNbIj9vz/rowN5qkRkfA==} + + '@push.rocks/smartexit@1.0.23': + resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==} + + '@push.rocks/smartexpect@2.5.0': + resolution: {integrity: sha512-yoyuCoQ3tTiAriuvF+/09fNbVfFnacudL2SwHSzPhX/ugaE7VTSWXQ9A34eKOWvil0MPyDcOY36fVZDxvrPd8A==} + + '@push.rocks/smartfeed@1.0.11': + resolution: {integrity: sha512-02uhXxQamgfBo3T12FsAdfyElnpoWuDUb08B2AE60DbIaukVx/7Mi17xwobApY1flNSr5StZDt8N8vxPhBhIXw==} + + '@push.rocks/smartfile-interfaces@1.0.7': + resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} + + '@push.rocks/smartfile@10.0.41': + resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} + + '@push.rocks/smartfile@11.2.5': + resolution: {integrity: sha512-Szmv0dFvDZBLsAOC2kJ0r0J0vZM0zqMAXT1G8XH11maU8pNYtYC1vceTpxoZGy4qbJcko7oGpgNUAlY+8LN3HA==} + + '@push.rocks/smartguard@3.1.0': + resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} + + '@push.rocks/smarthash@3.2.3': + resolution: {integrity: sha512-fBPQCGYtOlfLORm9tI3MyoJVT8bixs3MNTAfDDGBw91UKfOVOrPk5jBU+PwVnqZl7IE5mc9b+4wqAJn3giqEpw==} + + '@push.rocks/smartjson@5.0.20': + resolution: {integrity: sha512-ogGBLyOTluphZVwBYNyjhm5sziPGuiAwWihW07OSRxD4HQUyqj9Ek6r1pqH07JUG5EbtRYivM1Yt1cCwnu3JVQ==} + + '@push.rocks/smartlog-destination-devtools@1.0.12': + resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} + + '@push.rocks/smartlog-destination-local@9.0.2': + resolution: {integrity: sha512-htzIY+4+hU61Z2J4Oz+IHnAB3RGe+fpS0VKCKnAoppZqzMWnJ3UOgYIyr4djDBy2WtgpXV/16KdisKrOmwuuvw==} + + '@push.rocks/smartlog-interfaces@3.0.2': + resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} + + '@push.rocks/smartlog@3.1.8': + resolution: {integrity: sha512-j4H5x4/hEmiIO7q+/LKyX3N+AhRIOj1jDE4TvZDvujZkbT/9wEWfpO1bqeMe/EQbg1eOQMlAuyrcLXUcDICpQg==} + + '@push.rocks/smartmanifest@2.0.2': + resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} + + '@push.rocks/smartmarkdown@3.0.3': + resolution: {integrity: sha512-9KhKZxDQKPk4P/2CYdVqJa5dpGfTA8w1cxqoVZL3e8RPA7EGxbdYEqMp0n2d9mth0btk/m0KHHV+G09LfCVeBw==} + + '@push.rocks/smartmatch@2.0.0': + resolution: {integrity: sha512-MBzP++1yNIBeox71X6VxpIgZ8m4bXnJpZJ4nWVH6IWpmO38MXTu4X0QF8tQnyT4LFcwvc9iiWaD15cstHa7Mmw==} + + '@push.rocks/smartmime@1.0.6': + resolution: {integrity: sha512-PHd+I4UcsnOATNg8wjDsSAmmJ4CwQFrQCNzd0HSJMs4ZpiK3Ya91almd6GLpDPU370U4HFh4FaPF4eEAI6vkJQ==} + + '@push.rocks/smartmime@2.0.4': + resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} + + '@push.rocks/smartmongo@2.0.12': + resolution: {integrity: sha512-NglYiO14BikxnlvW6JF18FtopBtaWQEGAtPxHmmSCbyhU8Mi0aEFO7VgCasE9Kguba/wcR597qhcDEdcpBg1eQ==} + + '@push.rocks/smartnetwork@4.1.2': + resolution: {integrity: sha512-TjucG72ooHgzAUpNu2LAv4iFoettmZq2aEWhhzIa7AKcOvt4yxsk3Vl73guhKRohTfhdRauPcH5OHISLUHJbYA==} + + '@push.rocks/smartnpm@2.0.4': + resolution: {integrity: sha512-ljRPqnUsXzL5qnuAEt5POy0NnfKs7eYPuuJPJjYiK9VUdP/CyF4h14qTB4H816vNEuF7VU/ASRtz0qDlXmrztg==} + + '@push.rocks/smartntml@2.0.8': + resolution: {integrity: sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==} + + '@push.rocks/smartobject@1.0.12': + resolution: {integrity: sha512-xSMiqXiZXXUOixT3QIPsOUKOWjL3YA/1h9/YTiCzqs5C0D3tyfTbojnfcp6YbKZoBzans2I5LghaDHsGid2DKQ==} + + '@push.rocks/smartopen@2.0.0': + resolution: {integrity: sha512-eVT0GhtQ2drb95j/kktYst/Toh1zCwCqjTJFYtaYFUnnBnBUajPtBZDFnPQo01DN8JxoeCTo8jggq+PCvzcfww==} + + '@push.rocks/smartpath@5.1.0': + resolution: {integrity: sha512-pJ4UGATHV/C6Dw5DU0D3MJaPMASlKAgeS+Hl9dkhD2ceYArn86Ky3Z/g7LNj40Oz6cUe77/AP1chztmJZISrpw==} + + '@push.rocks/smartpath@6.0.0': + resolution: {integrity: sha512-r94u1MbBaIOSy+517PZp2P7SuZPSe9LkwJ8l3dXQKHeIOri/zDxk/RQPiFM+j4N9301ztkRyhvRj7xgUDroOsg==} + + '@push.rocks/smartpdf@3.3.0': + resolution: {integrity: sha512-k4mBZAIl/TVBHDYQXaBZAgC8DdmHXsIZ3hRrLY3ysLr143YJ1VkwqQ2poqWh3A2SZQDrVfpKRYliUtjFRFrYVw==} + + '@push.rocks/smartping@1.0.8': + resolution: {integrity: sha512-Fvx1Db6hSsDOI6pdiCuS9GjtOX8ugx865YQrPg5vK2iw6Qj/srwyXcWLFYt+19WVKtvtWDJIAKbW+q3bXFsCeA==} + + '@push.rocks/smartpromise@4.2.3': + resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==} + + '@push.rocks/smartpuppeteer@2.0.5': + resolution: {integrity: sha512-yK/qSeWVHIGWRp3c8S5tfdGP6WCKllZC4DR8d8CQlEjszOSBmHtlTdyyqOMBZ/BA4kd+eU5f3A1r4K2tGYty1g==} + + '@push.rocks/smartrequest@2.1.0': + resolution: {integrity: sha512-3eHLTRInHA+u+W98TqJwgTES7rRimBAsJC4JxVNQC3UUezmblAhM5/TIQsEBQTsbjAY8SeQKy6NHzW6iTiaD8w==} + + '@push.rocks/smartrequest@4.2.1': + resolution: {integrity: sha512-33sxhXMOwDx2tv98LlyxDxI/UTjw16BOSWbnqrdUdNby/sSP3ahW3NF4JMOU5xKNQUz7TjLgREj9dPuumEgQ/g==} + + '@push.rocks/smartrouter@1.3.3': + resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} + + '@push.rocks/smartrx@3.0.10': + resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} + + '@push.rocks/smarts3@2.2.5': + resolution: {integrity: sha512-OZjD0jBCUTJCLnwraxBcyZ3he5buXf2OEM1zipiTBChA2EcKUZWKk/a6KR5WT+NlFCIIuB23UG+U+cxsIWM91Q==} + + '@push.rocks/smartshell@3.2.3': + resolution: {integrity: sha512-BWA/DH1H9lG7Er23d4uYgirfYaya5dX4g/WpWm2la7mOzuL9o2FnPIhel52DQUKIh7ty3Ql305ApV8YaAb4+/w==} + + '@push.rocks/smartsitemap@2.0.3': + resolution: {integrity: sha512-jIcms8V1b2mt3dS4PKNlLR1DRC8pCDWMRVbnyM/2+snZOJZonQRlQzAyX8No0EfLbfdrfnxv2IjPX13X29Re6g==} + + '@push.rocks/smartsocket@2.1.0': + resolution: {integrity: sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==} + + '@push.rocks/smartspawn@3.0.3': + resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} + + '@push.rocks/smartstate@2.0.25': + resolution: {integrity: sha512-gWmbDCx5esezHDQnD2nOClxeTiWtvU1wEdP0XbheCcXzaGEv0H8apRjQBksRZJd9FC3ezrJU00GLh0eH9rPyMQ==} + + '@push.rocks/smartstream@2.0.8': + resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} + + '@push.rocks/smartstream@3.2.5': + resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} + + '@push.rocks/smartstring@4.0.15': + resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==} + + '@push.rocks/smarttime@4.1.1': + resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==} + + '@push.rocks/smartunique@3.0.9': + resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} + + '@push.rocks/smarturl@3.1.0': + resolution: {integrity: sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==} + + '@push.rocks/smartversion@3.0.5': + resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} + + '@push.rocks/smartxml@1.1.1': + resolution: {integrity: sha512-1toSmLE1EGK8oENh09XjV588+IdzUB3x1PCaxKjSyIsAt54bUQj3kH/yzLODF+19p07OE0KM5U1oqWpjOcFCzA==} + + '@push.rocks/smartyaml@2.0.5': + resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} + + '@push.rocks/taskbuffer@3.1.7': + resolution: {integrity: sha512-QktGVJPucqQmW/QNGnscf4FAigT1H7JWKFGFdRuDEaOHKFh9qN+PXG3QY7DtZ4jfXdGLxPN4yAufDuPSAJYFnw==} + + '@push.rocks/webrequest@3.0.37': + resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} + + '@push.rocks/websetup@3.0.19': + resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} + + '@push.rocks/webstore@2.0.20': + resolution: {integrity: sha512-Z3L4OHGcw/Gs9aXpMUwebEPTh0nK/C7R6YwPfCLcGVu9yd/ZShaQ8QZEYE243Cu9J1Mn+CEtz4jpPLnHiizHQA==} + + '@push.rocks/webstream@1.0.10': + resolution: {integrity: sha512-45CcR0I4/9v0qSjLvz2dYTGMkR0YP3x66ItpStdad5hidJm86t1lfHF06d0oiEvJTpvQkeyIX/8YKAumf21d/Q==} + + '@pushrocks/isounique@1.0.5': + resolution: {integrity: sha512-XYeoKGkmIdsWX64NlPA1fuA41n/1bQ7LdYXytlU/QqYeW7ojgA0ARRhBSh/2phL6o0Jpw6K/7gJ8jc7ab/Tc+w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/isounique + + '@pushrocks/lik@5.0.7': + resolution: {integrity: sha512-fIxcrafl127+yErfedIurafCbiY2VwuuMlbNLjKrMKnFswol4y/anjXVRZ4euWUBck0KOfnBB0VuutcmlfYUqA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/lik + + '@pushrocks/lik@6.0.2': + resolution: {integrity: sha512-jO85PCb4gULfZbLoVpXb9HIR9Wgoigq6Zjcp1JqHOgM4KB38IZrU+HPWPWWMErAOOQmmYvVCdl4gkrkO/Rzn4w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/lik + + '@pushrocks/smartdelay@2.0.13': + resolution: {integrity: sha512-s6Wh0BHWMfZ5VYONQwpxOYX1JeC9RKA0O9TxEzfZ6FCw2oNQb2QUPCixT9rsceKwva4+atKRw/RfU+Z7aJDmsA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartdelay + + '@pushrocks/smartdelay@3.0.1': + resolution: {integrity: sha512-I+i/QhC6kLsXsWyW19UgD1vH2r1YWVxK19VMxt2CEuvxMyC6tuCd0vqud9vv5JxaxsJwxWlOsrURkgL4tXeILQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartdelay + + '@pushrocks/smartenv@5.0.5': + resolution: {integrity: sha512-VWON1OJ4qV2/9hzJbgRquRekaO9am3b8W82tgCwgO6LBg23ea2tanfd+gESVMbRFduxHVoFLvlhSBcDGM5zsLA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartenv + + '@pushrocks/smarterror@2.0.1': + resolution: {integrity: sha512-3OrF5me+/sy5VgwR/tfCqs7qhb0Ywzgn8tTThRUZnCGas0aindISzMiW7cIro3RlFykmtPmdTztC9Ostu2ioeA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarterror + + '@pushrocks/smartfile-interfaces@1.0.7': + resolution: {integrity: sha512-C/v9Scbx1J+ByMk3YBZrlLRYXdObty/Uz/h6kSZqsO8ghYuT9l7OVpEcyduiSVPakaMi6YnzfME3Nfs3oLj//Q==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile-interfaces + + '@pushrocks/smartfile@9.0.6': + resolution: {integrity: sha512-mXFrnHpM3Eq0MLokGP6DDRTk+v/HDlQwnNq4HFuCqs8YW6uTU/FoRJDnrCAf+spSzkDm0m1ajz/4rke8Dk9l6A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile + + '@pushrocks/smarthash@2.1.10': + resolution: {integrity: sha512-f6lnQPa2lmkSQOMvWwZ6R6wcNvbDWuXH5OhQNvwmog8af3hBEmOEXxjauj6XU+l7ICJ6qxr3wsvpt4y7Ogyc9A==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarthash + + '@pushrocks/smarthash@3.0.2': + resolution: {integrity: sha512-jXW4f8k6iqOQRvkCmXMID1C+qXyNvUMKm7apPETxnO+L172VlzxP1dml0Ey1+vjfpU2luKCteJWX7W95sOdLDg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarthash + + '@pushrocks/smartjson@4.0.6': + resolution: {integrity: sha512-lykr068RSDHs0+EXCvIDVxjKnDtRQ2M7EXOo5jVrUU6/OEdfRl9ErM1K/oPafiEi47/PtTrwLlp1KdSgqkRjmg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartjson + + '@pushrocks/smartjson@5.0.6': + resolution: {integrity: sha512-9OJbnRgLTaCRQz+pqu5tB3ZCqRs5Zh0hnBe7t7URE+TgwIZ8aiELUIbWRkgn4mSGVzHyL6pqTyIowP6AjUCG3w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartjson + + '@pushrocks/smartmatch@1.0.7': + resolution: {integrity: sha512-D+lK5HIKO4Kj1Jm/ycKvy1VzDJ3V6ucHqmf5DMBFdm18BrMj2Zb6M7wN8HUKtkfHvOI7ig85JMuANSEyO7kAPg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmatch + + '@pushrocks/smartmatch@2.0.0': + resolution: {integrity: sha512-PLvBNVeuY9BERNLq3PFDkhnHHc0RpilEGHd4aUI5XRFlZF++LETdLxPbxw+DHbvHlkUf/nep09f7rrL9Tqub1Q==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmatch + + '@pushrocks/smartmime@1.0.5': + resolution: {integrity: sha512-FCRg5p5NFTyZnPsvy2sbheVGz67Zeno7VoZARrcP0O+hFtVPnQKnJ73ze11G+MKZ3dVCmYCh1Li+73R6Lx8XJA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartmime + + '@pushrocks/smartpath@4.0.3': + resolution: {integrity: sha512-KWz4DWOrB0sPfk6L4i+CPOo+UK5HXNaLI7ZAaqJe1nEWoDrpyeds1dNDaqVAmSgX4riLGxVpslKH5MnABCPsPg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpath + + '@pushrocks/smartpath@5.0.5': + resolution: {integrity: sha512-t2lXXGMpKnPlwubIcYGD6cGi2CUJxJ3t2yftVt8tHfjX68jELA5sJhFMtyD3AeFZVxePFZOCiHwWEbWkSDNnmw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpath + + '@pushrocks/smartpromise@3.1.10': + resolution: {integrity: sha512-VeTurbZ1+ZMxBDJk1Y1LV8SN9xLI+oDXKVeCFw41FAGEKOUEqordqFpi6t+7Vhe/TXUZzCVpZ5bXxAxrGf8yTQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartpromise@4.0.2': + resolution: {integrity: sha512-bqorOaGXPOuiOSV81luTKrTghg4O4NBRD0zyv7TIqmrMGf4a0uoozaUMp1X8vQdZW+y0gTzUJP9wkzAE6Cci0g==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartrequest@1.1.56': + resolution: {integrity: sha512-iF6bApmTgd3ZvRK8OHa77UFg8nVZxS1Y6iL8VfHpWOXdSlQZcXo/WbvwxYtu0+wkERAfFtCTGrrLAPGsFm9lhw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrequest + + '@pushrocks/smartrx@2.0.27': + resolution: {integrity: sha512-aFRpGxDZgHH1mpmkRBTFwuIVqFiDxk22n2vX2gW4hntV0nJGlt9M9dixMFFXGUjabwX9hHW7y60QPJm2rKaypA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrx + + '@pushrocks/smartrx@3.0.2': + resolution: {integrity: sha512-uh2ByyE86Q4f1/rpktR29vAMzHgAvAhFZqbvP6Sme9FK57OZG0mqZxDvJMVNP5O+QOn0Chrbl3BZCuRsFF3NUA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartrx + + '@pushrocks/smartstring@4.0.7': + resolution: {integrity: sha512-TxHSar7Cj29E+GOcIj4DeZKWCNVzHKdqnrBRqcBqLqmeYZvzFosLXpFKoaCJDq7MSxuPoCvu5woSdp9YmPXyog==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartstring + + '@pushrocks/smarttime@3.0.50': + resolution: {integrity: sha512-44NgDuNukCQIlPJFNORcDugp36Yj6HT6eZEWtn4M4HKlTFCQ8De+ztwGg+gRceucJ202zqLRKrXoh8dVdS3BaQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + + '@pushrocks/smarttime@4.0.1': + resolution: {integrity: sha512-5SpUqD3X/2IZCTezCpk48Ss7cDc9QOuQAkeAYnJrRjDL4UCLakA3lBeHXRD/rsIB7S1smtXlayQ/vizfYzdbfw==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + + '@pushrocks/smarturl@2.0.1': + resolution: {integrity: sha512-6KGnf2vHR7hW4mQpAD7gkDVL3QVML3jb/No/Uw+qCqvs0TaQr60Yjm+CXoLxJNCKwmrL+I1yx8mhAHBHfYJiJA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarturl + + '@rolldown/binding-android-arm64@1.0.0-beta.31': + resolution: {integrity: sha512-0mFtKwOG7smn0HkvQ6h8j0m/ohkR7Fp5eMTJ2Pns/HSbePHuDpxMaQ4TjZ6arlVXxpeWZlAHeT5BeNsOA3iWTg==} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': + resolution: {integrity: sha512-BHfHJ8Nb5G7ZKJl6pimJacupONT4F7w6gmQHw41rouAnJF51ORDwGefWeb6OMLzGmJwzxlIVPERfnJf1EsMM7A==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.31': + resolution: {integrity: sha512-4MiuRtExC08jHbSU/diIL+IuQP+3Ck1FbWAplK+ysQJ7fxT3DMxy5FmnIGfmhaqow8oTjb2GEwZJKgTRjZL1Vw==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': + resolution: {integrity: sha512-nffC1u7ccm12qlAea8ExY3AvqlaHy/o/3L4p5Es8JFJ3zJSs6e3DyuxGZZVdl9EVwsLxPPTvioIl4tEm2afwyw==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': + resolution: {integrity: sha512-LHmAaB3rB1GOJuHscKcL2Ts/LKLcb3YWTh2uQ/876rg/J9WE9kQ0kZ+3lRSYbth/YL8ln54j4JZmHpqQY3xptQ==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': + resolution: {integrity: sha512-oTDZVfqIAjLB2I1yTiLyyhfPPO6dky33sTblxTCpe+ZT55WizN3KDoBKJ4yXG8shI6I4bRShVu29Xg0yAjyQYw==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': + resolution: {integrity: sha512-duJ3IkEBj9Xe9NYW1n8Y3483VXHGi8zQ0ZsLbK8464EJUXLF7CXM8Ry+jkkUw+ZvA+Zu1E/+C6p2Y6T9el0C9g==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': + resolution: {integrity: sha512-qdbmU5QSZ0uoLZBYMxiHsMQmizqtzFGTVPU5oyU1n0jU0Mo+mkSzqZuL8VBnjHOHzhVxZsoAGH9JjiRzCnoGVA==} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': + resolution: {integrity: sha512-H7+r34TSV8udB2gAsebFM/YuEeNCkPGEAGJ1JE7SgI9XML6FflqcdKfrRSneQFsPaom/gCEc1g0WW5MZ0O3blw==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': + resolution: {integrity: sha512-zRm2YmzFVqbsmUsyyZnHfJrOlQUcWS/FJ5ZWL8Q1kZh5PnLBrTVZNpakIWwAxpN5gNEi9MmFd5YHocVJp8ps1Q==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': + resolution: {integrity: sha512-fM1eUIuHLsNJXRlWOuIIex1oBJ89I0skFWo5r/D3KSJ5gD9MBd3g4Hp+v1JGohvyFE+7ylnwRxSUyMEeYpA69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-4nftR9V2KHH3zjBwf6leuZZJQZ7v0d70ogjHIqB3SDsbDLvVEZiGSsSn2X6blSZRZeJSFzK0pp4kZ67zdZXwSw==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-0TQcKu9xZVHYALit+WJsSuADGlTFfOXhnZoIHWWQhTk3OgbwwbYcSoZUXjRdFmR6Wswn4csHtJGN1oYKeQ6/2g==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-3zMICWwpZh1jrkkKDYIUCx/2wY3PXLICAS0AnbeLlhzfWPhCcpNK9eKhiTlLAZyTp+3kyipoi/ZSVIh+WDnBpQ==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.31': + resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} + + '@rspack/binding-darwin-arm64@1.4.11': + resolution: {integrity: sha512-PrmBVhR8MC269jo6uQ+BMy1uwIDx0HAJYLQRQur8gXiehWabUBCRg/d4U9KR7rLzdaSScRyc5JWXR52T7/4MfA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.4.11': + resolution: {integrity: sha512-YIV8Wzy+JY0SoSsVtN4wxFXOjzxxVPnVXNswrrfqVUTPr9jqGOFYUWCGpbt8lcCgfuBFm6zN8HpOsKm1xUNsVA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.4.11': + resolution: {integrity: sha512-ms6uwECUIcu+6e82C5HJhRMHnfsI+l33v7XQezntzRPN0+sG3EpikEoT7SGbgt4vDwaWLR7wS20suN4qd5r3GA==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.4.11': + resolution: {integrity: sha512-9evq0DOdxMN/H8VM8ZmyY9NSuBgILNVV6ydBfVPMHPx4r1E7JZGpWeKDegZcS5Erw3sS9kVSIxyX78L5PDzzKw==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.4.11': + resolution: {integrity: sha512-bHYFLxPPYBOSaHdQbEoCYGMQ1gOrEWj7Mro/DLfSHZi1a0okcQ2Q1y0i1DczReim3ZhLGNrK7k1IpFXCRbAobQ==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.4.11': + resolution: {integrity: sha512-wrm4E7q2k4+cwT6Uhp6hIQ3eUe/YoaUttj6j5TqHYZX6YeLrNPtD9+ne6lQQ17BV8wmm6NZsmoFIJ5xIptpRhQ==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.4.11': + resolution: {integrity: sha512-hiYxHZjaZ17wQtXyLCK0IdtOvMWreGVTiGsaHCxyeT+SldDG+r16bXNjmlqfZsjlfl1mkAqKz1dg+mMX28OTqw==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.4.11': + resolution: {integrity: sha512-+HF/mnjmTr8PC1dccRt1bkrD2tPDGeqvXC1BBLYd/Klq1VbtIcnrhfmvQM6KaXbiLcY9VWKzcZPOTmnyZ8TaHQ==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.4.11': + resolution: {integrity: sha512-EU2fQGwrRfwFd/tcOInlD0jy6gNQE4Q3Ayj0Is+cX77sbhPPyyOz0kZDEaQ4qaN2VU8w4Hu/rrD7c0GAKLFvCw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.4.11': + resolution: {integrity: sha512-1Nc5ZzWqfvE+iJc47qtHFzYYnHsC3awavXrCo74GdGip1vxtksM3G30BlvAQHHVtEmULotWqPbjZpflw/Xk9Ag==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.4.11': + resolution: {integrity: sha512-maGl/zRwnl0QVwkBCkgjn5PH20L9HdlRIdkYhEsfTepy5x2QZ0ti/0T49djjTJQrqb+S1i6wWQymMMMMMsxx6Q==} + + '@rspack/core@1.4.11': + resolution: {integrity: sha512-JtKnL6p7Kc/YgWQJF3Woo4OccbgKGyT/4187W4dyex8BMkdQcbqCNIdi6dFk02hwQzxpOOxRSBI4hlGRbz7oYQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@smithy/abort-controller@4.0.5': + resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.1.5': + resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.8.0': + resolution: {integrity: sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.0.7': + resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.0.5': + resolution: {integrity: sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.0.5': + resolution: {integrity: sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.1.3': + resolution: {integrity: sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.0.5': + resolution: {integrity: sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.0.5': + resolution: {integrity: sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.1.1': + resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.0.5': + resolution: {integrity: sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.0.5': + resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.0.5': + resolution: {integrity: sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.0.5': + resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.0.5': + resolution: {integrity: sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.0.5': + resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.1.18': + resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.1.19': + resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.0.9': + resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.0.5': + resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.1.4': + resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.1.1': + resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.0.5': + resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.1.3': + resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.0.5': + resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.0.5': + resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.0.7': + resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.0.5': + resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.1.3': + resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.4.10': + resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.3.2': + resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.0.5': + resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.0.26': + resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.0.26': + resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.0.7': + resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.0.5': + resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.0.7': + resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.2.4': + resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.0.7': + resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} + engines: {node: '>=18.0.0'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tempfix/idb@8.0.3': + resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@tsclass/tsclass@3.0.48': + resolution: {integrity: sha512-hC65UvDlp9qvsl6OcIZXz0JNiWZ0gyzsTzbXpg215sGxopgbkOLCr6E0s4qCTnweYm95gt2AdY95uP7M7kExaQ==} + + '@tsclass/tsclass@4.4.4': + resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} + + '@tsclass/tsclass@8.2.1': + resolution: {integrity: sha512-bRDCfJTipsTcK6eEokWdsOR1mGCQFeM7zTg6PRHzbxTWQcWQD9AhEr2q3CrPcmAbvIS7fvkO6/pU/mPm1MZxhQ==} + + '@tsclass/tsclass@9.2.0': + resolution: {integrity: sha512-A6ULEkQfYgOnCKQVQRt26O7PRzFo4PE2EoD25RAtnuFuVrNwGynYC20Vee2c8KAOyI7nQ/LaREki9KAX4AHOHQ==} + + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/buffer-json@2.0.3': + resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} + + '@types/clean-css@4.2.11': + resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/default-gateway@7.2.2': + resolution: {integrity: sha512-35C93fYQlnLKLASkMPoxRvok4fENwB3By9clRLd2I/08n/XRl0pCdf7EB17K5oMMwZu8NBYA8i66jH5r/LYBKA==} + + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + + '@types/fast-json-stable-stringify@2.1.2': + resolution: {integrity: sha512-vsxcbfLDdjytnCnHXtinE40Xl46Wr7l/VGRGt7ewJwCPMKEHOdEsTxXX8xwgoR7cbc+6dE8SB4jlMrOV2zAg7g==} + deprecated: This is a stub types definition. fast-json-stable-stringify provides its own type definitions, so you do not need this installed. + + '@types/from2@2.3.5': + resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/gunzip-maybe@1.4.2': + resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-minifier@4.0.5': + resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/js-yaml@3.12.10': + resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mime-types@2.1.4': + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimatch@6.0.0': + resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} + deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-forge@1.3.13': + resolution: {integrity: sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==} + + '@types/node@24.2.1': + resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + + '@types/ping@0.4.4': + resolution: {integrity: sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/randomatic@3.1.5': + resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/relateurl@0.2.33': + resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} + + '@types/s3rver@3.7.4': + resolution: {integrity: sha512-CMCmdNszxS2FsIznWvBMVCl6fpvr5ueaFCaY0iSoH7Ud5maGcLghukpDvsXBnIcp92cv2HeVnVqI1p8yPcab9Q==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/symbol-tree@3.2.5': + resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} + + '@types/tar-stream@2.2.3': + resolution: {integrity: sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==} + + '@types/through2@2.0.41': + resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/turndown@5.0.5': + resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} + + '@types/uglify-js@3.17.5': + resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@types/which@3.0.4': + resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-256-colors@1.1.0: + resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.6.1: + resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + + bare-fs@4.1.6: + resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + broadcast-channel@7.1.0: + resolution: {integrity: sha512-InJljddsYWbEL8LBnopnCg+qMQp9KcowvYWOt4YWrjD5HmxzDYKdVbDS1w/ji5rFZdRD58V5UxJPtBdpEbEJYw==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=} + + bson@4.7.2: + resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} + engines: {node: '>=6.9.0'} + + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-json@2.0.0: + resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + busboy@0.3.1: + resolution: {integrity: sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==} + engines: {node: '>=4.5.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-bidi@7.2.0: + resolution: {integrity: sha512-gREyhyBstermK+0RbcJLbFhcQctg92AGgDe/h/taMJEOLRdtSswBAO9KmvltFSQWgM2LrwWu5SIuEUbdm3JsyQ==} + peerDependencies: + devtools-protocol: '*' + + clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + + clean-stack@1.3.0: + resolution: {integrity: sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-regexp@3.0.0: + resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + cookie-signature@1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + croner@4.4.1: + resolution: {integrity: sha512-aqVeeIPCf5/NZFlz4mN4MLEOs9xf4ODCmHQDs+577JFj8mK3RkKJz77h7+Rn94AijUqKdFNOUHM+v88d8p02UQ==} + + croner@5.7.0: + resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==} + engines: {node: '>=6.0'} + + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@5.0.0: + resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} + engines: {node: '>=14.16'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-equal@1.0.1: + resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + + depd@1.1.2: + resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + devtools-protocol@0.0.1475386: + resolution: {integrity: sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==} + + dicer@0.3.0: + resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} + engines: {node: '>=4.5.0'} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dns-socket@4.2.2: + resolution: {integrity: sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==} + engines: {node: '>=6'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + express-force-ssl@0.3.2: + resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} + engines: {node: '>=0.2.2'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fake-indexeddb@5.0.2: + resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} + engines: {node: '>=18'} + + fake-indexeddb@6.1.0: + resolution: {integrity: sha512-gOzajWIhEug/CQHUIxigKT9Zilh5/I6WvUBez6/UdUtT/YVEHM9r572Os8wfvhp7TkmgBtRNdqSM7YoCXWMzZg==} + engines: {node: '>=18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-xml-parser@3.21.1: + resolution: {integrity: sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==} + hasBin: true + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-type@19.6.0: + resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} + engines: {node: '>=18'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + from2@2.3.0: + resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function-timeout@0.1.1: + resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} + engines: {node: '>=14.16'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} + + has-flag@3.0.0: + resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + engines: {node: '>=4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + humanize-ms@1.2.1: + resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + + humanize-number@0.0.2: + resolution: {integrity: sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inflight@1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ip-regex@5.0.0: + resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-deflate@1.0.0: + resolution: {integrity: sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-gzip@1.0.0: + resolution: {integrity: sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=} + engines: {node: '>=0.10.0'} + + is-ip@5.0.1: + resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} + engines: {node: '>=14.16'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-observable@2.1.0: + resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + + isexe@2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isopen@1.3.0: + resolution: {integrity: sha512-AN6Q9J0UlqHFl1fN/2xJCHCBLCBCFDjZhpGBO1gh3wzgRPsFSFBUL36I2Lbfd9qkuoj58axmE7j83iejTQsk8Q==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha1-sBMHyym2GKHtJux56RH4A8TaAEA=} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + jsonfile@4.0.0: + resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + + koa@2.16.2: + resolution: {integrity: sha512-+CCssgnrWKx9aI3OeZwroa/ckG4JICxvIFnSiOUyl2Uv+UTI+xIw0FfFrWS7cQFpoePpr9o8csss7KzsTzNL8Q==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + lenis@1.3.8: + resolution: {integrity: sha512-LVeoMs6jZE1eu3gPsexndm+vk01pLFeq7P00vjIpI17saD52IYu8nPA4gX43elz8tp/TTCXcX6Em1MEjDl9NTw==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lit-element@4.2.1: + resolution: {integrity: sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==} + + lit-html@3.3.1: + resolution: {integrity: sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==} + + lit@3.3.1: + resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash._baseassign@3.2.0: + resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} + + lodash._basecopy@3.0.1: + resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} + + lodash._bindcallback@3.0.1: + resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} + + lodash._createassigner@3.1.1: + resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} + + lodash._getnative@3.9.1: + resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} + + lodash._isiterateecall@3.0.9: + resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} + + lodash.assign@3.2.0: + resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} + + lodash.isarray@3.0.4: + resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} + + lodash.keys@3.1.2: + resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} + + lodash.restparam@3.6.1: + resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lower-case@1.1.4: + resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-error-cause@2.3.0: + resolution: {integrity: sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + methods@1.1.2: + resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@4.0.7: + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} + engines: {node: '>=16'} + hasBin: true + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb-memory-server-core@10.2.0: + resolution: {integrity: sha512-IsgWlsXdZxbMNoa3hqazMQ/QeMazEztMBr/fK6OrHefJLlZtCEtIIYoAKJDYDQjcwId0CRkW3WRy05WEuyClDg==} + engines: {node: '>=16.20.1'} + + mongodb-memory-server@10.2.0: + resolution: {integrity: sha512-FG4OVoXjBHC7f8Mdyj1TZ6JyTtMex+qniEzoY1Rsuo/FvHSOHYzGYVbuElamjHuam+HLxWTWEpc43fqke8WNGw==} + engines: {node: '>=16.20.1'} + + mongodb@4.17.2: + resolution: {integrity: sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==} + engines: {node: '>=12.9.0'} + + mongodb@6.18.0: + resolution: {integrity: sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + ms@2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + normalize-newline@4.1.0: + resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} + engines: {node: '>=12'} + + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + engines: {node: '>=14.16'} + + object-assign@4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + oblivious-set@1.4.0: + resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} + engines: {node: '>=16'} + + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + only@0.0.2: + resolution: {integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-finally@1.0.0: + resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pako@0.2.9: + resolution: {integrity: sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@2.1.1: + resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + passthrough-counter@1.0.0: + resolution: {integrity: sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + pdf-lib@1.17.1: + resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} + + pdf2json@3.2.0: + resolution: {integrity: sha512-5RJYU5zWFXTQ5iRXAo75vlhK5ybZOyqEyg/szw2VtHc6ZOPcC7ruX4nnXk1OqqlY56Z7XT+WCFhV+/XPj4QwtQ==} + engines: {node: '>=20.18.0'} + hasBin: true + bundledDependencies: [] + + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} + engines: {node: '>=14.16'} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + pend@1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + ping@0.4.4: + resolution: {integrity: sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==} + engines: {node: '>=4.0.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proto-list@1.2.4: + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + public-ip@7.0.1: + resolution: {integrity: sha512-DdNcqcIbI0wEeCBcqX+bmZpUCvrDMJHXE553zgyG1MZ8S1a/iCCxmK9iTjjql+SpHSv4cZkmRv5/zGYW93AlCw==} + engines: {node: '>=18'} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@24.16.0: + resolution: {integrity: sha512-tZ0tJiOYaDGTRzzr2giDpf8O/55JsoqkrafS1Xu4H6S8oP4eeL6RbZzY9OzjShSf5EQvx/zAc55QKpDqzXos/Q==} + engines: {node: '>=18'} + + puppeteer@24.16.0: + resolution: {integrity: sha512-5qxFGOpdAzYexoPwKPEF4L/IYKYOFE1MxWsqcp7K33HySM8N8S/yZwSQCaV0rzmJsTLX5LxU4zt65+ceNiVDgQ==} + engines: {node: '>=18'} + hasBin: true + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + relateurl@0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-html@16.0.1: + resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + replace-buffer@1.2.1: + resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rolldown@1.0.0-beta.31: + resolution: {integrity: sha512-M2Q+RfG0FMJeSW3RSFTbvtjGVTcQpTQvN247D0EMSsPkpZFoinopR9oAnQiwgogQyzDuvKNnbyCbQQlmNAzSoQ==} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + rss-parser@3.13.0: + resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + s3rver@3.7.1: + resolution: {integrity: sha512-H9KIX6n8NqcfoE4ziFNbQASBQfjcNJgb+3wbT9L5iotEqfOncFO1c38cfJSFSo7xXTu1zM9HA6t2u9xKNlYRaA==} + engines: {node: '>=8.3.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.6: + resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + sprintf-js@1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stack-trace@0.0.10: + resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} + + statuses@1.5.0: + resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@0.1.2: + resolution: {integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=} + engines: {node: '>=0.8.0'} + + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} + engines: {node: '>=0.10.0'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + strtok3@9.1.1: + resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} + engines: {node: '>=16'} + + super-regex@0.2.0: + resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} + engines: {node: '>=14.16'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + sweet-scroll@4.0.0: + resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + systeminformation@5.27.7: + resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + + tar-fs@3.1.0: + resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.0.4: + resolution: {integrity: sha512-MD9MjpVNhVyH4fyd5rKphjvt/1qj+PtQUz65aFqAZA6XniWAuSFRjLk3e2VALEFlh9OwBpXUN7rfeqSnT/Fmkw==} + engines: {node: '>=14.16'} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + turndown-plugin-gfm@1.0.2: + resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} + + turndown@7.2.0: + resolution: {integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unload@2.4.1: + resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + + unpipe@1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + + upper-case@1.1.3: + resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + + utils-merge@1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + + yauzl@3.2.0: + resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} + engines: {node: '>=12'} + + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@api.global/typedrequest-interfaces@2.0.2': {} + + '@api.global/typedrequest-interfaces@3.0.19': {} + + '@api.global/typedrequest@3.1.10': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbuffer': 3.0.5 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstream': 1.0.10 + + '@api.global/typedserver@3.0.74': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 3.0.1 + '@cloudflare/workers-types': 4.20250809.0 + '@design.estate/dees-comms': 1.0.27 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartchok': 1.1.1 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartfeed': 1.0.11 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog-destination-devtools': 1.0.12 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartmanifest': 2.0.2 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartntml': 2.0.8 + '@push.rocks/smartopen': 2.0.0 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartsitemap': 2.0.3 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/taskbuffer': 3.1.7 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstore': 2.0.20 + '@tsclass/tsclass': 8.2.1 + '@types/express': 5.0.3 + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.2 + express-force-ssl: 0.3.2 + lit: 3.3.1 + transitivePeerDependencies: + - '@nuxt/kit' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@api.global/typedsocket@3.0.1': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartsocket': 2.1.0 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarturl': 3.1.0 + transitivePeerDependencies: + - '@nuxt/kit' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-locate-window': 3.804.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-locate-window': 3.804.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-cognito-identity@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-node': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/client-s3@3.864.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-node': 3.864.0 + '@aws-sdk/middleware-bucket-endpoint': 3.862.0 + '@aws-sdk/middleware-expect-continue': 3.862.0 + '@aws-sdk/middleware-flexible-checksums': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-location-constraint': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-sdk-s3': 3.864.0 + '@aws-sdk/middleware-ssec': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/signature-v4-multi-region': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@aws-sdk/xml-builder': 3.862.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/eventstream-serde-browser': 4.0.5 + '@smithy/eventstream-serde-config-resolver': 4.1.3 + '@smithy/eventstream-serde-node': 4.0.5 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-blob-browser': 4.0.5 + '@smithy/hash-node': 4.0.5 + '@smithy/hash-stream-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/md5-js': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.7 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.864.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@aws-sdk/xml-builder': 3.862.0 + '@smithy/core': 3.8.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/signature-v4': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-utf8': 4.0.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.864.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-env@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/node-http-handler': 4.1.1 + '@smithy/property-provider': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-stream': 4.2.4 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-env': 3.864.0 + '@aws-sdk/credential-provider-http': 3.864.0 + '@aws-sdk/credential-provider-process': 3.864.0 + '@aws-sdk/credential-provider-sso': 3.864.0 + '@aws-sdk/credential-provider-web-identity': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.864.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.864.0 + '@aws-sdk/credential-provider-http': 3.864.0 + '@aws-sdk/credential-provider-ini': 3.864.0 + '@aws-sdk/credential-provider-process': 3.864.0 + '@aws-sdk/credential-provider-sso': 3.864.0 + '@aws-sdk/credential-provider-web-identity': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.864.0': + dependencies: + '@aws-sdk/client-sso': 3.864.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/token-providers': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-providers@3.864.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.864.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-cognito-identity': 3.864.0 + '@aws-sdk/credential-provider-env': 3.864.0 + '@aws-sdk/credential-provider-http': 3.864.0 + '@aws-sdk/credential-provider-ini': 3.864.0 + '@aws-sdk/credential-provider-node': 3.864.0 + '@aws-sdk/credential-provider-process': 3.864.0 + '@aws-sdk/credential-provider-sso': 3.864.0 + '@aws-sdk/credential-provider-web-identity': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/middleware-bucket-endpoint@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.864.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-arn-parser': 3.804.0 + '@smithy/core': 3.8.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/protocol-http': 5.1.3 + '@smithy/signature-v4': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@smithy/core': 3.8.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.864.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/signature-v4': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.862.0': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.804.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-endpoints': 3.0.7 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.804.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + bowser: 2.11.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.864.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.862.0': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@cloudflare/workers-types@4.20250809.0': {} + + '@colors/colors@1.6.0': {} + + '@configvault.io/interfaces@1.0.17': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@design.estate/dees-comms@1.0.27': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartdelay': 3.0.5 + broadcast-channel: 7.1.0 + + '@design.estate/dees-domtools@2.3.3': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@design.estate/dees-comms': 1.0.27 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmarkdown': 3.0.3 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrouter': 1.3.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstate': 2.0.25 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/websetup': 3.0.19 + '@push.rocks/webstore': 2.0.20 + lenis: 1.3.8 + lit: 3.3.1 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@design.estate/dees-element@2.1.2': + dependencies: + '@design.estate/dees-domtools': 2.3.3 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartrx': 3.0.10 + lit: 3.3.1 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.8': + optional: true + + '@esbuild/android-arm64@0.25.8': + optional: true + + '@esbuild/android-arm@0.25.8': + optional: true + + '@esbuild/android-x64@0.25.8': + optional: true + + '@esbuild/darwin-arm64@0.25.8': + optional: true + + '@esbuild/darwin-x64@0.25.8': + optional: true + + '@esbuild/freebsd-arm64@0.25.8': + optional: true + + '@esbuild/freebsd-x64@0.25.8': + optional: true + + '@esbuild/linux-arm64@0.25.8': + optional: true + + '@esbuild/linux-arm@0.25.8': + optional: true + + '@esbuild/linux-ia32@0.25.8': + optional: true + + '@esbuild/linux-loong64@0.25.8': + optional: true + + '@esbuild/linux-mips64el@0.25.8': + optional: true + + '@esbuild/linux-ppc64@0.25.8': + optional: true + + '@esbuild/linux-riscv64@0.25.8': + optional: true + + '@esbuild/linux-s390x@0.25.8': + optional: true + + '@esbuild/linux-x64@0.25.8': + optional: true + + '@esbuild/netbsd-arm64@0.25.8': + optional: true + + '@esbuild/netbsd-x64@0.25.8': + optional: true + + '@esbuild/openbsd-arm64@0.25.8': + optional: true + + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + + '@esbuild/sunos-x64@0.25.8': + optional: true + + '@esbuild/win32-arm64@0.25.8': + optional: true + + '@esbuild/win32-ia32@0.25.8': + optional: true + + '@esbuild/win32-x64@0.25.8': + optional: true + + '@git.zone/tsbuild@2.6.4': + dependencies: + '@git.zone/tspublish': 1.10.1 + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + typescript: 5.8.3 + transitivePeerDependencies: + - aws-crt + + '@git.zone/tsbundle@2.5.1': + dependencies: + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartspawn': 3.0.3 + '@rspack/core': 1.4.11 + '@types/html-minifier': 4.0.5 + esbuild: 0.25.8 + html-minifier: 4.0.0 + rolldown: 1.0.0-beta.31 + typescript: 5.8.3 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + + '@git.zone/tspublish@1.10.1': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartnpm': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrequest': 4.2.1 + '@push.rocks/smartshell': 3.2.3 + transitivePeerDependencies: + - aws-crt + + '@git.zone/tsrun@1.3.3': + dependencies: + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartshell': 3.2.3 + tsx: 4.20.3 + + '@git.zone/tstest@2.3.2(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6)(typescript@5.8.3)': + dependencies: + '@api.global/typedserver': 3.0.74 + '@git.zone/tsbundle': 2.5.1 + '@git.zone/tsrun': 1.3.3 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/qenv': 6.1.0 + '@push.rocks/smartbrowser': 2.0.8(typescript@5.8.3) + '@push.rocks/smartchok': 1.1.1 + '@push.rocks/smartcrypto': 2.0.4 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartexpect': 2.5.0 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartmongo': 2.0.12(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smarts3': 2.2.5 + '@push.rocks/smartshell': 3.2.3 + '@push.rocks/smarttime': 4.1.1 + '@types/ws': 8.18.1 + figures: 6.1.0 + ws: 8.18.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - '@swc/helpers' + - aws-crt + - bare-buffer + - bufferutil + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - snappy + - socks + - supports-color + - typescript + - utf-8-validate + - vue + + '@happy-dom/global-registrator@15.11.7': + dependencies: + happy-dom: 15.11.7 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@koa/router@9.4.0': + dependencies: + debug: 4.4.1 + http-errors: 1.8.1 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.3.0 + transitivePeerDependencies: + - supports-color + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@lit-labs/ssr-dom-shim@1.4.0': {} + + '@lit/reactive-element@2.1.1': + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + + '@mixmark-io/domino@2.2.0': {} + + '@module-federation/error-codes@0.17.1': {} + + '@module-federation/runtime-core@0.17.1': + dependencies: + '@module-federation/error-codes': 0.17.1 + '@module-federation/sdk': 0.17.1 + + '@module-federation/runtime-tools@0.17.1': + dependencies: + '@module-federation/runtime': 0.17.1 + '@module-federation/webpack-bundler-runtime': 0.17.1 + + '@module-federation/runtime@0.17.1': + dependencies: + '@module-federation/error-codes': 0.17.1 + '@module-federation/runtime-core': 0.17.1 + '@module-federation/sdk': 0.17.1 + + '@module-federation/sdk@0.17.1': {} + + '@module-federation/webpack-bundler-runtime@0.17.1': + dependencies: + '@module-federation/runtime': 0.17.1 + '@module-federation/sdk': 0.17.1 + + '@mongodb-js/saslprep@1.3.0': + dependencies: + sparse-bitfield: 3.0.3 + + '@napi-rs/wasm-runtime@1.0.3': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@oxc-project/runtime@0.80.0': {} + + '@oxc-project/types@0.80.0': {} + + '@pdf-lib/standard-fonts@1.0.0': + dependencies: + pako: 1.0.11 + + '@pdf-lib/upng@1.0.1': + dependencies: + pako: 1.0.11 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@puppeteer/browsers@2.10.6': + dependencies: + debug: 4.4.1 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.2 + tar-fs: 3.1.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@push.rocks/consolecolor@2.0.3': + dependencies: + ansi-256-colors: 1.1.0 + + '@push.rocks/early@4.0.4': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/isohash@2.0.1': + dependencies: + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smarthash': 3.0.2 + + '@push.rocks/isounique@1.0.5': {} + + '@push.rocks/levelcache@3.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbucket': 3.3.7 + '@push.rocks/smartcache': 1.0.16 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.1.7 + '@tsclass/tsclass': 4.4.4 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/lik@6.2.2': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@push.rocks/mongodump@1.0.8': + dependencies: + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartfile': 9.0.6 + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartpath': 5.0.5 + '@pushrocks/smartpromise': 3.1.10 + '@tsclass/tsclass': 4.4.4 + mongodb: 4.17.2 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/qenv@6.1.0': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@configvault.io/interfaces': 1.0.17 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpath': 5.1.0 + + '@push.rocks/smartarchive@3.0.8': + dependencies: + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 2.0.8 + '@push.rocks/smartunique': 3.0.9 + '@types/gunzip-maybe': 1.4.2 + '@types/tar-stream': 2.2.3 + gunzip-maybe: 1.4.2 + tar: 6.2.1 + tar-stream: 3.1.7 + + '@push.rocks/smartbrowser@2.0.8(typescript@5.8.3)': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpdf': 3.3.0(typescript@5.8.3) + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.8.3) + '@push.rocks/smartunique': 3.0.9 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartbucket@3.3.7': + dependencies: + '@aws-sdk/client-s3': 3.864.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 4.4.4 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartbuffer@3.0.5': + dependencies: + uint8array-extras: 1.4.0 + + '@push.rocks/smartcache@1.0.16': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smarterror': 2.0.1 + '@pushrocks/smarthash': 3.0.2 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smarttime': 4.0.1 + + '@push.rocks/smartchok@1.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 4.0.3 + picomatch: 4.0.3 + + '@push.rocks/smartcli@4.0.11': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + yargs-parser: 21.1.1 + + '@push.rocks/smartclickhouse@2.0.17': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + + '@push.rocks/smartcrypto@2.0.4': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@types/node-forge': 1.3.13 + node-forge: 1.3.1 + + '@push.rocks/smartdata@5.15.1(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6)': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartmongo': 2.0.12(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.1.7 + '@tsclass/tsclass': 8.2.1 + mongodb: 6.18.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - aws-crt + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + '@push.rocks/smartdelay@3.0.5': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartenv@5.0.13': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartexit@1.0.23': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + tree-kill: 1.2.2 + + '@push.rocks/smartexpect@2.5.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + fast-deep-equal: 3.1.3 + + '@push.rocks/smartfeed@1.0.11': + dependencies: + '@tsclass/tsclass': 3.0.48 + feed: 4.2.2 + rss-parser: 3.13.0 + + '@push.rocks/smartfile-interfaces@1.0.7': {} + + '@push.rocks/smartfile@10.0.41': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.2.3 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 1.0.6 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartstream': 2.0.8 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.3.1 + glob: 10.4.5 + js-yaml: 4.1.0 + + '@push.rocks/smartfile@11.2.5': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.2.3 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartstream': 3.2.5 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.3.1 + glob: 11.0.3 + js-yaml: 4.1.0 + + '@push.rocks/smartguard@3.1.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + + '@push.rocks/smarthash@3.2.3': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.2.3 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@push.rocks/smartjson@5.0.20': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartstring': 4.0.15 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@push.rocks/smartlog-destination-devtools@1.0.12': + dependencies: + '@push.rocks/smartlog-interfaces': 3.0.2 + + '@push.rocks/smartlog-destination-local@9.0.2': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartlog-interfaces@3.0.2': + dependencies: + '@api.global/typedrequest-interfaces': 2.0.2 + '@tsclass/tsclass': 4.4.4 + + '@push.rocks/smartlog@3.1.8': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartclickhouse': 2.0.17 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smarthash': 3.2.3 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 9.2.0 + + '@push.rocks/smartmanifest@2.0.2': {} + + '@push.rocks/smartmarkdown@3.0.3': + dependencies: + '@push.rocks/smartyaml': 2.0.5 + '@types/turndown': 5.0.5 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-html: 16.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + turndown: 7.2.0 + turndown-plugin-gfm: 1.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartmatch@2.0.0': + dependencies: + matcher: 5.0.0 + + '@push.rocks/smartmime@1.0.6': + dependencies: + '@types/mime-types': 2.1.4 + mime-types: 2.1.35 + + '@push.rocks/smartmime@2.0.4': + dependencies: + '@types/mime-types': 2.1.4 + file-type: 19.6.0 + mime: 4.0.7 + + '@push.rocks/smartmongo@2.0.12(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6)': + dependencies: + '@push.rocks/mongodump': 1.0.8 + '@push.rocks/smartdata': 5.15.1(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + mongodb-memory-server: 10.2.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - aws-crt + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + '@push.rocks/smartnetwork@4.1.2': + dependencies: + '@push.rocks/smartping': 1.0.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.0.15 + '@types/default-gateway': 7.2.2 + isopen: 1.3.0 + public-ip: 7.0.1 + systeminformation: 5.27.7 + + '@push.rocks/smartnpm@2.0.4': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/levelcache': 3.1.1 + '@push.rocks/smartarchive': 3.0.8 + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartversion': 3.0.5 + package-json: 8.1.1 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartntml@2.0.8': + dependencies: + '@design.estate/dees-element': 2.1.2 + '@happy-dom/global-registrator': 15.11.7 + '@push.rocks/smartpromise': 4.2.3 + fake-indexeddb: 6.1.0 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@push.rocks/smartobject@1.0.12': + dependencies: + fast-deep-equal: 3.1.3 + minimatch: 9.0.5 + + '@push.rocks/smartopen@2.0.0': + dependencies: + open: 8.4.2 + + '@push.rocks/smartpath@5.1.0': {} + + '@push.rocks/smartpath@6.0.0': {} + + '@push.rocks/smartpdf@3.3.0(typescript@5.8.3)': + dependencies: + '@push.rocks/smartbuffer': 3.0.5 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartnetwork': 4.1.2 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.8.3) + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 9.2.0 + '@types/express': 5.0.3 + express: 5.1.0 + pdf-lib: 1.17.1 + pdf2json: 3.2.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartping@1.0.8': + dependencies: + '@types/ping': 0.4.4 + ping: 0.4.4 + + '@push.rocks/smartpromise@4.2.3': {} + + '@push.rocks/smartpuppeteer@2.0.5(typescript@5.8.3)': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartshell': 3.2.3 + puppeteer: 24.16.0(typescript@5.8.3) + tree-kill: 1.2.2 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartrequest@2.1.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.4 + + '@push.rocks/smartrequest@4.2.1': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.4 + + '@push.rocks/smartrouter@1.3.3': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartrx': 3.0.10 + path-to-regexp: 8.2.0 + + '@push.rocks/smartrx@3.0.10': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + rxjs: 7.8.2 + + '@push.rocks/smarts3@2.2.5': + dependencies: + '@push.rocks/smartbucket': 3.3.7 + '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartpath': 5.1.0 + '@tsclass/tsclass': 4.4.4 + '@types/s3rver': 3.7.4 + s3rver: 3.7.1 + transitivePeerDependencies: + - aws-crt + - supports-color + + '@push.rocks/smartshell@3.2.3': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + tree-kill: 1.2.2 + which: 5.0.0 + + '@push.rocks/smartsitemap@2.0.3': + dependencies: + '@push.rocks/smartcache': 1.0.16 + '@push.rocks/smartfeed': 1.0.11 + '@push.rocks/smartxml': 1.1.1 + '@push.rocks/smartyaml': 2.0.5 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 4.4.4 + + '@push.rocks/smartsocket@2.1.0': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedserver': 3.0.74 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + engine.io: 6.6.4 + socket.io: 4.8.1 + socket.io-client: 4.8.1 + transitivePeerDependencies: + - '@nuxt/kit' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@push.rocks/smartspawn@3.0.3': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + spawn-wrap: 2.0.0 + threads: 1.7.0 + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartstate@2.0.25': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smarthash': 3.2.3 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/smartstream@2.0.8': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@types/from2': 2.3.5 + '@types/through2': 2.0.41 + from2: 2.3.0 + through2: 4.0.2 + + '@push.rocks/smartstream@3.2.5': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + + '@push.rocks/smartstring@4.0.15': + dependencies: + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartenv': 5.0.13 + '@types/randomatic': 3.1.5 + crypto-random-string: 5.0.0 + js-base64: 3.7.7 + randomatic: 3.1.1 + strip-indent: 4.0.0 + url: 0.11.4 + + '@push.rocks/smarttime@4.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + croner: 9.1.0 + date-fns: 4.1.0 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 9.2.0 + + '@push.rocks/smartunique@3.0.9': + dependencies: + '@types/uuid': 9.0.8 + nanoid: 4.0.2 + uuid: 9.0.1 + + '@push.rocks/smarturl@3.1.0': {} + + '@push.rocks/smartversion@3.0.5': + dependencies: + '@types/semver': 7.7.0 + semver: 7.7.2 + + '@push.rocks/smartxml@1.1.1': + dependencies: + fast-xml-parser: 4.5.3 + xmlbuilder2: 3.1.1 + + '@push.rocks/smartyaml@2.0.5': + dependencies: + '@types/js-yaml': 3.12.10 + js-yaml: 3.14.1 + + '@push.rocks/taskbuffer@3.1.7': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartunique': 3.0.9 + + '@push.rocks/webrequest@3.0.37': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/websetup@3.0.19': + dependencies: + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartpromise': 4.0.2 + '@tsclass/tsclass': 4.4.4 + + '@push.rocks/webstore@2.0.20': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@tempfix/idb': 8.0.3 + fake-indexeddb: 5.0.2 + + '@push.rocks/webstream@1.0.10': + dependencies: + '@push.rocks/smartenv': 5.0.13 + + '@pushrocks/isounique@1.0.5': {} + + '@pushrocks/lik@5.0.7': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartmatch': 1.0.7 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 2.0.27 + '@pushrocks/smarttime': 3.0.50 + '@types/minimatch': 3.0.5 + symbol-tree: 3.2.4 + + '@pushrocks/lik@6.0.2': + dependencies: + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartmatch': 2.0.0 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrx': 3.0.2 + '@pushrocks/smarttime': 4.0.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@pushrocks/smartdelay@2.0.13': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@pushrocks/smartdelay@3.0.1': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + + '@pushrocks/smartenv@5.0.5': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@pushrocks/smarterror@2.0.1': + dependencies: + clean-stack: 1.3.0 + make-error-cause: 2.3.0 + + '@pushrocks/smartfile-interfaces@1.0.7': {} + + '@pushrocks/smartfile@9.0.6': + dependencies: + '@pushrocks/lik': 5.0.7 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartfile-interfaces': 1.0.7 + '@pushrocks/smarthash': 2.1.10 + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartmime': 1.0.5 + '@pushrocks/smartpath': 4.0.3 + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smartrequest': 1.1.56 + '@types/fs-extra': 9.0.13 + '@types/glob': 7.2.0 + '@types/js-yaml': 4.0.9 + fs-extra: 10.1.0 + glob: 7.2.3 + js-yaml: 4.1.0 + + '@pushrocks/smarthash@2.1.10': + dependencies: + '@pushrocks/smartjson': 4.0.6 + '@pushrocks/smartpromise': 3.1.10 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@pushrocks/smarthash@3.0.2': + dependencies: + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 3.1.10 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@pushrocks/smartjson@4.0.6': + dependencies: + '@types/buffer-json': 2.0.3 + '@types/fast-json-stable-stringify': 2.1.2 + buffer-json: 2.0.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@pushrocks/smartjson@5.0.6': + dependencies: + '@pushrocks/smartstring': 4.0.7 + '@types/buffer-json': 2.0.3 + buffer-json: 2.0.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@pushrocks/smartmatch@1.0.7': + dependencies: + matcher: 3.0.0 + + '@pushrocks/smartmatch@2.0.0': + dependencies: + matcher: 5.0.0 + + '@pushrocks/smartmime@1.0.5': + dependencies: + '@types/mime-types': 2.1.4 + mime-types: 2.1.35 + + '@pushrocks/smartpath@4.0.3': {} + + '@pushrocks/smartpath@5.0.5': {} + + '@pushrocks/smartpromise@3.1.10': {} + + '@pushrocks/smartpromise@4.0.2': {} + + '@pushrocks/smartrequest@1.1.56': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + '@pushrocks/smarturl': 2.0.1 + agentkeepalive: 4.6.0 + form-data: 4.0.4 + + '@pushrocks/smartrx@2.0.27': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + rxjs: 7.8.2 + + '@pushrocks/smartrx@3.0.2': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + rxjs: 7.8.2 + + '@pushrocks/smartstring@4.0.7': + dependencies: + '@pushrocks/isounique': 1.0.5 + '@pushrocks/smartenv': 5.0.5 + '@types/randomatic': 3.1.5 + buffer: 6.0.3 + crypto-random-string: 5.0.0 + js-base64: 3.7.7 + normalize-newline: 4.1.0 + randomatic: 3.1.1 + strip-indent: 4.0.0 + url: 0.11.4 + + '@pushrocks/smarttime@3.0.50': + dependencies: + '@pushrocks/lik': 5.0.7 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + croner: 4.4.1 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 7.0.1 + + '@pushrocks/smarttime@4.0.1': + dependencies: + '@pushrocks/lik': 6.0.2 + '@pushrocks/smartdelay': 2.0.13 + '@pushrocks/smartpromise': 3.1.10 + croner: 5.7.0 + dayjs: 1.11.13 + is-nan: 1.3.2 + pretty-ms: 8.0.0 + + '@pushrocks/smarturl@2.0.1': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.31': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.31': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.31': {} + + '@rspack/binding-darwin-arm64@1.4.11': + optional: true + + '@rspack/binding-darwin-x64@1.4.11': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.4.11': + optional: true + + '@rspack/binding-linux-arm64-musl@1.4.11': + optional: true + + '@rspack/binding-linux-x64-gnu@1.4.11': + optional: true + + '@rspack/binding-linux-x64-musl@1.4.11': + optional: true + + '@rspack/binding-wasm32-wasi@1.4.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.4.11': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.4.11': + optional: true + + '@rspack/binding-win32-x64-msvc@1.4.11': + optional: true + + '@rspack/binding@1.4.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.4.11 + '@rspack/binding-darwin-x64': 1.4.11 + '@rspack/binding-linux-arm64-gnu': 1.4.11 + '@rspack/binding-linux-arm64-musl': 1.4.11 + '@rspack/binding-linux-x64-gnu': 1.4.11 + '@rspack/binding-linux-x64-musl': 1.4.11 + '@rspack/binding-wasm32-wasi': 1.4.11 + '@rspack/binding-win32-arm64-msvc': 1.4.11 + '@rspack/binding-win32-ia32-msvc': 1.4.11 + '@rspack/binding-win32-x64-msvc': 1.4.11 + + '@rspack/core@1.4.11': + dependencies: + '@module-federation/runtime-tools': 0.17.1 + '@rspack/binding': 1.4.11 + '@rspack/lite-tapable': 1.0.1 + + '@rspack/lite-tapable@1.0.1': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/is@5.6.0': {} + + '@smithy/abort-controller@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.0.0': + dependencies: + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.1.5': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@smithy/core@3.8.0': + dependencies: + '@smithy/middleware-serde': 4.0.9 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + + '@smithy/credential-provider-imds@4.0.7': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.0.5': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.3.2 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.1.3': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.0.5': + dependencies: + '@smithy/eventstream-codec': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.1.1': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/querystring-builder': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.0.5': + dependencies: + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/hash-node@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.0.5': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.1.18': + dependencies: + '@smithy/core': 3.8.0 + '@smithy/middleware-serde': 4.0.9 + '@smithy/node-config-provider': 4.1.4 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.1.19': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/protocol-http': 5.1.3 + '@smithy/service-error-classification': 4.0.7 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + + '@smithy/middleware-serde@4.0.9': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.1.4': + dependencies: + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.1.1': + dependencies: + '@smithy/abort-controller': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/querystring-builder': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/property-provider@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/protocol-http@5.1.3': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.0.7': + dependencies: + '@smithy/types': 4.3.2 + + '@smithy/shared-ini-file-loader@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/signature-v4@5.1.3': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.4.10': + dependencies: + '@smithy/core': 3.8.0 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-stack': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-stream': 4.2.4 + tslib: 2.8.1 + + '@smithy/types@4.3.2': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.0.5': + dependencies: + '@smithy/querystring-parser': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-base64@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.0.0': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.0.26': + dependencies: + '@smithy/property-provider': 4.0.5 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + bowser: 2.11.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.0.26': + dependencies: + '@smithy/config-resolver': 4.1.5 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.0.7': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-retry@4.0.7': + dependencies: + '@smithy/service-error-classification': 4.0.7 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-stream@4.2.4': + dependencies: + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/node-http-handler': 4.1.1 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.0.7': + dependencies: + '@smithy/abort-controller': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@socket.io/component-emitter@3.1.2': {} + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@tempfix/idb@8.0.3': {} + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@tsclass/tsclass@3.0.48': + dependencies: + type-fest: 2.19.0 + + '@tsclass/tsclass@4.4.4': + dependencies: + type-fest: 4.41.0 + + '@tsclass/tsclass@8.2.1': + dependencies: + type-fest: 4.41.0 + + '@tsclass/tsclass@9.2.0': + dependencies: + type-fest: 4.41.0 + + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.2.1 + + '@types/buffer-json@2.0.3': {} + + '@types/clean-css@4.2.11': + dependencies: + '@types/node': 24.2.1 + source-map: 0.6.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.2.1 + + '@types/cors@2.8.19': + dependencies: + '@types/node': 24.2.1 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/default-gateway@7.2.2': {} + + '@types/express-serve-static-core@5.0.7': + dependencies: + '@types/node': 24.2.1 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@5.0.3': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.0.7 + '@types/serve-static': 1.15.8 + + '@types/fast-json-stable-stringify@2.1.2': + dependencies: + fast-json-stable-stringify: 2.1.0 + + '@types/from2@2.3.5': + dependencies: + '@types/node': 24.2.1 + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 24.2.1 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 24.2.1 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 6.0.0 + '@types/node': 24.2.1 + + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 24.2.1 + + '@types/gunzip-maybe@1.4.2': + dependencies: + '@types/node': 24.2.1 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/html-minifier@4.0.5': + dependencies: + '@types/clean-css': 4.2.11 + '@types/relateurl': 0.2.33 + '@types/uglify-js': 3.17.5 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} + + '@types/js-yaml@3.12.10': {} + + '@types/js-yaml@4.0.9': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 24.2.1 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mime-types@2.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/minimatch@3.0.5': {} + + '@types/minimatch@5.1.2': {} + + '@types/minimatch@6.0.0': + dependencies: + minimatch: 10.0.3 + + '@types/ms@2.1.0': {} + + '@types/node-forge@1.3.13': + dependencies: + '@types/node': 24.2.1 + + '@types/node@24.2.1': + dependencies: + undici-types: 7.10.0 + + '@types/ping@0.4.4': {} + + '@types/qs@6.14.0': {} + + '@types/randomatic@3.1.5': {} + + '@types/range-parser@1.2.7': {} + + '@types/relateurl@0.2.33': {} + + '@types/s3rver@3.7.4': + dependencies: + '@types/node': 24.2.1 + + '@types/semver@7.7.0': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.2.1 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.2.1 + '@types/send': 0.17.5 + + '@types/symbol-tree@3.2.5': {} + + '@types/tar-stream@2.2.3': + dependencies: + '@types/node': 24.2.1 + + '@types/through2@2.0.41': + dependencies: + '@types/node': 24.2.1 + + '@types/triple-beam@1.3.5': {} + + '@types/trusted-types@2.0.7': {} + + '@types/turndown@5.0.5': {} + + '@types/uglify-js@3.17.5': + dependencies: + source-map: 0.6.1 + + '@types/unist@3.0.3': {} + + '@types/uuid@9.0.8': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 24.2.1 + '@types/webidl-conversions': 7.0.3 + + '@types/which@3.0.4': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.2.1 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.2.1 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-256-colors@1.1.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + ansis@4.1.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + b4a@1.6.7: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.6.1: + optional: true + + bare-fs@4.1.6: + dependencies: + bare-events: 2.6.1 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.6.1) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.6.1): + dependencies: + streamx: 2.22.1 + optionalDependencies: + bare-events: 2.6.1 + optional: true + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + basic-ftp@5.0.5: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + bowser@2.11.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + broadcast-channel@7.1.0: + dependencies: + '@babel/runtime': 7.27.0 + oblivious-set: 1.4.0 + p-queue: 6.6.2 + unload: 2.4.1 + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + bson@4.7.2: + dependencies: + buffer: 5.7.1 + + bson@6.10.4: {} + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + buffer-json@2.0.0: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + busboy@0.3.1: + dependencies: + dicer: 0.3.0 + + bytes@3.1.2: {} + + cache-content-type@1.0.1: + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.2 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + 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 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + camelcase@6.3.0: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + + chromium-bidi@7.2.0(devtools-protocol@0.0.1475386): + dependencies: + devtools-protocol: 0.0.1475386 + mitt: 3.0.1 + zod: 3.25.76 + + clean-css@4.2.4: + dependencies: + source-map: 0.6.1 + + clean-stack@1.3.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-regexp@3.0.0: + dependencies: + is-regexp: 3.1.0 + + co@4.6.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commander@5.1.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-hrtime@5.0.0: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0(typescript@5.8.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.8.3 + + croner@4.4.1: {} + + croner@5.7.0: {} + + croner@9.1.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@5.0.0: + dependencies: + type-fest: 2.19.0 + + data-uri-to-buffer@6.0.2: {} + + date-fns@4.1.0: {} + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-equal@1.0.1: {} + + deep-extend@0.6.0: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + devtools-protocol@0.0.1475386: {} + + dicer@0.3.0: + dependencies: + streamsearch: 0.1.2 + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dns-socket@4.2.2: + dependencies: + dns-packet: 5.6.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enabled@2.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 24.2.1 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + entities@2.2.0: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esm@3.2.25: {} + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + express-force-ssl@0.3.2: + dependencies: + lodash.assign: 3.2.0 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fake-indexeddb@5.0.2: {} + + fake-indexeddb@6.1.0: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-xml-parser@3.21.1: + dependencies: + strnum: 1.1.2 + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fecha@4.2.3: {} + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-type@19.6.0: + dependencies: + get-stream: 9.0.1 + strtok3: 9.1.1 + token-types: 6.0.4 + uint8array-extras: 1.4.0 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fn.name@1.1.0: {} + + follow-redirects@1.15.11(debug@4.4.1): + optionalDependencies: + debug: 4.4.1 + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@2.1.4: {} + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fresh@2.0.0: {} + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function-timeout@0.1.1: {} + + get-caller-file@2.0.5: {} + + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@6.0.5: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + has-flag@3.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + html-minifier@4.0.0: + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.19.3 + + html-void-elements@3.0.0: {} + + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + + http-cache-semantics@4.2.0: {} + + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + humanize-number@0.0.2: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ip-regex@5.0.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-deflate@1.0.0: {} + + is-docker@2.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-gzip@1.0.0: {} + + is-ip@5.0.1: + dependencies: + ip-regex: 5.0.0 + super-regex: 0.2.0 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number@4.0.0: {} + + is-observable@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isopen@1.3.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + js-base64@3.7.7: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + koa-compose@4.1.0: {} + + koa-convert@2.0.0: + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + + koa-logger@3.2.1: + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + + koa@2.16.2: + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.4.1 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.1.0 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + kuler@2.0.0: {} + + lenis@1.3.8: {} + + lines-and-columns@1.2.4: {} + + lit-element@4.2.1: + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + '@lit/reactive-element': 2.1.1 + lit-html: 3.3.1 + + lit-html@3.3.1: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.1: + dependencies: + '@lit/reactive-element': 2.1.1 + lit-element: 4.2.1 + lit-html: 3.3.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash._baseassign@3.2.0: + dependencies: + lodash._basecopy: 3.0.1 + lodash.keys: 3.1.2 + + lodash._basecopy@3.0.1: {} + + lodash._bindcallback@3.0.1: {} + + lodash._createassigner@3.1.1: + dependencies: + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + lodash.restparam: 3.6.1 + + lodash._getnative@3.9.1: {} + + lodash._isiterateecall@3.0.9: {} + + lodash.assign@3.2.0: + dependencies: + lodash._baseassign: 3.2.0 + lodash._createassigner: 3.1.1 + lodash.keys: 3.1.2 + + lodash.clonedeep@4.5.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isarray@3.0.4: {} + + lodash.keys@3.1.2: + dependencies: + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + + lodash.restparam@3.6.1: {} + + lodash@4.17.21: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + longest-streak@3.1.0: {} + + lower-case@1.1.4: {} + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.1.0: {} + + lru-cache@7.18.3: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-error-cause@2.3.0: + dependencies: + make-error: 1.3.6 + + make-error@1.3.6: {} + + markdown-table@3.0.4: {} + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + math-intrinsics@1.1.0: {} + + math-random@1.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + media-typer@1.1.0: {} + + memory-pager@1.5.0: {} + + merge-descriptors@1.0.3: {} + + merge-descriptors@2.0.0: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mime@4.0.7: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.2.0 + + mongodb-memory-server-core@10.2.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6): + dependencies: + async-mutex: 0.5.0 + camelcase: 6.3.0 + debug: 4.4.1 + find-cache-dir: 3.3.2 + follow-redirects: 1.15.11(debug@4.4.1) + https-proxy-agent: 7.0.6 + mongodb: 6.18.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + new-find-package-json: 2.0.0 + semver: 7.7.2 + tar-stream: 3.1.7 + tslib: 2.8.1 + yauzl: 3.2.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + mongodb-memory-server@10.2.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6): + dependencies: + mongodb-memory-server-core: 10.2.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6) + tslib: 2.8.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + + mongodb@4.17.2: + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.6 + optionalDependencies: + '@aws-sdk/credential-providers': 3.864.0 + '@mongodb-js/saslprep': 1.3.0 + transitivePeerDependencies: + - aws-crt + + mongodb@6.18.0(@aws-sdk/credential-providers@3.864.0)(socks@2.8.6): + dependencies: + '@mongodb-js/saslprep': 1.3.0 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + '@aws-sdk/credential-providers': 3.864.0 + socks: 2.8.6 + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@4.0.2: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + netmask@2.0.2: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + node-forge@1.3.1: {} + + normalize-newline@4.1.0: + dependencies: + replace-buffer: 1.2.1 + + normalize-url@8.0.2: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + oblivious-set@1.4.0: {} + + observable-fns@0.6.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + only@0.0.2: {} + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + p-cancelable@3.0.0: {} + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-try@2.2.0: {} + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.1 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-json-from-dist@1.0.1: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + + pako@0.2.9: {} + + pako@1.0.11: {} + + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@2.1.0: {} + + parse-ms@3.0.0: {} + + parse-ms@4.0.0: {} + + parseurl@1.3.3: {} + + passthrough-counter@1.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.2.0: {} + + pdf-lib@1.17.1: + dependencies: + '@pdf-lib/standard-fonts': 1.0.0 + '@pdf-lib/upng': 1.0.1 + pako: 1.0.11 + tslib: 1.14.1 + + pdf2json@3.2.0: {} + + peek-readable@5.4.2: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + ping@0.4.4: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + property-information@7.1.0: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + public-ip@7.0.1: + dependencies: + dns-socket: 4.2.2 + got: 13.0.0 + is-ip: 5.0.1 + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + puppeteer-core@24.16.0: + dependencies: + '@puppeteer/browsers': 2.10.6 + chromium-bidi: 7.2.0(devtools-protocol@0.0.1475386) + debug: 4.4.1 + devtools-protocol: 0.0.1475386 + typed-query-selector: 2.12.0 + ws: 8.18.3 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + + puppeteer@24.16.0(typescript@5.8.3): + dependencies: + '@puppeteer/browsers': 2.10.6 + chromium-bidi: 7.2.0(devtools-protocol@0.0.1475386) + cosmiconfig: 9.0.0(typescript@5.8.3) + devtools-protocol: 0.0.1475386 + puppeteer-core: 24.16.0 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quick-lru@5.1.1: {} + + randomatic@3.1.1: + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + regenerator-runtime@0.14.1: {} + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + relateurl@0.2.7: {} + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-html@16.0.1: + dependencies: + '@types/mdast': 4.0.4 + hast-util-sanitize: 5.0.2 + hast-util-to-html: 9.0.5 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + replace-buffer@1.2.1: {} + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rolldown@1.0.0-beta.31: + dependencies: + '@oxc-project/runtime': 0.80.0 + '@oxc-project/types': 0.80.0 + '@rolldown/pluginutils': 1.0.0-beta.31 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.31 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.31 + '@rolldown/binding-darwin-x64': 1.0.0-beta.31 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.31 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-ohos': 1.0.0-beta.31 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.31 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.31 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.31 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.31 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.31 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.31 + + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + rss-parser@3.13.0: + dependencies: + entities: 2.2.0 + xml2js: 0.5.0 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + s3rver@3.7.1: + dependencies: + '@koa/router': 9.4.0 + busboy: 0.3.1 + commander: 5.1.0 + fast-xml-parser: 3.21.1 + fs-extra: 8.1.0 + he: 1.2.0 + koa: 2.16.2 + koa-logger: 3.2.1 + lodash: 4.17.21 + statuses: 2.0.2 + winston: 3.17.0 + transitivePeerDependencies: + - supports-color + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + 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.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + socks: 2.8.6 + transitivePeerDependencies: + - supports-color + + socks@2.8.6: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: {} + + stack-trace@0.0.10: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + stream-shift@1.0.3: {} + + streamsearch@0.1.2: {} + + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + strnum@1.1.2: {} + + strnum@2.1.1: {} + + strtok3@9.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.4.2 + + super-regex@0.2.0: + dependencies: + clone-regexp: 3.0.0 + function-timeout: 0.1.1 + time-span: 5.1.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + sweet-scroll@4.0.0: {} + + symbol-tree@3.2.4: {} + + systeminformation@5.27.7: {} + + tar-fs@3.1.0: + dependencies: + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.6 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + text-hex@1.0.0: {} + + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.4.1 + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + + toidentifier@1.0.1: {} + + token-types@6.0.4: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + triple-beam@1.4.1: {} + + trough@2.2.0: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsscmp@1.0.6: {} + + tsx@4.20.3: + dependencies: + esbuild: 0.25.8 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + turndown-plugin-gfm@1.0.2: {} + + turndown@7.2.0: + dependencies: + '@mixmark-io/domino': 2.2.0 + + type-fest@2.19.0: {} + + type-fest@4.41.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typed-query-selector@2.12.0: {} + + typescript@5.8.3: {} + + uglify-js@3.19.3: {} + + uint8array-extras@1.4.0: {} + + undici-types@7.10.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unload@2.4.1: {} + + unpipe@1.0.0: {} + + upper-case@1.1.3: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@9.0.1: {} + + vary@1.1.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + webidl-conversions@7.0.0: {} + + whatwg-mimetype@3.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + ws@8.18.3: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + + xml2js@0.5.0: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + + xmlbuilder@11.0.1: {} + + xmlhttprequest-ssl@2.1.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yauzl@3.2.0: + dependencies: + buffer-crc32: 0.2.13 + pend: 1.2.0 + + ylru@1.4.0: {} + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/readme.hints.md b/readme.hints.md new file mode 100644 index 0000000..93e4a7a --- /dev/null +++ b/readme.hints.md @@ -0,0 +1,3 @@ +# Project Readme Hints + +This is the initial readme hints file. \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d00a440 --- /dev/null +++ b/readme.md @@ -0,0 +1,409 @@ +# @fin.cx/skr 📊 + +> **Enterprise-grade German accounting standards implementation for SKR03 and SKR04** +> Double-entry bookkeeping with MongoDB persistence and full TypeScript support + +## 🚀 Why @fin.cx/skr? + +Building compliant German accounting software? You've come to the right place! This module provides a **complete, type-safe implementation** of the German standard charts of accounts (Standardkontenrahmen) SKR03 and SKR04, the backbone of professional accounting in Germany. + +### 🎯 What makes it awesome? + +- **🏢 Enterprise-Ready**: Production-tested implementation following DATEV standards +- **⚡ Lightning Fast**: MongoDB-powered with optimized indexing and caching +- **🔒 Type-Safe**: Full TypeScript support with comprehensive type definitions +- **🎮 Developer-Friendly**: Intuitive API that makes complex accounting operations simple +- **📈 Real-time Reporting**: Generate financial statements on-the-fly +- **🔄 Transaction Safety**: Built-in double-entry validation and reversals + +## 📦 Installation + +```bash +# Using npm +npm install @fin.cx/skr + +# Using pnpm (recommended) +pnpm add @fin.cx/skr + +# Using yarn +yarn add @fin.cx/skr +``` + +## 🎓 Quick Start + +### Basic Setup + +```typescript +import { SkrApi } from '@fin.cx/skr'; + +// Initialize the API +const api = new SkrApi({ + mongoDbUrl: 'mongodb://localhost:27017', + dbName: 'accounting' // optional, defaults to 'skr_accounting' +}); + +// Choose your SKR standard (SKR03 or SKR04) +await api.initialize('SKR03'); +``` + +### 💰 Posting Transactions + +```typescript +// Simple transaction posting +const transaction = await api.postTransaction({ + date: new Date(), + debitAccount: '1200', // Bank account + creditAccount: '8400', // Revenue account + amount: 1190.00, + description: 'Invoice #2024-001 payment received', + reference: 'INV-2024-001', + vatAmount: 190.00 +}); + +// Complex journal entry with multiple lines +const journalEntry = await api.postJournalEntry({ + date: new Date(), + description: 'Monthly salary payments', + reference: 'SAL-2024-03', + lines: [ + { accountNumber: '6000', debit: 5000.00, description: 'Gross salary' }, + { accountNumber: '4830', credit: 1000.00, description: 'Social security' }, + { accountNumber: '4840', credit: 500.00, description: 'Tax withholding' }, + { accountNumber: '1200', credit: 3500.00, description: 'Net payment' } + ] +}); +``` + +### 📊 Generating Reports + +```typescript +// Trial Balance +const trialBalance = await api.generateTrialBalance({ + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31') +}); + +// Income Statement (P&L) +const incomeStatement = await api.generateIncomeStatement({ + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31') +}); + +// Balance Sheet +const balanceSheet = await api.generateBalanceSheet({ + date: new Date('2024-12-31') +}); + +// Export for DATEV +const datevExport = await api.exportDatev({ + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31'), + format: 'CSV' +}); +``` + +## 🏗️ Core Architecture + +### Account Management + +```typescript +// Create custom accounts +const account = await api.createAccount({ + accountNumber: '1299', + accountName: 'PayPal Business', + accountClass: 1, + accountType: 'asset', + description: 'PayPal business account for online payments', + isActive: true +}); + +// Search accounts +const accounts = await api.searchAccounts('bank'); + +// Get account balance +const balance = await api.getAccountBalance('1200'); +console.log(`Balance: ${balance.balance} EUR`); +console.log(`Debits: ${balance.debitTotal} EUR`); +console.log(`Credits: ${balance.creditTotal} EUR`); +``` + +### Transaction Management + +```typescript +// Get transaction history +const transactions = await api.listTransactions({ + accountNumber: '1200', + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31'), + minAmount: 100, + maxAmount: 10000 +}); + +// Reverse a transaction +const reversal = await api.reverseTransaction(transactionId); + +// Batch processing +const batchResults = await api.postBatchTransactions([ + { date: new Date(), debitAccount: '1200', creditAccount: '8400', amount: 100 }, + { date: new Date(), debitAccount: '1200', creditAccount: '8400', amount: 200 }, + { date: new Date(), debitAccount: '1200', creditAccount: '8400', amount: 300 } +]); +``` + +## 📚 SKR03 vs SKR04: Which One to Choose? + +### SKR03 - Process Structure Principle (Prozessgliederungsprinzip) +**Best for:** 🛍️ Trading companies, 💼 Service providers, 🏪 Retail businesses + +- Accounts organized by **business process flow** +- Easier mapping to operational workflows +- Natural progression from purchasing → inventory → sales +- Popular with small to medium enterprises + +### SKR04 - Financial Classification Principle (Abschlussgliederungsprinzip) +**Best for:** 🏭 Manufacturing companies, 🏗️ Large corporations, 📈 Public companies + +- Accounts organized by **financial statement structure** +- Direct mapping to balance sheet and P&L positions +- Simplified financial reporting and analysis +- Preferred by auditors and financial institutions + +## 🎯 Account Structure + +Both SKR standards follow the same hierarchical structure: + +``` +[0-9] → Account Class (Kontenklasse) + [0-9] → Account Group (Kontengruppe) + [0-9] → Account Subgroup (Kontenuntergruppe) + [0-9] → Individual Account (Einzelkonto) +``` + +### Account Classes Overview + +| Class | SKR03 Description | SKR04 Description | Type | +|-------|------------------|-------------------|------| +| **0** | Fixed Assets | Fixed Assets | Asset | +| **1** | Current Assets | Current Assets | Asset | +| **2** | Equity | Equity | Equity | +| **3** | Liabilities | Liabilities | Liability | +| **4** | Operating Income | Operating Income | Revenue | +| **5** | Cost of Materials | Cost of Materials | Expense | +| **6** | Operating Expenses | Other Operating Costs | Expense | +| **7** | Other Income/Expenses | Other Income/Expenses | Mixed | +| **8** | --- | Financial Results | Mixed | +| **9** | Closing Accounts | Closing Accounts | System | + +## 🔧 Advanced Features + +### Ledger Operations + +```typescript +import { Ledger } from '@fin.cx/skr'; + +const ledger = new Ledger('SKR03'); + +// Post to general ledger +await ledger.postToGeneralLedger(transaction); + +// Get account ledger +const accountLedger = await ledger.getAccountLedger('1200', { + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31') +}); + +// Close accounting period +await ledger.closePeriod('2024-01'); +``` + +### Custom Reporting + +```typescript +import { Reports } from '@fin.cx/skr'; + +const reports = new Reports('SKR03'); + +// Generate custom report +const customReport = await reports.generateCustomReport({ + accounts: ['1200', '1300', '1400'], + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31'), + groupBy: 'month', + includeSubAccounts: true +}); + +// Cash flow statement +const cashFlow = await reports.generateCashFlowStatement({ + year: 2024 +}); +``` + +### Data Import/Export + +```typescript +// Import from CSV +const importedCount = await api.importAccountsFromCSV(csvContent); + +// Export to CSV +const csvExport = await api.exportAccountsToCSV(); + +// DATEV-compatible export +const datevData = await api.exportDatev({ + consultantNumber: '12345', + clientNumber: '67890', + dateFrom: new Date('2024-01-01'), + dateTo: new Date('2024-12-31') +}); +``` + +## 🛡️ Type Safety + +Full TypeScript support with comprehensive type definitions: + +```typescript +import type { + TSKRType, + IAccountData, + ITransactionData, + IJournalEntry, + ITrialBalanceReport, + IIncomeStatement, + IBalanceSheet +} from '@fin.cx/skr'; + +// All operations are fully typed +const account: IAccountData = { + accountNumber: '1200', + accountName: 'Bank Account', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + vatRate: 0, + isActive: true +}; +``` + +## 🌟 Real-World Example + +Here's a complete example of setting up a basic accounting system: + +```typescript +import { SkrApi } from '@fin.cx/skr'; + +async function setupAccounting() { + // Initialize + const api = new SkrApi({ + mongoDbUrl: process.env.MONGODB_URL!, + dbName: 'my_company_accounting' + }); + + await api.initialize('SKR03'); + + // Create custom accounts for your business + await api.createAccount({ + accountNumber: '1299', + accountName: 'Stripe Account', + accountClass: 1, + accountType: 'asset', + description: 'Stripe payment gateway account' + }); + + // Post daily transactions + const transactions = [ + { + date: new Date(), + debitAccount: '1299', // Stripe + creditAccount: '8400', // Revenue + amount: 99.00, + description: 'SaaS subscription payment', + reference: 'stripe_pi_abc123' + }, + { + date: new Date(), + debitAccount: '5900', // Hosting costs + creditAccount: '1200', // Bank + amount: 29.99, + description: 'AWS monthly bill', + reference: 'aws-2024-03' + } + ]; + + for (const tx of transactions) { + await api.postTransaction(tx); + } + + // Generate monthly report + const report = await api.generateIncomeStatement({ + dateFrom: new Date('2024-03-01'), + dateTo: new Date('2024-03-31') + }); + + console.log('Revenue:', report.totalRevenue); + console.log('Expenses:', report.totalExpenses); + console.log('Net Income:', report.netIncome); + + // Close the connection when done + await api.close(); +} + +setupAccounting().catch(console.error); +``` + +## 🚦 API Reference + +### Main Classes + +- **`SkrApi`** - Main API entry point +- **`ChartOfAccounts`** - Account management +- **`Ledger`** - General ledger operations +- **`Reports`** - Financial reporting +- **`Account`** - Account model +- **`Transaction`** - Transaction model +- **`JournalEntry`** - Journal entry model + +### Key Methods + +| Method | Description | +|--------|-------------| +| `initialize(skrType)` | Initialize with SKR03 or SKR04 | +| `postTransaction(data)` | Post a simple transaction | +| `postJournalEntry(data)` | Post a complex journal entry | +| `reverseTransaction(id)` | Reverse a posted transaction | +| `generateTrialBalance(params)` | Generate trial balance report | +| `generateIncomeStatement(params)` | Generate P&L statement | +| `generateBalanceSheet(params)` | Generate balance sheet | +| `exportDatev(params)` | Export DATEV-compatible data | + +## 📋 Requirements + +- **Node.js** >= 18.0.0 +- **MongoDB** >= 5.0 +- **TypeScript** >= 5.0 (for development) + +## 🏆 Why Developers Love It + +- **🎯 Zero Configuration**: Pre-configured SKR03/SKR04 accounts out of the box +- **🔄 Automatic Validation**: Never worry about unbalanced entries +- **📊 Real-time Analytics**: Instant financial insights +- **🛡️ Production Ready**: Battle-tested in enterprise environments +- **📚 Great Documentation**: You're reading it! +- **🤝 Active Community**: Regular updates and support + +## License and Legal Information + +This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. + +**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file. + +### Trademarks + +This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH. + +### Company Information + +Task Venture Capital GmbH +Registered at District court Bremen HRB 35230 HB, Germany + +For any legal inquiries or if you require further information, please contact us via email at hello@task.vc. + +By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works. \ No newline at end of file diff --git a/readme.plan.md b/readme.plan.md new file mode 100644 index 0000000..4e6ef42 --- /dev/null +++ b/readme.plan.md @@ -0,0 +1,243 @@ +# @fin.cx/skr Implementation Plan + +## Command to reread CLAUDE.md + +`cat /home/philkunz/.claude/CLAUDE.md` + +## Project Overview + +TypeScript module implementing SKR03 and SKR04 German accounting standards for double-entry bookkeeping with MongoDB persistence via @push.rocks/smartdata. + +## Implementation Tasks + +### Phase 1: Project Setup + +- [ ] Initialize npm project with pnpm +- [ ] Create package.json with proper metadata (@fin.cx/skr) +- [ ] Install core dependencies + - [ ] @push.rocks/smartdata + - [ ] @git.zone/tstest (dev dependency) +- [ ] Create tsconfig.json based on @push.rocks/smarthash pattern +- [ ] Create npmextra.json for additional configuration +- [ ] Create .gitignore file +- [ ] Create directory structure + - [ ] ts/ directory for source code + - [ ] test/ directory for tests + - [ ] .vscode/ for VS Code settings +- [ ] Create initial readme.md with project description + +### Phase 2: Core Infrastructure + +- [ ] Create ts/index.ts with main exports +- [ ] Create ts/plugins.ts for dependency management + - [ ] Import and export @push.rocks/smartdata + - [ ] Import and export @push.rocks/smartunique for ID generation + - [ ] Import and export @push.rocks/smarttime for date handling +- [ ] Set up database connection helper in ts/skr.database.ts +- [ ] Create type definitions in ts/skr.types.ts + - [ ] Define AccountType enum + - [ ] Define SKRType enum + - [ ] Define TransactionStatus enum + - [ ] Define report interfaces + +### Phase 3: Data Models + +- [ ] Create ts/skr.classes.account.ts + - [ ] Define Account class extending SmartDataDbDoc + - [ ] Add accountNumber field with unique index + - [ ] Add accountName with searchable decorator + - [ ] Add accountClass (0-9) + - [ ] Add accountType (asset/liability/equity/revenue/expense) + - [ ] Add skrType (SKR03/SKR04) + - [ ] Add balance field + - [ ] Add validation methods + - [ ] Add helper methods for balance updates +- [ ] Create ts/skr.classes.transaction.ts + - [ ] Define Transaction class extending SmartDataDbDoc + - [ ] Add transactionId with unique index + - [ ] Add date field with index + - [ ] Add debitAccount and creditAccount fields + - [ ] Add amount field + - [ ] Add description with searchable decorator + - [ ] Add reference field + - [ ] Add validation for double-entry rules + - [ ] Add beforeSave hook for validation +- [ ] Create ts/skr.classes.journalentry.ts + - [ ] Define JournalEntry class for multi-line entries + - [ ] Support split transactions + - [ ] Add validation for balanced entries + +### Phase 4: SKR Account Definitions + +- [ ] Create ts/skr03.data.ts + - [ ] Define account class 0 (Capital accounts) + - [ ] Define account class 1 (Fixed assets) + - [ ] Define account class 2 (Current assets) + - [ ] Define account class 3 (Equity and liabilities) + - [ ] Define account class 4 (Operating income) + - [ ] Define account class 5 (Operating expenses - materials) + - [ ] Define account class 6 (Operating expenses - personnel) + - [ ] Define account class 7 (Operating expenses - other) + - [ ] Define account class 8 (Financial accounts) + - [ ] Define account class 9 (Closing accounts) +- [ ] Create ts/skr04.data.ts + - [ ] Define account class 0 (Capital accounts) + - [ ] Define account class 1 (Financial accounts) + - [ ] Define account class 2 (Expenses) + - [ ] Define account class 3 (Expenses continued) + - [ ] Define account class 4 (Revenues) + - [ ] Define account class 5 (Revenues continued) + - [ ] Define account class 6 (Special accounts) + - [ ] Define account class 7 (Cost accounting) + - [ ] Define account class 8 (Free for use) + - [ ] Define account class 9 (Closing accounts) + +### Phase 5: Business Logic + +- [ ] Create ts/skr.classes.chartofaccounts.ts + - [ ] Implement initializeSKR03() method + - [ ] Implement initializeSKR04() method + - [ ] Implement getAccountByNumber() method + - [ ] Implement getAccountsByClass() method + - [ ] Implement createCustomAccount() method + - [ ] Implement validateAccountNumber() method + - [ ] Implement importFromCSV() method + - [ ] Implement exportToCSV() method +- [ ] Create ts/skr.classes.ledger.ts + - [ ] Implement postTransaction() method + - [ ] Implement postJournalEntry() method + - [ ] Implement validateDoubleEntry() method + - [ ] Implement updateAccountBalances() method + - [ ] Implement reverseTransaction() method + - [ ] Implement getAccountHistory() method + - [ ] Implement closeAccountingPeriod() method + +### Phase 6: Reporting + +- [ ] Create ts/skr.classes.reports.ts + - [ ] Implement getTrialBalance() method + - [ ] Implement getIncomeStatement() for SKR03 + - [ ] Implement getIncomeStatement() for SKR04 + - [ ] Implement getBalanceSheet() for SKR03 + - [ ] Implement getBalanceSheet() for SKR04 + - [ ] Implement getGeneralLedger() method + - [ ] Implement getAccountStatement() method + - [ ] Implement getCashFlowStatement() method + - [ ] Add DATEV export format support + +### Phase 7: API Layer + +- [ ] Create ts/skr.api.ts + - [ ] Implement REST-style account methods + - [ ] createAccount() + - [ ] getAccount() + - [ ] updateAccount() + - [ ] deleteAccount() + - [ ] listAccounts() + - [ ] Implement transaction methods + - [ ] postTransaction() + - [ ] getTransaction() + - [ ] listTransactions() + - [ ] reverseTransaction() + - [ ] Implement report methods + - [ ] generateTrialBalance() + - [ ] generateIncomeStatement() + - [ ] generateBalanceSheet() + - [ ] Implement search methods + - [ ] searchAccounts() + - [ ] searchTransactions() + - [ ] Add pagination support + - [ ] Add filtering support + +### Phase 8: Testing + +- [ ] Create test/test.basic.ts + - [ ] Test database connection + - [ ] Test basic model creation +- [ ] Create test/test.skr03.ts + - [ ] Test SKR03 account initialization + - [ ] Test SKR03 specific account structure + - [ ] Test process-oriented organization + - [ ] Test SKR03 reporting +- [ ] Create test/test.skr04.ts + - [ ] Test SKR04 account initialization + - [ ] Test SKR04 specific account structure + - [ ] Test financial statement organization + - [ ] Test SKR04 reporting +- [ ] Create test/test.transactions.ts + - [ ] Test simple transaction posting + - [ ] Test complex journal entries + - [ ] Test double-entry validation + - [ ] Test balance updates + - [ ] Test transaction reversal +- [ ] Create test/test.reports.ts + - [ ] Test trial balance generation + - [ ] Test income statement + - [ ] Test balance sheet + - [ ] Test report accuracy +- [ ] Create test/test.api.ts + - [ ] Test API CRUD operations + - [ ] Test API search functionality + - [ ] Test API pagination + - [ ] Test API error handling + +### Phase 9: Documentation + +- [ ] Update readme.md with comprehensive documentation + - [ ] Installation instructions + - [ ] Quick start guide + - [ ] API reference + - [ ] SKR03 vs SKR04 explanation + - [ ] Code examples +- [ ] Add inline JSDoc comments to all classes and methods +- [ ] Create example usage files +- [ ] Document CSV import/export format +- [ ] Document DATEV compatibility + +### Phase 10: Build and Quality + +- [ ] Run pnpm build and fix any TypeScript errors +- [ ] Run pnpm test and ensure all tests pass +- [ ] Check for missing type definitions +- [ ] Optimize database indexes +- [ ] Add data validation and error handling +- [ ] Performance testing with large datasets +- [ ] Security review for data access + +### Phase 11: Advanced Features + +- [ ] Add multi-currency support +- [ ] Add VAT/tax calculation helpers +- [ ] Add cost center accounting +- [ ] Add budget management +- [ ] Add audit trail functionality +- [ ] Add data migration tools +- [ ] Add backup/restore functionality + +### Phase 12: Finalization + +- [ ] Final code review +- [ ] Update all documentation +- [ ] Create migration guide from other systems +- [ ] Prepare for npm publication +- [ ] Create changelog +- [ ] Tag version 1.0.0 + +## Notes + +- SKR03 uses process structure principle (operating procedures) +- SKR04 uses financial classification principle (financial statements) +- Account numbers are 4-digit (0000-9999) +- Must maintain double-entry bookkeeping rules +- Use @push.rocks/smartdata for all database operations +- Follow existing code patterns from @push.rocks modules +- Test with @git.zone/tstest using expect from tapbundle + +## Success Criteria + +- [ ] All account classes (0-9) implemented for both SKR03 and SKR04 +- [ ] Double-entry bookkeeping validation working +- [ ] Reports generating correctly +- [ ] All tests passing +- [ ] TypeScript compilation successful +- [ ] Documentation complete diff --git a/services.sh b/services.sh new file mode 100755 index 0000000..3911fb0 --- /dev/null +++ b/services.sh @@ -0,0 +1,429 @@ +#!/bin/bash + +# Banking Application Services Manager +# Manages MongoDB and MinIO containers + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +MAGENTA='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Configuration +MONGO_CONTAINER="banking-mongo" +MONGO_PORT=27017 +MONGO_DATA_DIR="$(pwd)/.nogit/mongodata" +MONGO_USER="bankingadmin" +MONGO_PASS="banking123" +MONGO_VERSION="7.0" + +MINIO_CONTAINER="banking-minio" +MINIO_PORT=9000 +MINIO_CONSOLE_PORT=9001 +MINIO_DATA_DIR="$(pwd)/.nogit/miniodata" +MINIO_USER="minioadmin" +MINIO_PASS="minioadmin" + +# Function to print colored messages +print_message() { + echo -e "${2}${1}${NC}" +} + +# Function to print header +print_header() { + echo + print_message "═══════════════════════════════════════════════════════════════" "$CYAN" + print_message " $1" "$CYAN" + print_message "═══════════════════════════════════════════════════════════════" "$CYAN" + echo +} + +# Check Docker +check_docker() { + if ! command -v docker &> /dev/null; then + print_message "Error: Docker is not installed. Please install Docker first." "$RED" + exit 1 + fi +} + +# Check container status +check_status() { + local container=$1 + if docker ps --format '{{.Names}}' | grep -q "^${container}$"; then + echo "running" + elif docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then + echo "stopped" + else + echo "not_exists" + fi +} + +# Start MongoDB +start_mongodb() { + print_message "📦 MongoDB:" "$YELLOW" + + # Create data directory if needed + [ ! -d "$MONGO_DATA_DIR" ] && mkdir -p "$MONGO_DATA_DIR" + + local status=$(check_status "$MONGO_CONTAINER") + + case $status in + "running") + print_message " Already running ✓" "$GREEN" + ;; + "stopped") + docker start "$MONGO_CONTAINER" > /dev/null + print_message " Started ✓" "$GREEN" + ;; + "not_exists") + print_message " Creating container..." "$YELLOW" + docker run -d \ + --name "$MONGO_CONTAINER" \ + -p "0.0.0.0:${MONGO_PORT}:${MONGO_PORT}" \ + -v "$MONGO_DATA_DIR:/data/db" \ + -e MONGO_INITDB_ROOT_USERNAME="$MONGO_USER" \ + -e MONGO_INITDB_ROOT_PASSWORD="$MONGO_PASS" \ + -e MONGO_INITDB_DATABASE=banking \ + --restart unless-stopped \ + "mongo:${MONGO_VERSION}" > /dev/null + print_message " Created and started ✓" "$GREEN" + ;; + esac + + print_message " URL: mongodb://$MONGO_USER:$MONGO_PASS@localhost:$MONGO_PORT/banking?authSource=admin" "$BLUE" +} + +# Start MinIO +start_minio() { + print_message "📦 MinIO (S3 Storage):" "$YELLOW" + + # Create data directory if needed + [ ! -d "$MINIO_DATA_DIR" ] && mkdir -p "$MINIO_DATA_DIR" + + local status=$(check_status "$MINIO_CONTAINER") + + case $status in + "running") + print_message " Already running ✓" "$GREEN" + ;; + "stopped") + docker start "$MINIO_CONTAINER" > /dev/null + print_message " Started ✓" "$GREEN" + ;; + "not_exists") + print_message " Creating container..." "$YELLOW" + docker run -d \ + --name "$MINIO_CONTAINER" \ + -p "${MINIO_PORT}:9000" \ + -p "${MINIO_CONSOLE_PORT}:9001" \ + -v "$MINIO_DATA_DIR:/data" \ + -e MINIO_ROOT_USER="$MINIO_USER" \ + -e MINIO_ROOT_PASSWORD="$MINIO_PASS" \ + --restart unless-stopped \ + minio/minio server /data --console-address ":9001" > /dev/null + + # Wait for MinIO to start and create bucket + sleep 3 + docker exec "$MINIO_CONTAINER" mc alias set local http://localhost:9000 "$MINIO_USER" "$MINIO_PASS" 2>/dev/null + docker exec "$MINIO_CONTAINER" mc mb local/banking-documents 2>/dev/null || true + print_message " Created and started ✓" "$GREEN" + print_message " Bucket 'banking-documents' created ✓" "$GREEN" + ;; + esac + + print_message " API: http://localhost:$MINIO_PORT" "$BLUE" + print_message " Console: http://localhost:$MINIO_CONSOLE_PORT (login: $MINIO_USER/$MINIO_PASS)" "$BLUE" +} + +# Stop MongoDB +stop_mongodb() { + print_message "📦 MongoDB:" "$YELLOW" + local status=$(check_status "$MONGO_CONTAINER") + + if [ "$status" = "running" ]; then + docker stop "$MONGO_CONTAINER" > /dev/null + print_message " Stopped ✓" "$GREEN" + else + print_message " Not running" "$YELLOW" + fi +} + +# Stop MinIO +stop_minio() { + print_message "📦 MinIO:" "$YELLOW" + local status=$(check_status "$MINIO_CONTAINER") + + if [ "$status" = "running" ]; then + docker stop "$MINIO_CONTAINER" > /dev/null + print_message " Stopped ✓" "$GREEN" + else + print_message " Not running" "$YELLOW" + fi +} + +# Remove containers +remove_containers() { + local removed=false + + if docker ps -a --format '{{.Names}}' | grep -q "^${MONGO_CONTAINER}$"; then + docker rm -f "$MONGO_CONTAINER" > /dev/null 2>&1 + print_message " MongoDB container removed ✓" "$GREEN" + removed=true + fi + + if docker ps -a --format '{{.Names}}' | grep -q "^${MINIO_CONTAINER}$"; then + docker rm -f "$MINIO_CONTAINER" > /dev/null 2>&1 + print_message " MinIO container removed ✓" "$GREEN" + removed=true + fi + + if [ "$removed" = false ]; then + print_message " No containers to remove" "$YELLOW" + fi +} + +# Clean data +clean_data() { + local cleaned=false + + if [ -d "$MONGO_DATA_DIR" ]; then + rm -rf "$MONGO_DATA_DIR" + print_message " MongoDB data removed ✓" "$GREEN" + cleaned=true + fi + + if [ -d "$MINIO_DATA_DIR" ]; then + rm -rf "$MINIO_DATA_DIR" + print_message " MinIO data removed ✓" "$GREEN" + cleaned=true + fi + + if [ "$cleaned" = false ]; then + print_message " No data to clean" "$YELLOW" + fi +} + +# Show status +show_status() { + print_header "Service Status" + + # MongoDB status + local mongo_status=$(check_status "$MONGO_CONTAINER") + case $mongo_status in + "running") + print_message "📦 MongoDB: 🟢 Running" "$GREEN" + print_message " └─ mongodb://$MONGO_USER:***@localhost:$MONGO_PORT/banking" "$CYAN" + ;; + "stopped") + print_message "📦 MongoDB: 🟡 Stopped" "$YELLOW" + ;; + "not_exists") + print_message "📦 MongoDB: ⚪ Not installed" "$MAGENTA" + ;; + esac + + # MinIO status + local minio_status=$(check_status "$MINIO_CONTAINER") + case $minio_status in + "running") + print_message "📦 MinIO: 🟢 Running" "$GREEN" + print_message " ├─ API: http://localhost:$MINIO_PORT" "$CYAN" + print_message " └─ Console: http://localhost:$MINIO_CONSOLE_PORT" "$CYAN" + ;; + "stopped") + print_message "📦 MinIO: 🟡 Stopped" "$YELLOW" + ;; + "not_exists") + print_message "📦 MinIO: ⚪ Not installed" "$MAGENTA" + ;; + esac + + # Show network access for MongoDB + if [ "$mongo_status" = "running" ]; then + echo + print_message "Network Access:" "$BLUE" + local ip=$(hostname -I | awk '{print $1}') + print_message " MongoDB Compass: mongodb://$MONGO_USER:$MONGO_PASS@$ip:$MONGO_PORT/banking?authSource=admin" "$CYAN" + fi +} + +# Show logs +show_logs() { + local service=$1 + local lines=${2:-20} + + case $service in + "mongo"|"mongodb") + if docker ps --format '{{.Names}}' | grep -q "^${MONGO_CONTAINER}$"; then + print_header "MongoDB Logs (last $lines lines)" + docker logs --tail "$lines" "$MONGO_CONTAINER" + else + print_message "MongoDB container is not running" "$YELLOW" + fi + ;; + "minio") + if docker ps --format '{{.Names}}' | grep -q "^${MINIO_CONTAINER}$"; then + print_header "MinIO Logs (last $lines lines)" + docker logs --tail "$lines" "$MINIO_CONTAINER" + else + print_message "MinIO container is not running" "$YELLOW" + fi + ;; + "all") + show_logs "mongo" "$lines" + echo + show_logs "minio" "$lines" + ;; + *) + print_message "Usage: $0 logs [mongo|minio|all] [lines]" "$YELLOW" + ;; + esac +} + +# Main menu +show_help() { + print_header "Banking Services Manager" + + print_message "Usage: $0 [command] [options]" "$GREEN" + echo + print_message "Commands:" "$YELLOW" + print_message " start [service] Start services (mongo|minio|all)" "$NC" + print_message " stop [service] Stop services (mongo|minio|all)" "$NC" + print_message " restart [service] Restart services (mongo|minio|all)" "$NC" + print_message " status Show service status" "$NC" + print_message " logs [service] Show logs (mongo|minio|all) [lines]" "$NC" + print_message " remove Remove all containers" "$NC" + print_message " clean Remove all containers and data ⚠️" "$NC" + print_message " help Show this help message" "$NC" + echo + print_message "Examples:" "$YELLOW" + print_message " $0 start # Start all services" "$NC" + print_message " $0 start mongo # Start only MongoDB" "$NC" + print_message " $0 stop # Stop all services" "$NC" + print_message " $0 status # Check service status" "$NC" + print_message " $0 logs mongo 50 # Show last 50 lines of MongoDB logs" "$NC" +} + +# Main script +check_docker + +case ${1:-help} in + start) + print_header "Starting Services" + case ${2:-all} in + mongo|mongodb) + start_mongodb + ;; + minio|s3) + start_minio + ;; + all|"") + start_mongodb + echo + start_minio + ;; + *) + print_message "Unknown service: $2" "$RED" + print_message "Use: mongo, minio, or all" "$YELLOW" + ;; + esac + ;; + + stop) + print_header "Stopping Services" + case ${2:-all} in + mongo|mongodb) + stop_mongodb + ;; + minio|s3) + stop_minio + ;; + all|"") + stop_mongodb + echo + stop_minio + ;; + *) + print_message "Unknown service: $2" "$RED" + print_message "Use: mongo, minio, or all" "$YELLOW" + ;; + esac + ;; + + restart) + print_header "Restarting Services" + case ${2:-all} in + mongo|mongodb) + stop_mongodb + sleep 2 + start_mongodb + ;; + minio|s3) + stop_minio + sleep 2 + start_minio + ;; + all|"") + stop_mongodb + stop_minio + sleep 2 + start_mongodb + echo + start_minio + ;; + *) + print_message "Unknown service: $2" "$RED" + ;; + esac + ;; + + status) + show_status + ;; + + logs) + show_logs "${2:-all}" "${3:-20}" + ;; + + remove) + print_header "Removing Containers" + print_message "⚠️ This will remove containers but preserve data" "$YELLOW" + read -p "Continue? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + remove_containers + else + print_message "Cancelled" "$YELLOW" + fi + ;; + + clean) + print_header "Clean All" + print_message "⚠️ WARNING: This will remove all containers and data!" "$RED" + print_message "This action cannot be undone!" "$RED" + read -p "Are you sure? Type 'yes' to confirm: " -r + if [ "$REPLY" = "yes" ]; then + remove_containers + echo + clean_data + print_message "All cleaned ✓" "$GREEN" + else + print_message "Cancelled" "$YELLOW" + fi + ;; + + help|--help|-h) + show_help + ;; + + *) + print_message "Unknown command: $1" "$RED" + show_help + exit 1 + ;; +esac + +echo \ No newline at end of file diff --git a/test/test.basic.ts b/test/test.basic.ts new file mode 100644 index 0000000..3c8ee09 --- /dev/null +++ b/test/test.basic.ts @@ -0,0 +1,78 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as skr from '../ts/index.js'; + +tap.test('should export all required classes and types', async () => { + expect(skr.Account).toBeTypeOf('function'); + expect(skr.Transaction).toBeTypeOf('function'); + expect(skr.JournalEntry).toBeTypeOf('function'); + expect(skr.ChartOfAccounts).toBeTypeOf('function'); + expect(skr.Ledger).toBeTypeOf('function'); + expect(skr.Reports).toBeTypeOf('function'); + expect(skr.SkrApi).toBeTypeOf('function'); + expect(skr.SKR03_ACCOUNTS).toBeArray(); + expect(skr.SKR04_ACCOUNTS).toBeArray(); +}); + +tap.test('should have correct number of SKR03 accounts', async () => { + expect(skr.SKR03_ACCOUNTS.length).toBeGreaterThan(50); + expect(skr.SKR03_ACCOUNTS[0].skrType).toEqual('SKR03'); +}); + +tap.test('should have correct number of SKR04 accounts', async () => { + expect(skr.SKR04_ACCOUNTS.length).toBeGreaterThan(50); + expect(skr.SKR04_ACCOUNTS[0].skrType).toEqual('SKR04'); +}); + +tap.test('should have valid account structure for SKR03', async () => { + const firstAccount = skr.SKR03_ACCOUNTS[0]; + expect(firstAccount.accountNumber).toBeTypeofString(); + expect(firstAccount.accountNumber.length).toEqual(4); + expect(firstAccount.accountName).toBeTypeofString(); + expect(firstAccount.accountClass).toBeTypeofNumber(); + expect(firstAccount.accountType).toMatch( + /^(asset|liability|equity|revenue|expense)$/, + ); +}); + +tap.test('should have valid account structure for SKR04', async () => { + const firstAccount = skr.SKR04_ACCOUNTS[0]; + expect(firstAccount.accountNumber).toBeTypeofString(); + expect(firstAccount.accountNumber.length).toEqual(4); + expect(firstAccount.accountName).toBeTypeofString(); + expect(firstAccount.accountClass).toBeTypeofNumber(); + expect(firstAccount.accountType).toMatch( + /^(asset|liability|equity|revenue|expense)$/, + ); +}); + +tap.test('should have account classes 0-9 in SKR03', async () => { + const classes = new Set(skr.SKR03_ACCOUNTS.map((a) => a.accountClass)); + expect(classes.size).toBeGreaterThan(5); + + // Check that we have accounts in multiple classes + for (let i = 0; i <= 9; i++) { + const accountsInClass = skr.SKR03_ACCOUNTS.filter( + (a) => a.accountClass === i, + ); + if (accountsInClass.length > 0) { + expect(accountsInClass[0].accountNumber[0]).toEqual(i.toString()); + } + } +}); + +tap.test('should have account classes 0-9 in SKR04', async () => { + const classes = new Set(skr.SKR04_ACCOUNTS.map((a) => a.accountClass)); + expect(classes.size).toBeGreaterThan(5); + + // Check that we have accounts in multiple classes + for (let i = 0; i <= 9; i++) { + const accountsInClass = skr.SKR04_ACCOUNTS.filter( + (a) => a.accountClass === i, + ); + if (accountsInClass.length > 0) { + expect(accountsInClass[0].accountNumber[0]).toEqual(i.toString()); + } + } +}); + +export default tap.start(); diff --git a/test/test.skr03.ts b/test/test.skr03.ts new file mode 100644 index 0000000..fb578ac --- /dev/null +++ b/test/test.skr03.ts @@ -0,0 +1,159 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as skr from '../ts/index.js'; + +let api: skr.SkrApi; + +tap.test('should initialize SKR03 API', async () => { + api = new skr.SkrApi({ + mongoDbUrl: 'mongodb://localhost:27017', + dbName: 'test_skr03', + }); + + await api.initialize('SKR03'); + expect(api.getSKRType()).toEqual('SKR03'); +}); + +tap.test('should have SKR03 accounts initialized', async () => { + const accounts = await api.listAccounts(); + expect(accounts.length).toBeGreaterThan(50); + + // Check specific SKR03 accounts exist + const kasse = await api.getAccount('1000'); + expect(kasse).not.toBeNull(); + expect(kasse.accountName).toEqual('Kasse'); + expect(kasse.accountType).toEqual('asset'); + + const umsatz = await api.getAccount('4000'); + expect(umsatz).not.toBeNull(); + expect(umsatz.accountName).toEqual('Umsatzerlöse'); + expect(umsatz.accountType).toEqual('revenue'); +}); + +tap.test('should verify SKR03 process structure principle', async () => { + // SKR03 organizes accounts by business process + // Class 4: Operating Income + // Class 5: Material Costs + // Class 6: Personnel Costs + // Class 7: Other Operating Expenses + + const class4 = await api.getAccountsByClass(4); + expect(class4.length).toBeGreaterThan(0); + expect(class4[0].accountType).toEqual('revenue'); + + const class5 = await api.getAccountsByClass(5); + expect(class5.length).toBeGreaterThan(0); + expect(class5[0].accountType).toEqual('expense'); + + const class6 = await api.getAccountsByClass(6); + expect(class6.length).toBeGreaterThan(0); + expect(class6[0].accountType).toEqual('expense'); +}); + +tap.test('should create custom SKR03 account', async () => { + const customAccount = await api.createAccount({ + accountNumber: '4999', + accountName: 'Custom Revenue Account', + accountClass: 4, + accountType: 'revenue', + description: 'Test custom account', + }); + + expect(customAccount.accountNumber).toEqual('4999'); + expect(customAccount.skrType).toEqual('SKR03'); + expect(customAccount.isActive).toBeTrue(); +}); + +tap.test('should post transaction in SKR03', async () => { + const transaction = await api.postTransaction({ + date: new Date(), + debitAccount: '1200', // Bank + creditAccount: '4000', // Revenue + amount: 1000, + description: 'Test sale', + reference: 'INV-001', + skrType: 'SKR03', + }); + + expect(transaction.status).toEqual('posted'); + expect(transaction.amount).toEqual(1000); + expect(transaction.skrType).toEqual('SKR03'); +}); + +tap.test('should post journal entry in SKR03', async () => { + const journalEntry = await api.postJournalEntry({ + date: new Date(), + description: 'Test journal entry', + reference: 'JE-001', + lines: [ + { accountNumber: '1000', debit: 500 }, // Cash + { accountNumber: '1200', debit: 500 }, // Bank + { accountNumber: '4000', credit: 1000 }, // Revenue + ], + skrType: 'SKR03', + }); + + expect(journalEntry.status).toEqual('posted'); + expect(journalEntry.isBalanced).toBeTrue(); + expect(journalEntry.totalDebits).toEqual(1000); + expect(journalEntry.totalCredits).toEqual(1000); +}); + +tap.test('should generate trial balance for SKR03', async () => { + const trialBalance = await api.generateTrialBalance(); + + expect(trialBalance.skrType).toEqual('SKR03'); + expect(trialBalance.entries.length).toBeGreaterThan(0); + expect(trialBalance.isBalanced).toBeTrue(); + expect(trialBalance.totalDebits).toEqual(trialBalance.totalCredits); +}); + +tap.test('should generate income statement for SKR03', async () => { + const incomeStatement = await api.generateIncomeStatement(); + + expect(incomeStatement.skrType).toEqual('SKR03'); + expect(incomeStatement.revenue.length).toBeGreaterThanOrEqual(0); + expect(incomeStatement.expenses.length).toBeGreaterThanOrEqual(0); + expect(incomeStatement.netIncome).toEqual( + incomeStatement.totalRevenue - incomeStatement.totalExpenses, + ); +}); + +tap.test('should generate balance sheet for SKR03', async () => { + const balanceSheet = await api.generateBalanceSheet(); + + expect(balanceSheet.skrType).toEqual('SKR03'); + expect(balanceSheet.assets.totalAssets).toBeGreaterThanOrEqual(0); + expect(balanceSheet.isBalanced).toBeTrue(); +}); + +tap.test('should search accounts in SKR03', async () => { + const results = await api.searchAccounts('Bank'); + + expect(results.length).toBeGreaterThan(0); + const bankAccount = results.find((a) => a.accountNumber === '1200'); + expect(bankAccount).not.toBeNull(); +}); + +tap.test('should export SKR03 accounts to CSV', async () => { + const csv = await api.exportAccountsToCSV(); + + expect(csv).toInclude('"Account";"Name";"Description";"Type";"Active"'); + expect(csv).toInclude('1000'); + expect(csv).toInclude('Kasse'); +}); + +tap.test('should close API connection', async () => { + await api.close(); + + // Verify API requires reinitialization + let errorThrown = false; + try { + await api.listAccounts(); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('not initialized'); + } + expect(errorThrown).toBeTrue(); +}); + +export default tap.start(); diff --git a/test/test.skr04.ts b/test/test.skr04.ts new file mode 100644 index 0000000..d32da44 --- /dev/null +++ b/test/test.skr04.ts @@ -0,0 +1,194 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as skr from '../ts/index.js'; + +let api: skr.SkrApi; + +tap.test('should initialize SKR04 API', async () => { + api = new skr.SkrApi({ + mongoDbUrl: 'mongodb://localhost:27017', + dbName: 'test_skr04', + }); + + await api.initialize('SKR04'); + expect(api.getSKRType()).toEqual('SKR04'); +}); + +tap.test('should have SKR04 accounts initialized', async () => { + const accounts = await api.listAccounts(); + expect(accounts.length).toBeGreaterThan(50); + + // Check specific SKR04 accounts exist + const kasse = await api.getAccount('1000'); + expect(kasse).not.toBeNull(); + expect(kasse.accountName).toEqual('Kasse'); + expect(kasse.accountType).toEqual('asset'); + + const umsatz = await api.getAccount('4000'); + expect(umsatz).not.toBeNull(); + expect(umsatz.accountName).toEqual('Umsatzerlöse'); + expect(umsatz.accountType).toEqual('revenue'); +}); + +tap.test('should verify SKR04 financial classification principle', async () => { + // SKR04 organizes accounts by financial statement structure + // Class 2: Expenses Part 1 + // Class 3: Expenses Part 2 + // Class 4: Revenues Part 1 + // Class 5: Revenues Part 2 + + const class2 = await api.getAccountsByClass(2); + expect(class2.length).toBeGreaterThan(0); + expect(class2[0].accountType).toEqual('expense'); + + const class3 = await api.getAccountsByClass(3); + expect(class3.length).toBeGreaterThan(0); + expect(class3[0].accountType).toEqual('expense'); + + const class4 = await api.getAccountsByClass(4); + expect(class4.length).toBeGreaterThan(0); + expect(class4[0].accountType).toEqual('revenue'); + + const class5 = await api.getAccountsByClass(5); + expect(class5.length).toBeGreaterThan(0); + expect(class5[0].accountType).toEqual('revenue'); +}); + +tap.test('should handle Class 8 as free for use in SKR04', async () => { + // Class 8 in SKR04 is reserved for custom use + const class8 = await api.getAccountsByClass(8); + + for (const account of class8) { + expect(account.accountName).toEqual('frei'); + expect(account.description).toInclude('custom use'); + } +}); + +tap.test('should post complex transaction in SKR04', async () => { + const transaction = await api.postTransaction({ + date: new Date(), + debitAccount: '5400', // Goods with 19% VAT + creditAccount: '1600', // Trade payables + amount: 119, + description: 'Purchase with VAT', + reference: 'BILL-001', + skrType: 'SKR04', + vatAmount: 19, + }); + + expect(transaction.status).toEqual('posted'); + expect(transaction.vatAmount).toEqual(19); + expect(transaction.skrType).toEqual('SKR04'); +}); + +tap.test('should reverse transaction in SKR04', async () => { + // First create a transaction + const originalTransaction = await api.postTransaction({ + date: new Date(), + debitAccount: '3000', // Rent expense + creditAccount: '1200', // Bank + amount: 500, + description: 'Rent payment', + reference: 'RENT-001', + skrType: 'SKR04', + }); + + // Then reverse it + const reversalTransaction = await api.reverseTransaction( + originalTransaction.id, + ); + + expect(reversalTransaction.reversalOf).toEqual(originalTransaction.id); + expect(reversalTransaction.debitAccount).toEqual( + originalTransaction.creditAccount, + ); + expect(reversalTransaction.creditAccount).toEqual( + originalTransaction.debitAccount, + ); + expect(reversalTransaction.amount).toEqual(originalTransaction.amount); +}); + +tap.test('should calculate correct balances in SKR04', async () => { + // Post several transactions + await api.postTransaction({ + date: new Date(), + debitAccount: '1200', // Bank + creditAccount: '4300', // Revenue 19% VAT + amount: 1190, + description: 'Sale with VAT', + skrType: 'SKR04', + vatAmount: 190, + }); + + await api.postTransaction({ + date: new Date(), + debitAccount: '2300', // Wages expense + creditAccount: '1200', // Bank + amount: 3000, + description: 'Salary payment', + skrType: 'SKR04', + }); + + // Check bank account balance + const bankBalance = await api.getAccountBalance('1200'); + expect(bankBalance.accountNumber).toEqual('1200'); + expect(bankBalance.balance).toEqual( + bankBalance.debitTotal - bankBalance.creditTotal, + ); +}); + +tap.test('should export trial balance to CSV for SKR04', async () => { + const csv = await api.exportReportToCSV('trial_balance'); + + expect(csv).toInclude( + '"Account Number";"Account Name";"Debit";"Credit";"Balance"', + ); + expect(csv).toInclude('TOTAL'); +}); + +tap.test('should handle pagination for SKR04 accounts', async () => { + const page1 = await api.getAccountsPaginated(1, 10); + + expect(page1.data.length).toBeLessThanOrEqual(10); + expect(page1.page).toEqual(1); + expect(page1.pageSize).toEqual(10); + expect(page1.total).toBeGreaterThan(50); + expect(page1.totalPages).toBeGreaterThan(5); + + // Get second page + const page2 = await api.getAccountsPaginated(2, 10); + expect(page2.data[0].accountNumber).not.toEqual(page1.data[0].accountNumber); +}); + +tap.test('should validate double-entry rules', async () => { + const isValid1 = api.validateDoubleEntry(100, 100); + expect(isValid1).toBeTrue(); + + const isValid2 = api.validateDoubleEntry(100, 99); + expect(isValid2).toBeFalse(); + + const isValid3 = api.validateDoubleEntry(100.0, 100.001); + expect(isValid3).toBeTrue(); // Small rounding differences are acceptable +}); + +tap.test('should generate DATEV export for SKR04', async () => { + const datevExport = await api.exportToDATEV(); + + expect(datevExport).toInclude('EXTF'); + expect(datevExport).toInclude('Buchungsstapel'); +}); + +tap.test('should close API connection', async () => { + await api.close(); + + // Verify API requires reinitialization + let errorThrown = false; + try { + await api.listAccounts(); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('not initialized'); + } + expect(errorThrown).toBeTrue(); +}); + +export default tap.start(); diff --git a/test/test.transactions.ts b/test/test.transactions.ts new file mode 100644 index 0000000..f307928 --- /dev/null +++ b/test/test.transactions.ts @@ -0,0 +1,276 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as skr from '../ts/index.js'; + +let api: skr.SkrApi; + +tap.test('should initialize API for transaction tests', async () => { + api = new skr.SkrApi({ + mongoDbUrl: 'mongodb://localhost:27017', + dbName: 'test_transactions', + }); + + await api.initialize('SKR03'); + expect(api.getSKRType()).toEqual('SKR03'); +}); + +tap.test('should enforce double-entry bookkeeping rules', async () => { + let errorThrown = false; + + try { + // Try to post unbalanced journal entry + await api.postJournalEntry({ + date: new Date(), + description: 'Unbalanced entry', + reference: 'TEST-001', + lines: [ + { accountNumber: '1000', debit: 100 }, + { accountNumber: '4000', credit: 50 }, // Unbalanced! + ], + skrType: 'SKR03', + }); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('not balanced'); + } + + expect(errorThrown).toBeTrue(); +}); + +tap.test('should prevent posting to same account', async () => { + let errorThrown = false; + + try { + await api.postTransaction({ + date: new Date(), + debitAccount: '1000', + creditAccount: '1000', // Same account! + amount: 100, + description: 'Invalid transaction', + skrType: 'SKR03', + }); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('cannot be the same'); + } + + expect(errorThrown).toBeTrue(); +}); + +tap.test('should prevent posting to inactive account', async () => { + // First create and deactivate an account + const customAccount = await api.createAccount({ + accountNumber: '9998', + accountName: 'Inactive Test Account', + accountClass: 9, + accountType: 'equity', + isActive: false, + }); + + let errorThrown = false; + + try { + await api.postTransaction({ + date: new Date(), + debitAccount: '9998', // Inactive account + creditAccount: '1000', + amount: 100, + description: 'Transaction to inactive account', + skrType: 'SKR03', + }); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('not active'); + } + + expect(errorThrown).toBeTrue(); +}); + +tap.test( + 'should handle complex journal entry with multiple lines', + async () => { + const journalEntry = await api.postJournalEntry({ + date: new Date(), + description: 'Complex distribution', + reference: 'COMPLEX-001', + lines: [ + { accountNumber: '5000', debit: 500, description: 'Materials' }, + { accountNumber: '6000', debit: 300, description: 'Wages' }, + { accountNumber: '7100', debit: 200, description: 'Rent' }, + { accountNumber: '1200', credit: 1000, description: 'Bank payment' }, + ], + skrType: 'SKR03', + }); + + expect(journalEntry.lines.length).toEqual(4); + expect(journalEntry.totalDebits).toEqual(1000); + expect(journalEntry.totalCredits).toEqual(1000); + expect(journalEntry.isBalanced).toBeTrue(); + }, +); + +tap.test('should track transaction history for account', async () => { + // Post multiple transactions + await api.postTransaction({ + date: new Date('2024-01-01'), + debitAccount: '1000', + creditAccount: '4000', + amount: 100, + description: 'Sale 1', + skrType: 'SKR03', + }); + + await api.postTransaction({ + date: new Date('2024-01-02'), + debitAccount: '1000', + creditAccount: '4000', + amount: 200, + description: 'Sale 2', + skrType: 'SKR03', + }); + + await api.postTransaction({ + date: new Date('2024-01-03'), + debitAccount: '5000', + creditAccount: '1000', + amount: 50, + description: 'Purchase', + skrType: 'SKR03', + }); + + // Get transaction history for cash account + const history = await api.getAccountTransactions('1000'); + + expect(history.length).toBeGreaterThanOrEqual(3); + + // Check balance calculation + const balance = await api.getAccountBalance('1000'); + expect(balance.debitTotal).toBeGreaterThanOrEqual(300); + expect(balance.creditTotal).toBeGreaterThanOrEqual(50); +}); + +tap.test('should filter transactions by date range', async () => { + const startDate = new Date('2024-01-01'); + const endDate = new Date('2024-01-31'); + + const transactions = await api.listTransactions({ + dateFrom: startDate, + dateTo: endDate, + }); + + for (const transaction of transactions) { + expect(transaction.date.getTime()).toBeGreaterThanOrEqual( + startDate.getTime(), + ); + expect(transaction.date.getTime()).toBeLessThanOrEqual(endDate.getTime()); + } +}); + +tap.test('should filter transactions by amount range', async () => { + const transactions = await api.listTransactions({ + minAmount: 100, + maxAmount: 500, + }); + + for (const transaction of transactions) { + expect(transaction.amount).toBeGreaterThanOrEqual(100); + expect(transaction.amount).toBeLessThanOrEqual(500); + } +}); + +tap.test('should handle batch transaction posting', async () => { + const batchTransactions = [ + { + date: new Date(), + debitAccount: '1200', + creditAccount: '4000', + amount: 100, + description: 'Batch sale 1', + skrType: 'SKR03' as skr.TSKRType, + }, + { + date: new Date(), + debitAccount: '1200', + creditAccount: '4000', + amount: 200, + description: 'Batch sale 2', + skrType: 'SKR03' as skr.TSKRType, + }, + { + date: new Date(), + debitAccount: '1200', + creditAccount: '4000', + amount: 300, + description: 'Batch sale 3', + skrType: 'SKR03' as skr.TSKRType, + }, + ]; + + const results = await api.postBatchTransactions(batchTransactions); + + expect(results.length).toEqual(3); + expect(results[0].amount).toEqual(100); + expect(results[1].amount).toEqual(200); + expect(results[2].amount).toEqual(300); +}); + +tap.test('should handle transaction with VAT', async () => { + const transaction = await api.postTransaction({ + date: new Date(), + debitAccount: '5400', // Goods with 19% VAT + creditAccount: '1600', // Trade payables + amount: 119, + description: 'Purchase including VAT', + skrType: 'SKR03', + vatAmount: 19, + reference: 'VAT-001', + }); + + expect(transaction.vatAmount).toEqual(19); + expect(transaction.amount).toEqual(119); +}); + +tap.test('should handle transaction with cost center', async () => { + const transaction = await api.postTransaction({ + date: new Date(), + debitAccount: '6000', // Wages + creditAccount: '1200', // Bank + amount: 1000, + description: 'Salary for marketing department', + skrType: 'SKR03', + costCenter: 'MARKETING', + }); + + expect(transaction.costCenter).toEqual('MARKETING'); +}); + +tap.test('should validate account numbers are 4 digits', async () => { + let errorThrown = false; + + try { + await api.createAccount({ + accountNumber: '123', // Only 3 digits! + accountName: 'Invalid Account', + accountClass: 1, + accountType: 'asset', + }); + } catch (error) { + errorThrown = true; + expect(error.message).toInclude('4 digits'); + } + + expect(errorThrown).toBeTrue(); +}); + +tap.test('should recalculate all balances', async () => { + await api.recalculateBalances(); + + // Verify balances are consistent + const trialBalance = await api.generateTrialBalance(); + expect(trialBalance.isBalanced).toBeTrue(); +}); + +tap.test('should close API connection', async () => { + await api.close(); +}); + +export default tap.start(); diff --git a/ts/index.ts b/ts/index.ts new file mode 100644 index 0000000..d644d80 --- /dev/null +++ b/ts/index.ts @@ -0,0 +1,10 @@ +export * from './skr.types.js'; +export * from './skr.classes.account.js'; +export * from './skr.classes.transaction.js'; +export * from './skr.classes.journalentry.js'; +export * from './skr.classes.chartofaccounts.js'; +export * from './skr.classes.ledger.js'; +export * from './skr.classes.reports.js'; +export * from './skr.api.js'; +export * from './skr03.data.js'; +export * from './skr04.data.js'; diff --git a/ts/plugins.ts b/ts/plugins.ts new file mode 100644 index 0000000..dca7087 --- /dev/null +++ b/ts/plugins.ts @@ -0,0 +1,7 @@ +// @push.rocks scope +import * as smartdata from '@push.rocks/smartdata'; +import * as smartunique from '@push.rocks/smartunique'; +import * as smarttime from '@push.rocks/smarttime'; +import * as smartlog from '@push.rocks/smartlog'; + +export { smartdata, smartunique, smarttime, smartlog }; diff --git a/ts/skr.api.ts b/ts/skr.api.ts new file mode 100644 index 0000000..f2b3154 --- /dev/null +++ b/ts/skr.api.ts @@ -0,0 +1,533 @@ +import * as plugins from './plugins.js'; +import { ChartOfAccounts } from './skr.classes.chartofaccounts.js'; +import { Ledger } from './skr.classes.ledger.js'; +import { Reports } from './skr.classes.reports.js'; +import { Account } from './skr.classes.account.js'; +import { Transaction } from './skr.classes.transaction.js'; +import { JournalEntry } from './skr.classes.journalentry.js'; +import type { + IDatabaseConfig, + TSKRType, + IAccountData, + IAccountFilter, + ITransactionData, + ITransactionFilter, + IJournalEntry, + IReportParams, + ITrialBalanceReport, + IIncomeStatement, + IBalanceSheet, +} from './skr.types.js'; + +/** + * Main API class for SKR accounting operations + */ +export class SkrApi { + private chartOfAccounts: ChartOfAccounts; + private ledger: Ledger | null = null; + private reports: Reports | null = null; + private logger: plugins.smartlog.Smartlog; + private initialized: boolean = false; + private currentSKRType: TSKRType | null = null; + + constructor(private config: IDatabaseConfig) { + this.chartOfAccounts = new ChartOfAccounts(config); + this.logger = new plugins.smartlog.Smartlog({ + logContext: { + company: 'fin.cx', + companyunit: 'skr', + containerName: 'SkrApi', + environment: 'local', + runtime: 'node', + zone: 'local', + }, + }); + } + + /** + * Initialize the API with specified SKR type + */ + public async initialize(skrType: TSKRType): Promise { + this.logger.log('info', `Initializing SKR API with ${skrType}`); + + // Initialize chart of accounts + if (skrType === 'SKR03') { + await this.chartOfAccounts.initializeSKR03(); + } else if (skrType === 'SKR04') { + await this.chartOfAccounts.initializeSKR04(); + } else { + throw new Error(`Invalid SKR type: ${skrType}`); + } + + this.currentSKRType = skrType; + this.ledger = new Ledger(skrType); + this.reports = new Reports(skrType); + this.initialized = true; + + this.logger.log('info', 'SKR API initialized successfully'); + } + + /** + * Ensure API is initialized + */ + private ensureInitialized(): void { + if (!this.initialized || !this.currentSKRType) { + throw new Error('API not initialized. Call initialize() first.'); + } + } + + // ========== Account Management ========== + + /** + * Create a new account + */ + public async createAccount( + accountData: Partial, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.createCustomAccount(accountData); + } + + /** + * Get account by number + */ + public async getAccount(accountNumber: string): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getAccountByNumber(accountNumber); + } + + /** + * Update an account + */ + public async updateAccount( + accountNumber: string, + updates: Partial, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.updateAccount(accountNumber, updates); + } + + /** + * Delete an account + */ + public async deleteAccount(accountNumber: string): Promise { + this.ensureInitialized(); + await this.chartOfAccounts.deleteAccount(accountNumber); + } + + /** + * List accounts with optional filter + */ + public async listAccounts(filter?: IAccountFilter): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getAllAccounts(filter); + } + + /** + * Search accounts by term + */ + public async searchAccounts(searchTerm: string): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.searchAccounts(searchTerm); + } + + /** + * Get accounts by class + */ + public async getAccountsByClass(accountClass: number): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getAccountsByClass(accountClass); + } + + /** + * Get accounts by type + */ + public async getAccountsByType( + accountType: IAccountData['accountType'], + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getAccountsByType(accountType); + } + + // ========== Transaction Management ========== + + /** + * Post a simple transaction + */ + public async postTransaction( + transactionData: ITransactionData, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.postTransaction(transactionData); + } + + /** + * Post a journal entry + */ + public async postJournalEntry( + journalData: IJournalEntry, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.postJournalEntry(journalData); + } + + /** + * Get transaction by ID + */ + public async getTransaction( + transactionId: string, + ): Promise { + this.ensureInitialized(); + return await Transaction.getTransactionById(transactionId); + } + + /** + * List transactions with optional filter + */ + public async listTransactions( + filter?: ITransactionFilter, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getTransactions(filter); + } + + /** + * Get transactions for specific account + */ + public async getAccountTransactions( + accountNumber: string, + ): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.getAccountTransactions(accountNumber); + } + + /** + * Reverse a transaction + */ + public async reverseTransaction(transactionId: string): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.reverseTransaction(transactionId); + } + + /** + * Reverse a journal entry + */ + public async reverseJournalEntry(journalId: string): Promise { + this.ensureInitialized(); + if (!this.ledger) throw new Error('Ledger not initialized'); + return await this.ledger.reverseJournalEntry(journalId); + } + + // ========== Reporting ========== + + /** + * Generate trial balance + */ + public async generateTrialBalance( + params?: IReportParams, + ): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.getTrialBalance(params); + } + + /** + * Generate income statement + */ + public async generateIncomeStatement( + params?: IReportParams, + ): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.getIncomeStatement(params); + } + + /** + * Generate balance sheet + */ + public async generateBalanceSheet( + params?: IReportParams, + ): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.getBalanceSheet(params); + } + + /** + * Generate general ledger + */ + public async generateGeneralLedger(params?: IReportParams): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.getGeneralLedger(params); + } + + /** + * Generate cash flow statement + */ + public async generateCashFlowStatement(params?: IReportParams): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.getCashFlowStatement(params); + } + + /** + * Export report to CSV + */ + public async exportReportToCSV( + reportType: 'trial_balance' | 'income_statement' | 'balance_sheet', + params?: IReportParams, + ): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.exportToCSV(reportType, params); + } + + /** + * Export to DATEV format + */ + public async exportToDATEV(params?: IReportParams): Promise { + this.ensureInitialized(); + if (!this.reports) throw new Error('Reports not initialized'); + return await this.reports.exportToDATEV(params); + } + + // ========== Period Management ========== + + /** + * Close accounting period + */ + public async closePeriod( + period: string, + closingAccountNumber?: string, + ): Promise { + this.ensureInitialized(); + if (!this.ledger) throw new Error('Ledger not initialized'); + return await this.ledger.closeAccountingPeriod( + period, + closingAccountNumber, + ); + } + + /** + * Get account balance + */ + public async getAccountBalance( + accountNumber: string, + asOfDate?: Date, + ): Promise { + this.ensureInitialized(); + if (!this.ledger) throw new Error('Ledger not initialized'); + return await this.ledger.getAccountBalance(accountNumber, asOfDate); + } + + /** + * Recalculate all account balances + */ + public async recalculateBalances(): Promise { + this.ensureInitialized(); + if (!this.ledger) throw new Error('Ledger not initialized'); + await this.ledger.recalculateAllBalances(); + } + + // ========== Import/Export ========== + + /** + * Import accounts from CSV + */ + public async importAccountsFromCSV(csvContent: string): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.importAccountsFromCSV(csvContent); + } + + /** + * Export accounts to CSV + */ + public async exportAccountsToCSV(): Promise { + this.ensureInitialized(); + return await this.chartOfAccounts.exportAccountsToCSV(); + } + + // ========== Utility Methods ========== + + /** + * Get current SKR type + */ + public getSKRType(): TSKRType | null { + return this.currentSKRType; + } + + /** + * Get account class description + */ + public getAccountClassDescription(accountClass: number): string { + this.ensureInitialized(); + return this.chartOfAccounts.getAccountClassDescription(accountClass); + } + + /** + * Validate double-entry rules + */ + public validateDoubleEntry( + debitAmount: number, + creditAmount: number, + ): boolean { + if (!this.ledger) throw new Error('Ledger not initialized'); + return this.ledger.validateDoubleEntry(debitAmount, creditAmount); + } + + /** + * Get unbalanced transactions (for audit) + */ + public async getUnbalancedTransactions(): Promise { + this.ensureInitialized(); + if (!this.ledger) throw new Error('Ledger not initialized'); + return await this.ledger.getUnbalancedTransactions(); + } + + /** + * Close the API and database connection + */ + public async close(): Promise { + await this.chartOfAccounts.close(); + this.initialized = false; + this.currentSKRType = null; + this.ledger = null; + this.reports = null; + this.logger.log('info', 'SKR API closed'); + } + + // ========== Batch Operations ========== + + /** + * Post multiple transactions + */ + public async postBatchTransactions( + transactions: ITransactionData[], + ): Promise { + this.ensureInitialized(); + + const results: Transaction[] = []; + const errors: Array<{ index: number; error: string }> = []; + + for (let i = 0; i < transactions.length; i++) { + try { + const transaction = await this.postTransaction(transactions[i]); + results.push(transaction); + } catch (error) { + errors.push({ index: i, error: error.message }); + } + } + + if (errors.length > 0) { + this.logger.log( + 'warn', + `Batch transaction posting completed with ${errors.length} errors`, + ); + throw new Error( + `Batch posting failed for ${errors.length} transactions: ${JSON.stringify(errors)}`, + ); + } + + return results; + } + + /** + * Create multiple accounts + */ + public async createBatchAccounts( + accounts: IAccountData[], + ): Promise { + this.ensureInitialized(); + + const results: Account[] = []; + const errors: Array<{ index: number; error: string }> = []; + + for (let i = 0; i < accounts.length; i++) { + try { + const account = await this.createAccount(accounts[i]); + results.push(account); + } catch (error) { + errors.push({ index: i, error: error.message }); + } + } + + if (errors.length > 0) { + this.logger.log( + 'warn', + `Batch account creation completed with ${errors.length} errors`, + ); + throw new Error( + `Batch creation failed for ${errors.length} accounts: ${JSON.stringify(errors)}`, + ); + } + + return results; + } + + // ========== Pagination Support ========== + + /** + * Get paginated accounts + */ + public async getAccountsPaginated( + page: number = 1, + pageSize: number = 50, + filter?: IAccountFilter, + ): Promise<{ + data: Account[]; + total: number; + page: number; + pageSize: number; + totalPages: number; + }> { + this.ensureInitialized(); + + const allAccounts = await this.listAccounts(filter); + const total = allAccounts.length; + const totalPages = Math.ceil(total / pageSize); + const start = (page - 1) * pageSize; + const end = start + pageSize; + const data = allAccounts.slice(start, end); + + return { + data, + total, + page, + pageSize, + totalPages, + }; + } + + /** + * Get paginated transactions + */ + public async getTransactionsPaginated( + page: number = 1, + pageSize: number = 50, + filter?: ITransactionFilter, + ): Promise<{ + data: Transaction[]; + total: number; + page: number; + pageSize: number; + totalPages: number; + }> { + this.ensureInitialized(); + + const allTransactions = await this.listTransactions(filter); + const total = allTransactions.length; + const totalPages = Math.ceil(total / pageSize); + const start = (page - 1) * pageSize; + const end = start + pageSize; + const data = allTransactions.slice(start, end); + + return { + data, + total, + page, + pageSize, + totalPages, + }; + } +} diff --git a/ts/skr.classes.account.ts b/ts/skr.classes.account.ts new file mode 100644 index 0000000..cd18b97 --- /dev/null +++ b/ts/skr.classes.account.ts @@ -0,0 +1,238 @@ +import * as plugins from './plugins.js'; +import { getDb, getDbSync } from './skr.database.js'; +import type { TAccountType, TSKRType, IAccountData } from './skr.types.js'; + +const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata; + +@plugins.smartdata.Collection(() => getDbSync()) +export class Account extends SmartDataDbDoc { + @unI() + public id: string; + + @svDb() + @index() + public accountNumber: string; + + @svDb() + @searchable() + public accountName: string; + + @svDb() + @index() + public accountClass: number; + + @svDb() + public accountGroup: number; + + @svDb() + public accountSubgroup: number; + + @svDb() + public accountType: TAccountType; + + @svDb() + @index() + public skrType: TSKRType; + + @svDb() + @searchable() + public description: string; + + @svDb() + public vatRate: number; + + @svDb() + public balance: number; + + @svDb() + public debitTotal: number; + + @svDb() + public creditTotal: number; + + @svDb() + public isActive: boolean; + + @svDb() + public isSystemAccount: boolean; + + @svDb() + public createdAt: Date; + + @svDb() + public updatedAt: Date; + + constructor(data?: Partial) { + super(); + + if (data) { + this.id = plugins.smartunique.shortId(); + this.accountNumber = data.accountNumber || ''; + this.accountName = data.accountName || ''; + this.accountClass = data.accountClass || 0; + this.accountType = data.accountType || 'asset'; + this.skrType = data.skrType || 'SKR03'; + this.description = data.description || ''; + this.vatRate = data.vatRate || 0; + this.isActive = data.isActive !== undefined ? data.isActive : true; + + // Parse account structure from number + if (this.accountNumber && this.accountNumber.length === 4) { + this.accountClass = parseInt(this.accountNumber[0]); + this.accountGroup = parseInt(this.accountNumber[1]); + this.accountSubgroup = parseInt(this.accountNumber[2]); + } else { + this.accountGroup = 0; + this.accountSubgroup = 0; + } + + this.balance = 0; + this.debitTotal = 0; + this.creditTotal = 0; + this.isSystemAccount = true; + this.createdAt = new Date(); + this.updatedAt = new Date(); + } + } + + public static async createAccount(data: IAccountData): Promise { + const account = new Account(data); + await account.save(); + return account; + } + + public static async getAccountByNumber( + accountNumber: string, + skrType: TSKRType, + ): Promise { + const account = await Account.getInstance({ + accountNumber, + skrType, + }); + return account; + } + + public static async getAccountsByClass( + accountClass: number, + skrType: TSKRType, + ): Promise { + const accounts = await Account.getInstances({ + accountClass, + skrType, + isActive: true, + }); + return accounts; + } + + public static async getAccountsByType( + accountType: TAccountType, + skrType: TSKRType, + ): Promise { + const accounts = await Account.getInstances({ + accountType, + skrType, + isActive: true, + }); + return accounts; + } + + public static async searchAccounts( + searchTerm: string, + skrType?: TSKRType, + ): Promise { + const query: any = {}; + if (skrType) { + query.skrType = skrType; + } + + const accounts = await Account.getInstances(query); + + // Filter by search term + const lowerSearchTerm = searchTerm.toLowerCase(); + return accounts.filter( + (account) => + account.accountNumber.includes(searchTerm) || + account.accountName.toLowerCase().includes(lowerSearchTerm) || + account.description.toLowerCase().includes(lowerSearchTerm), + ); + } + + public async updateBalance( + debitAmount: number = 0, + creditAmount: number = 0, + ): Promise { + this.debitTotal += debitAmount; + this.creditTotal += creditAmount; + + // Calculate balance based on account type + switch (this.accountType) { + case 'asset': + case 'expense': + // Normal debit accounts + this.balance = this.debitTotal - this.creditTotal; + break; + case 'liability': + case 'equity': + case 'revenue': + // Normal credit accounts + this.balance = this.creditTotal - this.debitTotal; + break; + } + + this.updatedAt = new Date(); + await this.save(); + } + + public async deactivate(): Promise { + this.isActive = false; + this.updatedAt = new Date(); + await this.save(); + } + + public async activate(): Promise { + this.isActive = true; + this.updatedAt = new Date(); + await this.save(); + } + + public getNormalBalance(): 'debit' | 'credit' { + switch (this.accountType) { + case 'asset': + case 'expense': + return 'debit'; + case 'liability': + case 'equity': + case 'revenue': + return 'credit'; + } + } + + public async beforeSave(): Promise { + // Validate account number format + if (!this.accountNumber || this.accountNumber.length !== 4) { + throw new Error( + `Invalid account number format: ${this.accountNumber}. Must be 4 digits.`, + ); + } + + // Validate account number is numeric + if (!/^\d{4}$/.test(this.accountNumber)) { + throw new Error( + `Account number must contain only digits: ${this.accountNumber}`, + ); + } + + // Validate account class matches first digit + const firstDigit = parseInt(this.accountNumber[0]); + if (this.accountClass !== firstDigit) { + throw new Error( + `Account class ${this.accountClass} does not match account number ${this.accountNumber}`, + ); + } + + // Validate SKR type + if (this.skrType !== 'SKR03' && this.skrType !== 'SKR04') { + throw new Error(`Invalid SKR type: ${this.skrType}`); + } + } +} diff --git a/ts/skr.classes.chartofaccounts.ts b/ts/skr.classes.chartofaccounts.ts new file mode 100644 index 0000000..a6e6c83 --- /dev/null +++ b/ts/skr.classes.chartofaccounts.ts @@ -0,0 +1,508 @@ +import * as plugins from './plugins.js'; +import { getDb, closeDb } from './skr.database.js'; +import { Account } from './skr.classes.account.js'; +import { Transaction } from './skr.classes.transaction.js'; +import { JournalEntry } from './skr.classes.journalentry.js'; +import { SKR03_ACCOUNTS, SKR03_ACCOUNT_CLASSES } from './skr03.data.js'; +import { SKR04_ACCOUNTS, SKR04_ACCOUNT_CLASSES } from './skr04.data.js'; +import type { + IDatabaseConfig, + TSKRType, + IAccountData, + IAccountFilter, + ITransactionFilter, + ITransactionData, + IJournalEntry, +} from './skr.types.js'; + +export class ChartOfAccounts { + private logger: plugins.smartlog.Smartlog; + private initialized: boolean = false; + private skrType: TSKRType | null = null; + + constructor(private config?: IDatabaseConfig) { + this.logger = new plugins.smartlog.Smartlog({ + logContext: { + company: 'fin.cx', + companyunit: 'skr', + containerName: 'ChartOfAccounts', + environment: 'local', + runtime: 'node', + zone: 'local', + }, + }); + this.logger.enableConsole(); + } + + /** + * Initialize the database connection + */ + public async init(): Promise { + if (this.initialized) { + this.logger.log('info', 'ChartOfAccounts already initialized'); + return; + } + + if (!this.config) { + throw new Error('Database configuration required for initialization'); + } + + await getDb(this.config); + this.initialized = true; + this.logger.log('info', 'ChartOfAccounts initialized successfully'); + } + + /** + * Initialize SKR03 chart of accounts + */ + public async initializeSKR03(): Promise { + await this.init(); + + this.logger.log('info', 'Initializing SKR03 chart of accounts'); + + // Check if SKR03 accounts already exist + const existingAccounts = await Account.getInstances({ skrType: 'SKR03' }); + if (existingAccounts.length > 0) { + this.logger.log( + 'info', + `SKR03 already initialized with ${existingAccounts.length} accounts`, + ); + this.skrType = 'SKR03'; + return; + } + + // Create all SKR03 accounts + const accounts: Account[] = []; + for (const accountData of SKR03_ACCOUNTS) { + const account = await Account.createAccount(accountData); + accounts.push(account); + } + + this.skrType = 'SKR03'; + this.logger.log( + 'info', + `Successfully initialized SKR03 with ${accounts.length} accounts`, + ); + } + + /** + * Initialize SKR04 chart of accounts + */ + public async initializeSKR04(): Promise { + await this.init(); + + this.logger.log('info', 'Initializing SKR04 chart of accounts'); + + // Check if SKR04 accounts already exist + const existingAccounts = await Account.getInstances({ skrType: 'SKR04' }); + if (existingAccounts.length > 0) { + this.logger.log( + 'info', + `SKR04 already initialized with ${existingAccounts.length} accounts`, + ); + this.skrType = 'SKR04'; + return; + } + + // Create all SKR04 accounts + const accounts: Account[] = []; + for (const accountData of SKR04_ACCOUNTS) { + const account = await Account.createAccount(accountData); + accounts.push(account); + } + + this.skrType = 'SKR04'; + this.logger.log( + 'info', + `Successfully initialized SKR04 with ${accounts.length} accounts`, + ); + } + + /** + * Get the current SKR type + */ + public getSKRType(): TSKRType | null { + return this.skrType; + } + + /** + * Set the active SKR type + */ + public setSKRType(skrType: TSKRType): void { + this.skrType = skrType; + } + + /** + * Get account by number + */ + public async getAccountByNumber( + accountNumber: string, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + return await Account.getAccountByNumber(accountNumber, this.skrType); + } + + /** + * Get accounts by class + */ + public async getAccountsByClass(accountClass: number): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + return await Account.getAccountsByClass(accountClass, this.skrType); + } + + /** + * Get accounts by type + */ + public async getAccountsByType( + accountType: IAccountData['accountType'], + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + return await Account.getAccountsByType(accountType, this.skrType); + } + + /** + * Create a custom account + */ + public async createCustomAccount( + accountData: Partial, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + // Ensure the account uses the current SKR type + const fullAccountData: IAccountData = { + accountNumber: accountData.accountNumber || '', + accountName: accountData.accountName || '', + accountClass: accountData.accountClass || 0, + accountType: accountData.accountType || 'asset', + skrType: this.skrType, + description: accountData.description, + vatRate: accountData.vatRate, + isActive: + accountData.isActive !== undefined ? accountData.isActive : true, + }; + + // Validate account number doesn't already exist + const existing = await this.getAccountByNumber( + fullAccountData.accountNumber, + ); + if (existing) { + throw new Error( + `Account ${fullAccountData.accountNumber} already exists`, + ); + } + + return await Account.createAccount(fullAccountData); + } + + /** + * Update an existing account + */ + public async updateAccount( + accountNumber: string, + updates: Partial, + ): Promise { + const account = await this.getAccountByNumber(accountNumber); + if (!account) { + throw new Error(`Account ${accountNumber} not found`); + } + + // Apply updates + if (updates.accountName !== undefined) + account.accountName = updates.accountName; + if (updates.description !== undefined) + account.description = updates.description; + if (updates.vatRate !== undefined) account.vatRate = updates.vatRate; + if (updates.isActive !== undefined) account.isActive = updates.isActive; + + account.updatedAt = new Date(); + await account.save(); + + return account; + } + + /** + * Delete a custom account (only non-system accounts) + */ + public async deleteAccount(accountNumber: string): Promise { + const account = await this.getAccountByNumber(accountNumber); + if (!account) { + throw new Error(`Account ${accountNumber} not found`); + } + + if (account.isSystemAccount) { + throw new Error(`Cannot delete system account ${accountNumber}`); + } + + // Check if account has transactions + const transactions = await Transaction.getTransactionsByAccount( + accountNumber, + account.skrType, + ); + if (transactions.length > 0) { + throw new Error( + `Cannot delete account ${accountNumber} with existing transactions`, + ); + } + + await account.delete(); + } + + /** + * Search accounts + */ + public async searchAccounts(searchTerm: string): Promise { + return await Account.searchAccounts(searchTerm, this.skrType); + } + + /** + * Get all accounts + */ + public async getAllAccounts(filter?: IAccountFilter): Promise { + const query: any = {}; + + if (this.skrType) { + query.skrType = this.skrType; + } + + if (filter) { + if (filter.accountClass !== undefined) + query.accountClass = filter.accountClass; + if (filter.accountType !== undefined) + query.accountType = filter.accountType; + if (filter.isActive !== undefined) query.isActive = filter.isActive; + } + + const accounts = await Account.getInstances(query); + + // Apply text search if provided + if (filter?.searchTerm) { + const lowerSearchTerm = filter.searchTerm.toLowerCase(); + return accounts.filter( + (account) => + account.accountNumber.includes(filter.searchTerm) || + account.accountName.toLowerCase().includes(lowerSearchTerm) || + account.description.toLowerCase().includes(lowerSearchTerm), + ); + } + + return accounts; + } + + /** + * Post a simple transaction + */ + public async postTransaction( + transactionData: ITransactionData, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + // Ensure the transaction uses the current SKR type + const fullTransactionData: ITransactionData = { + ...transactionData, + skrType: this.skrType, + }; + + return await Transaction.createTransaction(fullTransactionData); + } + + /** + * Post a journal entry + */ + public async postJournalEntry( + journalData: IJournalEntry, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + // Ensure the journal entry uses the current SKR type + const fullJournalData: IJournalEntry = { + ...journalData, + skrType: this.skrType, + }; + + const journalEntry = await JournalEntry.createJournalEntry(fullJournalData); + await journalEntry.post(); + + return journalEntry; + } + + /** + * Get transactions for an account + */ + public async getAccountTransactions( + accountNumber: string, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + return await Transaction.getTransactionsByAccount( + accountNumber, + this.skrType, + ); + } + + /** + * Get transactions by filter + */ + public async getTransactions( + filter?: ITransactionFilter, + ): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + const query: any = { + skrType: this.skrType, + status: 'posted', + }; + + if (filter) { + if (filter.dateFrom || filter.dateTo) { + query.date = {}; + if (filter.dateFrom) query.date.$gte = filter.dateFrom; + if (filter.dateTo) query.date.$lte = filter.dateTo; + } + + if (filter.accountNumber) { + query.$or = [ + { debitAccount: filter.accountNumber }, + { creditAccount: filter.accountNumber }, + ]; + } + + if (filter.minAmount || filter.maxAmount) { + query.amount = {}; + if (filter.minAmount) query.amount.$gte = filter.minAmount; + if (filter.maxAmount) query.amount.$lte = filter.maxAmount; + } + } + + const transactions = await Transaction.getInstances(query); + + // Apply text search if provided + if (filter?.searchTerm) { + const lowerSearchTerm = filter.searchTerm.toLowerCase(); + return transactions.filter( + (transaction) => + transaction.description.toLowerCase().includes(lowerSearchTerm) || + transaction.reference.toLowerCase().includes(lowerSearchTerm), + ); + } + + return transactions; + } + + /** + * Reverse a transaction + */ + public async reverseTransaction(transactionId: string): Promise { + const transaction = await Transaction.getTransactionById(transactionId); + if (!transaction) { + throw new Error(`Transaction ${transactionId} not found`); + } + + return await transaction.reverseTransaction(); + } + + /** + * Get account class description + */ + public getAccountClassDescription(accountClass: number): string { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + const classes = + this.skrType === 'SKR03' ? SKR03_ACCOUNT_CLASSES : SKR04_ACCOUNT_CLASSES; + return ( + classes[accountClass as keyof typeof classes] || `Class ${accountClass}` + ); + } + + /** + * Import accounts from CSV + */ + public async importAccountsFromCSV(csvContent: string): Promise { + if (!this.skrType) { + throw new Error('SKR type not set. Initialize SKR03 or SKR04 first.'); + } + + const lines = csvContent.split('\n').filter((line) => line.trim()); + let importedCount = 0; + + for (const line of lines) { + // Parse CSV line (expecting format: "account";"name";"description";"type";"active") + const parts = line + .split(';') + .map((part) => part.replace(/"/g, '').trim()); + + if (parts.length >= 5) { + const accountData: IAccountData = { + accountNumber: parts[0], + accountName: parts[1], + accountClass: parseInt(parts[0][0]), + accountType: parts[3] as IAccountData['accountType'], + skrType: this.skrType, + description: parts[2], + isActive: + parts[4].toLowerCase() === 'standard' || + parts[4].toLowerCase() === 'active', + }; + + try { + await this.createCustomAccount(accountData); + importedCount++; + } catch (error) { + this.logger.log( + 'warn', + `Failed to import account ${parts[0]}: ${error.message}`, + ); + } + } + } + + return importedCount; + } + + /** + * Export accounts to CSV + */ + public async exportAccountsToCSV(): Promise { + const accounts = await this.getAllAccounts(); + + const csvLines: string[] = []; + csvLines.push('"Account";"Name";"Description";"Type";"Active"'); + + for (const account of accounts) { + csvLines.push( + `"${account.accountNumber}";"${account.accountName}";"${account.description}";"${account.accountType}";"${account.isActive ? 'Active' : 'Inactive'}"`, + ); + } + + return csvLines.join('\n'); + } + + /** + * Close the database connection + */ + public async close(): Promise { + await closeDb(); + this.initialized = false; + this.logger.log('info', 'ChartOfAccounts closed'); + } +} diff --git a/ts/skr.classes.journalentry.ts b/ts/skr.classes.journalentry.ts new file mode 100644 index 0000000..112a22a --- /dev/null +++ b/ts/skr.classes.journalentry.ts @@ -0,0 +1,318 @@ +import * as plugins from './plugins.js'; +import { getDbSync } from './skr.database.js'; +import { Account } from './skr.classes.account.js'; +import { Transaction } from './skr.classes.transaction.js'; +import type { + TSKRType, + IJournalEntry, + IJournalEntryLine, +} from './skr.types.js'; + +const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata; + +@plugins.smartdata.Collection(() => getDbSync()) +export class JournalEntry extends SmartDataDbDoc { + @unI() + public id: string; + + @svDb() + @index() + public journalNumber: string; + + @svDb() + @index() + public date: Date; + + @svDb() + @searchable() + public description: string; + + @svDb() + @index() + public reference: string; + + @svDb() + public lines: IJournalEntryLine[]; + + @svDb() + @index() + public skrType: TSKRType; + + @svDb() + public totalDebits: number; + + @svDb() + public totalCredits: number; + + @svDb() + public isBalanced: boolean; + + @svDb() + @index() + public status: 'draft' | 'posted' | 'reversed'; + + @svDb() + public transactionIds: string[]; + + @svDb() + @index() + public period: string; + + @svDb() + public fiscalYear: number; + + @svDb() + public createdAt: Date; + + @svDb() + public postedAt: Date; + + @svDb() + public createdBy: string; + + constructor(data?: Partial) { + super(); + + if (data) { + this.id = plugins.smartunique.shortId(); + this.journalNumber = this.generateJournalNumber(); + this.date = data.date || new Date(); + this.description = data.description || ''; + this.reference = data.reference || ''; + this.lines = data.lines || []; + this.skrType = data.skrType || 'SKR03'; + this.totalDebits = 0; + this.totalCredits = 0; + this.isBalanced = false; + this.status = 'draft'; + this.transactionIds = []; + + // Set period and fiscal year + const entryDate = new Date(this.date); + this.period = `${entryDate.getFullYear()}-${String(entryDate.getMonth() + 1).padStart(2, '0')}`; + this.fiscalYear = entryDate.getFullYear(); + + this.createdAt = new Date(); + this.postedAt = null; + this.createdBy = 'system'; + + // Calculate totals + this.calculateTotals(); + } + } + + private generateJournalNumber(): string { + const timestamp = Date.now(); + const random = Math.floor(Math.random() * 1000); + return `JE-${timestamp}-${random}`; + } + + private calculateTotals(): void { + this.totalDebits = 0; + this.totalCredits = 0; + + for (const line of this.lines) { + if (line.debit) { + this.totalDebits += line.debit; + } + if (line.credit) { + this.totalCredits += line.credit; + } + } + + // Check if balanced (allowing for small rounding differences) + const difference = Math.abs(this.totalDebits - this.totalCredits); + this.isBalanced = difference < 0.01; + } + + public static async createJournalEntry( + data: IJournalEntry, + ): Promise { + const journalEntry = new JournalEntry(data); + await journalEntry.validate(); + await journalEntry.save(); + return journalEntry; + } + + public addLine(line: IJournalEntryLine): void { + // Validate line + if (!line.accountNumber) { + throw new Error('Account number is required for journal entry line'); + } + + if (!line.debit && !line.credit) { + throw new Error('Either debit or credit amount is required'); + } + + if (line.debit && line.credit) { + throw new Error('A line cannot have both debit and credit amounts'); + } + + if (line.debit && line.debit < 0) { + throw new Error('Debit amount must be positive'); + } + + if (line.credit && line.credit < 0) { + throw new Error('Credit amount must be positive'); + } + + this.lines.push(line); + this.calculateTotals(); + } + + public removeLine(index: number): void { + if (index >= 0 && index < this.lines.length) { + this.lines.splice(index, 1); + this.calculateTotals(); + } + } + + public async validate(): Promise { + // Check if entry is balanced + if (!this.isBalanced) { + throw new Error( + `Journal entry is not balanced. Debits: ${this.totalDebits}, Credits: ${this.totalCredits}`, + ); + } + + // Check minimum lines + if (this.lines.length < 2) { + throw new Error('Journal entry must have at least 2 lines'); + } + + // Validate all accounts exist and are active + for (const line of this.lines) { + const account = await Account.getAccountByNumber( + line.accountNumber, + this.skrType, + ); + + if (!account) { + throw new Error( + `Account ${line.accountNumber} not found for ${this.skrType}`, + ); + } + + if (!account.isActive) { + throw new Error(`Account ${line.accountNumber} is not active`); + } + } + } + + public async post(): Promise { + if (this.status === 'posted') { + throw new Error('Journal entry is already posted'); + } + + // Validate before posting + await this.validate(); + + // Create individual transactions for each debit-credit pair + const transactions: Transaction[] = []; + + // Simple posting logic: match debits with credits + // For complex entries, this could be enhanced with specific pairing logic + const debitLines = this.lines.filter((l) => l.debit); + const creditLines = this.lines.filter((l) => l.credit); + + if (debitLines.length === 1 && creditLines.length === 1) { + // Simple entry: one debit, one credit + const transaction = await Transaction.createTransaction({ + date: this.date, + debitAccount: debitLines[0].accountNumber, + creditAccount: creditLines[0].accountNumber, + amount: debitLines[0].debit, + description: this.description, + reference: this.reference, + skrType: this.skrType, + costCenter: debitLines[0].costCenter, + }); + transactions.push(transaction); + } else { + // Complex entry: multiple debits and/or credits + // Create transactions to balance the entry + for (const debitLine of debitLines) { + for (const creditLine of creditLines) { + const amount = Math.min(debitLine.debit || 0, creditLine.credit || 0); + + if (amount > 0) { + const transaction = await Transaction.createTransaction({ + date: this.date, + debitAccount: debitLine.accountNumber, + creditAccount: creditLine.accountNumber, + amount: amount, + description: `${this.description} - ${debitLine.description || creditLine.description || ''}`, + reference: this.reference, + skrType: this.skrType, + costCenter: debitLine.costCenter || creditLine.costCenter, + }); + transactions.push(transaction); + + // Reduce amounts for tracking + if (debitLine.debit) debitLine.debit -= amount; + if (creditLine.credit) creditLine.credit -= amount; + } + } + } + } + + // Store transaction IDs + this.transactionIds = transactions.map((t) => t.id); + + // Update status + this.status = 'posted'; + this.postedAt = new Date(); + + await this.save(); + } + + public async reverse(): Promise { + if (this.status !== 'posted') { + throw new Error('Can only reverse posted journal entries'); + } + + // Create reversal entry with swapped debits and credits + const reversalLines: IJournalEntryLine[] = this.lines.map((line) => ({ + accountNumber: line.accountNumber, + debit: line.credit, // Swap + credit: line.debit, // Swap + description: `Reversal: ${line.description || ''}`, + costCenter: line.costCenter, + })); + + const reversalEntry = new JournalEntry({ + date: new Date(), + description: `Reversal of ${this.journalNumber}: ${this.description}`, + reference: `REV-${this.journalNumber}`, + lines: reversalLines, + skrType: this.skrType, + }); + + await reversalEntry.validate(); + await reversalEntry.post(); + + // Update original entry status + this.status = 'reversed'; + await this.save(); + + return reversalEntry; + } + + public async beforeSave(): Promise { + // Recalculate totals before saving + this.calculateTotals(); + + // Validate required fields + if (!this.date) { + throw new Error('Journal entry date is required'); + } + + if (!this.description) { + throw new Error('Journal entry description is required'); + } + + if (this.lines.length === 0) { + throw new Error('Journal entry must have at least one line'); + } + } +} diff --git a/ts/skr.classes.ledger.ts b/ts/skr.classes.ledger.ts new file mode 100644 index 0000000..99edda7 --- /dev/null +++ b/ts/skr.classes.ledger.ts @@ -0,0 +1,528 @@ +import * as plugins from './plugins.js'; +import { Account } from './skr.classes.account.js'; +import { Transaction } from './skr.classes.transaction.js'; +import { JournalEntry } from './skr.classes.journalentry.js'; +import type { + TSKRType, + ITransactionData, + IJournalEntry, + IJournalEntryLine, + IAccountBalance, +} from './skr.types.js'; + +export class Ledger { + private logger: plugins.smartlog.Smartlog; + + constructor(private skrType: TSKRType) { + this.logger = new plugins.smartlog.Smartlog({ + logContext: { + company: 'fin.cx', + companyunit: 'skr', + containerName: 'Ledger', + environment: 'local', + runtime: 'node', + zone: 'local', + }, + }); + } + + /** + * Post a transaction with validation + */ + public async postTransaction( + transactionData: ITransactionData, + ): Promise { + this.logger.log( + 'info', + `Posting transaction: ${transactionData.description}`, + ); + + // Ensure SKR type matches + const fullTransactionData: ITransactionData = { + ...transactionData, + skrType: this.skrType, + }; + + // Validate accounts exist + await this.validateAccounts([ + transactionData.debitAccount, + transactionData.creditAccount, + ]); + + // Create and post transaction + const transaction = + await Transaction.createTransaction(fullTransactionData); + + this.logger.log( + 'info', + `Transaction ${transaction.transactionNumber} posted successfully`, + ); + return transaction; + } + + /** + * Post a journal entry with validation + */ + public async postJournalEntry( + journalData: IJournalEntry, + ): Promise { + this.logger.log( + 'info', + `Posting journal entry: ${journalData.description}`, + ); + + // Ensure SKR type matches + const fullJournalData: IJournalEntry = { + ...journalData, + skrType: this.skrType, + }; + + // Validate all accounts exist + const accountNumbers = journalData.lines.map((line) => line.accountNumber); + await this.validateAccounts(accountNumbers); + + // Validate journal entry is balanced + this.validateJournalBalance(journalData.lines); + + // Create and post journal entry + const journalEntry = await JournalEntry.createJournalEntry(fullJournalData); + await journalEntry.post(); + + this.logger.log( + 'info', + `Journal entry ${journalEntry.journalNumber} posted successfully`, + ); + return journalEntry; + } + + /** + * Validate that accounts exist and are active + */ + private async validateAccounts(accountNumbers: string[]): Promise { + const uniqueAccountNumbers = [...new Set(accountNumbers)]; + + for (const accountNumber of uniqueAccountNumbers) { + const account = await Account.getAccountByNumber( + accountNumber, + this.skrType, + ); + + if (!account) { + throw new Error( + `Account ${accountNumber} not found for ${this.skrType}`, + ); + } + + if (!account.isActive) { + throw new Error(`Account ${accountNumber} is not active`); + } + } + } + + /** + * Validate journal entry balance + */ + private validateJournalBalance(lines: IJournalEntryLine[]): void { + let totalDebits = 0; + let totalCredits = 0; + + for (const line of lines) { + if (line.debit) totalDebits += line.debit; + if (line.credit) totalCredits += line.credit; + } + + const difference = Math.abs(totalDebits - totalCredits); + if (difference >= 0.01) { + throw new Error( + `Journal entry is not balanced. Debits: ${totalDebits}, Credits: ${totalCredits}`, + ); + } + } + + /** + * Reverse a transaction + */ + public async reverseTransaction(transactionId: string): Promise { + this.logger.log('info', `Reversing transaction: ${transactionId}`); + + const transaction = await Transaction.getTransactionById(transactionId); + if (!transaction) { + throw new Error(`Transaction ${transactionId} not found`); + } + + if (transaction.skrType !== this.skrType) { + throw new Error( + `Transaction ${transactionId} belongs to different SKR type`, + ); + } + + const reversalTransaction = await transaction.reverseTransaction(); + + this.logger.log( + 'info', + `Transaction reversed: ${reversalTransaction.transactionNumber}`, + ); + return reversalTransaction; + } + + /** + * Reverse a journal entry + */ + public async reverseJournalEntry(journalId: string): Promise { + this.logger.log('info', `Reversing journal entry: ${journalId}`); + + const journalEntry = await JournalEntry.getInstance({ id: journalId }); + if (!journalEntry) { + throw new Error(`Journal entry ${journalId} not found`); + } + + if (journalEntry.skrType !== this.skrType) { + throw new Error( + `Journal entry ${journalId} belongs to different SKR type`, + ); + } + + const reversalEntry = await journalEntry.reverse(); + + this.logger.log( + 'info', + `Journal entry reversed: ${reversalEntry.journalNumber}`, + ); + return reversalEntry; + } + + /** + * Get account history (all transactions for an account) + */ + public async getAccountHistory( + accountNumber: string, + dateFrom?: Date, + dateTo?: Date, + ): Promise { + const account = await Account.getAccountByNumber( + accountNumber, + this.skrType, + ); + if (!account) { + throw new Error(`Account ${accountNumber} not found`); + } + + let transactions = await Transaction.getTransactionsByAccount( + accountNumber, + this.skrType, + ); + + // Apply date filter if provided + if (dateFrom || dateTo) { + transactions = transactions.filter((transaction) => { + if (dateFrom && transaction.date < dateFrom) return false; + if (dateTo && transaction.date > dateTo) return false; + return true; + }); + } + + // Sort by date + transactions.sort((a, b) => a.date.getTime() - b.date.getTime()); + + return transactions; + } + + /** + * Get account balance at a specific date + */ + public async getAccountBalance( + accountNumber: string, + asOfDate?: Date, + ): Promise { + const account = await Account.getAccountByNumber( + accountNumber, + this.skrType, + ); + if (!account) { + throw new Error(`Account ${accountNumber} not found`); + } + + let transactions = await Transaction.getTransactionsByAccount( + accountNumber, + this.skrType, + ); + + // Filter transactions up to the specified date + if (asOfDate) { + transactions = transactions.filter((t) => t.date <= asOfDate); + } + + // Calculate balance + let debitTotal = 0; + let creditTotal = 0; + + for (const transaction of transactions) { + if (transaction.debitAccount === accountNumber) { + debitTotal += transaction.amount; + } + if (transaction.creditAccount === accountNumber) { + creditTotal += transaction.amount; + } + } + + // Calculate net balance based on account type + let balance: number; + switch (account.accountType) { + case 'asset': + case 'expense': + // Normal debit accounts + balance = debitTotal - creditTotal; + break; + case 'liability': + case 'equity': + case 'revenue': + // Normal credit accounts + balance = creditTotal - debitTotal; + break; + } + + return { + accountNumber, + debitTotal, + creditTotal, + balance, + lastUpdated: new Date(), + }; + } + + /** + * Close accounting period (create closing entries) + */ + public async closeAccountingPeriod( + period: string, // Format: YYYY-MM + closingAccountNumber: string = '9400', // Default P&L account + ): Promise { + this.logger.log('info', `Closing accounting period: ${period}`); + + const closingEntries: JournalEntry[] = []; + + // Get all revenue and expense accounts + const revenueAccounts = await Account.getAccountsByType( + 'revenue', + this.skrType, + ); + const expenseAccounts = await Account.getAccountsByType( + 'expense', + this.skrType, + ); + + // Calculate totals for each account in the period + const periodTransactions = await Transaction.getTransactionsByPeriod( + period, + this.skrType, + ); + + // Create closing entry for revenue accounts + const revenueLines: IJournalEntryLine[] = []; + let totalRevenue = 0; + + for (const account of revenueAccounts) { + const balance = await this.getAccountBalanceForPeriod( + account.accountNumber, + periodTransactions, + ); + + if (balance !== 0) { + // Revenue accounts have credit balance, so debit to close + revenueLines.push({ + accountNumber: account.accountNumber, + debit: Math.abs(balance), + description: `Closing ${account.accountName}`, + }); + totalRevenue += Math.abs(balance); + } + } + + if (totalRevenue > 0) { + // Credit the closing account + revenueLines.push({ + accountNumber: closingAccountNumber, + credit: totalRevenue, + description: 'Revenue closing to P&L', + }); + + const revenueClosingEntry = await this.postJournalEntry({ + date: new Date(), + description: `Closing revenue accounts for period ${period}`, + reference: `CLOSE-REV-${period}`, + lines: revenueLines, + skrType: this.skrType, + }); + + closingEntries.push(revenueClosingEntry); + } + + // Create closing entry for expense accounts + const expenseLines: IJournalEntryLine[] = []; + let totalExpense = 0; + + for (const account of expenseAccounts) { + const balance = await this.getAccountBalanceForPeriod( + account.accountNumber, + periodTransactions, + ); + + if (balance !== 0) { + // Expense accounts have debit balance, so credit to close + expenseLines.push({ + accountNumber: account.accountNumber, + credit: Math.abs(balance), + description: `Closing ${account.accountName}`, + }); + totalExpense += Math.abs(balance); + } + } + + if (totalExpense > 0) { + // Debit the closing account + expenseLines.push({ + accountNumber: closingAccountNumber, + debit: totalExpense, + description: 'Expense closing to P&L', + }); + + const expenseClosingEntry = await this.postJournalEntry({ + date: new Date(), + description: `Closing expense accounts for period ${period}`, + reference: `CLOSE-EXP-${period}`, + lines: expenseLines, + skrType: this.skrType, + }); + + closingEntries.push(expenseClosingEntry); + } + + this.logger.log( + 'info', + `Period ${period} closed with ${closingEntries.length} entries`, + ); + return closingEntries; + } + + /** + * Calculate account balance for a specific set of transactions + */ + private async getAccountBalanceForPeriod( + accountNumber: string, + transactions: Transaction[], + ): Promise { + const account = await Account.getAccountByNumber( + accountNumber, + this.skrType, + ); + if (!account) return 0; + + let debitTotal = 0; + let creditTotal = 0; + + for (const transaction of transactions) { + if (transaction.debitAccount === accountNumber) { + debitTotal += transaction.amount; + } + if (transaction.creditAccount === accountNumber) { + creditTotal += transaction.amount; + } + } + + // Calculate net balance based on account type + switch (account.accountType) { + case 'asset': + case 'expense': + return debitTotal - creditTotal; + case 'liability': + case 'equity': + case 'revenue': + return creditTotal - debitTotal; + } + } + + /** + * Validate double-entry rules + */ + public validateDoubleEntry( + debitAmount: number, + creditAmount: number, + ): boolean { + return Math.abs(debitAmount - creditAmount) < 0.01; + } + + /** + * Get unbalanced transactions (for audit) + */ + public async getUnbalancedTransactions(): Promise { + // In a proper double-entry system, all posted transactions should be balanced + // This method is mainly for audit purposes + const allTransactions = await Transaction.getInstances({ + skrType: this.skrType, + status: 'posted', + }); + + // Group transactions by journal entry if they have one + const unbalanced: Transaction[] = []; + + // Since our system ensures balance at posting time, + // this should typically return an empty array + // But we include it for completeness and audit purposes + + return unbalanced; + } + + /** + * Recalculate all account balances + */ + public async recalculateAllBalances(): Promise { + this.logger.log('info', 'Recalculating all account balances'); + + // Get all accounts + const accounts = await Account.getInstances({ skrType: this.skrType }); + + for (const account of accounts) { + // Reset balances + account.debitTotal = 0; + account.creditTotal = 0; + account.balance = 0; + + // Get all transactions for this account + const transactions = await Transaction.getTransactionsByAccount( + account.accountNumber, + this.skrType, + ); + + // Recalculate totals + for (const transaction of transactions) { + if (transaction.debitAccount === account.accountNumber) { + account.debitTotal += transaction.amount; + } + if (transaction.creditAccount === account.accountNumber) { + account.creditTotal += transaction.amount; + } + } + + // Calculate balance based on account type + switch (account.accountType) { + case 'asset': + case 'expense': + account.balance = account.debitTotal - account.creditTotal; + break; + case 'liability': + case 'equity': + case 'revenue': + account.balance = account.creditTotal - account.debitTotal; + break; + } + + account.updatedAt = new Date(); + await account.save(); + } + + this.logger.log( + 'info', + `Recalculated balances for ${accounts.length} accounts`, + ); + } +} diff --git a/ts/skr.classes.reports.ts b/ts/skr.classes.reports.ts new file mode 100644 index 0000000..3aeb280 --- /dev/null +++ b/ts/skr.classes.reports.ts @@ -0,0 +1,721 @@ +import * as plugins from './plugins.js'; +import { Account } from './skr.classes.account.js'; +import { Transaction } from './skr.classes.transaction.js'; +import { Ledger } from './skr.classes.ledger.js'; +import type { + TSKRType, + ITrialBalanceReport, + ITrialBalanceEntry, + IIncomeStatement, + IIncomeStatementEntry, + IBalanceSheet, + IBalanceSheetEntry, + IReportParams, +} from './skr.types.js'; + +export class Reports { + private logger: plugins.smartlog.Smartlog; + private ledger: Ledger; + + constructor(private skrType: TSKRType) { + this.logger = new plugins.smartlog.Smartlog({ + logContext: { + company: 'fin.cx', + companyunit: 'skr', + containerName: 'Reports', + environment: 'local', + runtime: 'node', + zone: 'local', + }, + }); + this.ledger = new Ledger(skrType); + } + + /** + * Generate Trial Balance + */ + public async getTrialBalance( + params?: IReportParams, + ): Promise { + this.logger.log('info', 'Generating trial balance'); + + const accounts = await Account.getInstances({ + skrType: this.skrType, + isActive: true, + }); + + const entries: ITrialBalanceEntry[] = []; + let totalDebits = 0; + let totalCredits = 0; + + for (const account of accounts) { + // Get balance for the period if specified + const balance = params?.dateTo + ? await this.ledger.getAccountBalance( + account.accountNumber, + params.dateTo, + ) + : await this.ledger.getAccountBalance(account.accountNumber); + + if (balance.debitTotal !== 0 || balance.creditTotal !== 0) { + const entry: ITrialBalanceEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + debitBalance: balance.debitTotal, + creditBalance: balance.creditTotal, + netBalance: balance.balance, + }; + + entries.push(entry); + totalDebits += balance.debitTotal; + totalCredits += balance.creditTotal; + } + } + + // Sort entries by account number + entries.sort((a, b) => a.accountNumber.localeCompare(b.accountNumber)); + + const report: ITrialBalanceReport = { + date: params?.dateTo || new Date(), + skrType: this.skrType, + entries, + totalDebits, + totalCredits, + isBalanced: Math.abs(totalDebits - totalCredits) < 0.01, + }; + + this.logger.log( + 'info', + `Trial balance generated with ${entries.length} accounts`, + ); + return report; + } + + /** + * Generate Income Statement (P&L) + */ + public async getIncomeStatement( + params?: IReportParams, + ): Promise { + this.logger.log('info', 'Generating income statement'); + + // Get revenue accounts + const revenueAccounts = await Account.getAccountsByType( + 'revenue', + this.skrType, + ); + const expenseAccounts = await Account.getAccountsByType( + 'expense', + this.skrType, + ); + + const revenueEntries: IIncomeStatementEntry[] = []; + const expenseEntries: IIncomeStatementEntry[] = []; + let totalRevenue = 0; + let totalExpenses = 0; + + // Process revenue accounts + for (const account of revenueAccounts) { + const balance = await this.getAccountBalanceForPeriod(account, params); + + if (balance !== 0) { + const entry: IIncomeStatementEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + amount: Math.abs(balance), + }; + + revenueEntries.push(entry); + totalRevenue += Math.abs(balance); + } + } + + // Process expense accounts + for (const account of expenseAccounts) { + const balance = await this.getAccountBalanceForPeriod(account, params); + + if (balance !== 0) { + const entry: IIncomeStatementEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + amount: Math.abs(balance), + }; + + expenseEntries.push(entry); + totalExpenses += Math.abs(balance); + } + } + + // Calculate percentages + revenueEntries.forEach((entry) => { + entry.percentage = + totalRevenue > 0 ? (entry.amount / totalRevenue) * 100 : 0; + }); + + expenseEntries.forEach((entry) => { + entry.percentage = + totalRevenue > 0 ? (entry.amount / totalRevenue) * 100 : 0; + }); + + // Sort entries by account number + revenueEntries.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + expenseEntries.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + + const report: IIncomeStatement = { + date: params?.dateTo || new Date(), + skrType: this.skrType, + revenue: revenueEntries, + expenses: expenseEntries, + totalRevenue, + totalExpenses, + netIncome: totalRevenue - totalExpenses, + }; + + this.logger.log( + 'info', + `Income statement generated: Revenue ${totalRevenue}, Expenses ${totalExpenses}`, + ); + return report; + } + + /** + * Generate Balance Sheet + */ + public async getBalanceSheet(params?: IReportParams): Promise { + this.logger.log('info', 'Generating balance sheet'); + + // Get accounts by type + const assetAccounts = await Account.getAccountsByType( + 'asset', + this.skrType, + ); + const liabilityAccounts = await Account.getAccountsByType( + 'liability', + this.skrType, + ); + const equityAccounts = await Account.getAccountsByType( + 'equity', + this.skrType, + ); + + // Process assets + const currentAssets: IBalanceSheetEntry[] = []; + const fixedAssets: IBalanceSheetEntry[] = []; + let totalAssets = 0; + + for (const account of assetAccounts) { + const balance = await this.getAccountBalanceForPeriod(account, params); + + if (balance !== 0) { + const entry: IBalanceSheetEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + amount: Math.abs(balance), + }; + + // Classify as current or fixed based on account class + if (account.accountClass === 1) { + currentAssets.push(entry); + } else { + fixedAssets.push(entry); + } + + totalAssets += Math.abs(balance); + } + } + + // Process liabilities + const currentLiabilities: IBalanceSheetEntry[] = []; + const longTermLiabilities: IBalanceSheetEntry[] = []; + let totalLiabilities = 0; + + for (const account of liabilityAccounts) { + const balance = await this.getAccountBalanceForPeriod(account, params); + + if (balance !== 0) { + const entry: IBalanceSheetEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + amount: Math.abs(balance), + }; + + // Classify as current or long-term based on account number + if ( + account.accountNumber.startsWith('16') || + account.accountNumber.startsWith('17') + ) { + currentLiabilities.push(entry); + } else { + longTermLiabilities.push(entry); + } + + totalLiabilities += Math.abs(balance); + } + } + + // Process equity + const equityEntries: IBalanceSheetEntry[] = []; + let totalEquity = 0; + + for (const account of equityAccounts) { + const balance = await this.getAccountBalanceForPeriod(account, params); + + if (balance !== 0) { + const entry: IBalanceSheetEntry = { + accountNumber: account.accountNumber, + accountName: account.accountName, + amount: Math.abs(balance), + }; + + equityEntries.push(entry); + totalEquity += Math.abs(balance); + } + } + + // Add current year profit/loss + const incomeStatement = await this.getIncomeStatement(params); + if (incomeStatement.netIncome !== 0) { + equityEntries.push({ + accountNumber: '9999', + accountName: 'Current Year Profit/Loss', + amount: Math.abs(incomeStatement.netIncome), + }); + totalEquity += Math.abs(incomeStatement.netIncome); + } + + // Sort entries + currentAssets.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + fixedAssets.sort((a, b) => a.accountNumber.localeCompare(b.accountNumber)); + currentLiabilities.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + longTermLiabilities.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + equityEntries.sort((a, b) => + a.accountNumber.localeCompare(b.accountNumber), + ); + + const report: IBalanceSheet = { + date: params?.dateTo || new Date(), + skrType: this.skrType, + assets: { + current: currentAssets, + fixed: fixedAssets, + totalAssets, + }, + liabilities: { + current: currentLiabilities, + longTerm: longTermLiabilities, + totalLiabilities, + }, + equity: { + entries: equityEntries, + totalEquity, + }, + isBalanced: + Math.abs(totalAssets - (totalLiabilities + totalEquity)) < 0.01, + }; + + this.logger.log( + 'info', + `Balance sheet generated: Assets ${totalAssets}, Liabilities ${totalLiabilities}, Equity ${totalEquity}`, + ); + return report; + } + + /** + * Get account balance for a specific period + */ + private async getAccountBalanceForPeriod( + account: Account, + params?: IReportParams, + ): Promise { + let transactions = await Transaction.getTransactionsByAccount( + account.accountNumber, + this.skrType, + ); + + // Apply date filter if provided + if (params?.dateFrom || params?.dateTo) { + transactions = transactions.filter((transaction) => { + if (params.dateFrom && transaction.date < params.dateFrom) return false; + if (params.dateTo && transaction.date > params.dateTo) return false; + return true; + }); + } + + let debitTotal = 0; + let creditTotal = 0; + + for (const transaction of transactions) { + if (transaction.debitAccount === account.accountNumber) { + debitTotal += transaction.amount; + } + if (transaction.creditAccount === account.accountNumber) { + creditTotal += transaction.amount; + } + } + + // Calculate net balance based on account type + switch (account.accountType) { + case 'asset': + case 'expense': + return debitTotal - creditTotal; + case 'liability': + case 'equity': + case 'revenue': + return creditTotal - debitTotal; + } + } + + /** + * Generate General Ledger report + */ + public async getGeneralLedger(params?: IReportParams): Promise { + this.logger.log('info', 'Generating general ledger'); + + const accounts = await Account.getInstances({ + skrType: this.skrType, + isActive: true, + }); + + const ledgerEntries = []; + + for (const account of accounts) { + const transactions = await this.getAccountTransactions( + account.accountNumber, + params, + ); + + if (transactions.length > 0) { + let runningBalance = 0; + const accountEntries = []; + + for (const transaction of transactions) { + const isDebit = transaction.debitAccount === account.accountNumber; + const amount = transaction.amount; + + // Update running balance based on account type + if ( + account.accountType === 'asset' || + account.accountType === 'expense' + ) { + runningBalance += isDebit ? amount : -amount; + } else { + runningBalance += isDebit ? -amount : amount; + } + + accountEntries.push({ + date: transaction.date, + reference: transaction.reference, + description: transaction.description, + debit: isDebit ? amount : 0, + credit: !isDebit ? amount : 0, + balance: runningBalance, + }); + } + + ledgerEntries.push({ + accountNumber: account.accountNumber, + accountName: account.accountName, + accountType: account.accountType, + entries: accountEntries, + finalBalance: runningBalance, + }); + } + } + + return { + date: params?.dateTo || new Date(), + skrType: this.skrType, + accounts: ledgerEntries, + }; + } + + /** + * Get account transactions for reporting + */ + private async getAccountTransactions( + accountNumber: string, + params?: IReportParams, + ): Promise { + let transactions = await Transaction.getTransactionsByAccount( + accountNumber, + this.skrType, + ); + + // Apply date filter + if (params?.dateFrom || params?.dateTo) { + transactions = transactions.filter((transaction) => { + if (params.dateFrom && transaction.date < params.dateFrom) return false; + if (params.dateTo && transaction.date > params.dateTo) return false; + return true; + }); + } + + // Sort by date + transactions.sort((a, b) => a.date.getTime() - b.date.getTime()); + + return transactions; + } + + /** + * Generate Cash Flow Statement + */ + public async getCashFlowStatement(params?: IReportParams): Promise { + this.logger.log('info', 'Generating cash flow statement'); + + // Get cash and bank accounts + const cashAccounts = ['1000', '1100', '1200', '1210']; // Standard cash/bank accounts + + let operatingCashFlow = 0; + let investingCashFlow = 0; + let financingCashFlow = 0; + + for (const accountNumber of cashAccounts) { + const account = await Account.getAccountByNumber( + accountNumber, + this.skrType, + ); + if (!account) continue; + + const transactions = await this.getAccountTransactions( + accountNumber, + params, + ); + + for (const transaction of transactions) { + const otherAccount = + transaction.debitAccount === accountNumber + ? transaction.creditAccount + : transaction.debitAccount; + + const otherAccountObj = await Account.getAccountByNumber( + otherAccount, + this.skrType, + ); + if (!otherAccountObj) continue; + + const amount = + transaction.debitAccount === accountNumber + ? transaction.amount + : -transaction.amount; + + // Classify cash flow + if ( + otherAccountObj.accountType === 'revenue' || + otherAccountObj.accountType === 'expense' + ) { + operatingCashFlow += amount; + } else if (otherAccountObj.accountClass === 0) { + // Fixed assets + investingCashFlow += amount; + } else if ( + otherAccountObj.accountType === 'liability' || + otherAccountObj.accountType === 'equity' + ) { + financingCashFlow += amount; + } + } + } + + return { + date: params?.dateTo || new Date(), + skrType: this.skrType, + operatingActivities: operatingCashFlow, + investingActivities: investingCashFlow, + financingActivities: financingCashFlow, + netCashFlow: operatingCashFlow + investingCashFlow + financingCashFlow, + }; + } + + /** + * Export report to CSV format + */ + public async exportToCSV( + reportType: 'trial_balance' | 'income_statement' | 'balance_sheet', + params?: IReportParams, + ): Promise { + let csvContent = ''; + + switch (reportType) { + case 'trial_balance': + const trialBalance = await this.getTrialBalance(params); + csvContent = this.trialBalanceToCSV(trialBalance); + break; + + case 'income_statement': + const incomeStatement = await this.getIncomeStatement(params); + csvContent = this.incomeStatementToCSV(incomeStatement); + break; + + case 'balance_sheet': + const balanceSheet = await this.getBalanceSheet(params); + csvContent = this.balanceSheetToCSV(balanceSheet); + break; + } + + return csvContent; + } + + /** + * Convert trial balance to CSV + */ + private trialBalanceToCSV(report: ITrialBalanceReport): string { + const lines: string[] = []; + lines.push('"Account Number";"Account Name";"Debit";"Credit";"Balance"'); + + for (const entry of report.entries) { + lines.push( + `"${entry.accountNumber}";"${entry.accountName}";${entry.debitBalance};${entry.creditBalance};${entry.netBalance}`, + ); + } + + lines.push( + `"TOTAL";"";"${report.totalDebits}";"${report.totalCredits}";"""`, + ); + + return lines.join('\n'); + } + + /** + * Convert income statement to CSV + */ + private incomeStatementToCSV(report: IIncomeStatement): string { + const lines: string[] = []; + lines.push('"Type";"Account Number";"Account Name";"Amount";"Percentage"'); + + lines.push('"REVENUE";"";"";"";""'); + for (const entry of report.revenue) { + lines.push( + `"Revenue";"${entry.accountNumber}";"${entry.accountName}";${entry.amount};${entry.percentage?.toFixed(2)}%`, + ); + } + + lines.push(`"Total Revenue";"";"";"${report.totalRevenue}";"""`); + lines.push('"";"";"";"";""'); + + lines.push('"EXPENSES";"";"";"";""'); + for (const entry of report.expenses) { + lines.push( + `"Expense";"${entry.accountNumber}";"${entry.accountName}";${entry.amount};${entry.percentage?.toFixed(2)}%`, + ); + } + + lines.push(`"Total Expenses";"";"";"${report.totalExpenses}";"""`); + lines.push('"";"";"";"";""'); + lines.push(`"NET INCOME";"";"";"${report.netIncome}";"""`); + + return lines.join('\n'); + } + + /** + * Convert balance sheet to CSV + */ + private balanceSheetToCSV(report: IBalanceSheet): string { + const lines: string[] = []; + lines.push('"Category";"Account Number";"Account Name";"Amount"'); + + lines.push('"ASSETS";"";"";"";'); + lines.push('"Current Assets";"";"";"";'); + for (const entry of report.assets.current) { + lines.push( + `"";"${entry.accountNumber}";"${entry.accountName}";${entry.amount}`, + ); + } + + lines.push('"Fixed Assets";"";"";"";'); + for (const entry of report.assets.fixed) { + lines.push( + `"";"${entry.accountNumber}";"${entry.accountName}";${entry.amount}`, + ); + } + + lines.push(`"Total Assets";"";"";"${report.assets.totalAssets}"`); + lines.push('"";"";"";"";'); + + lines.push('"LIABILITIES";"";"";"";'); + lines.push('"Current Liabilities";"";"";"";'); + for (const entry of report.liabilities.current) { + lines.push( + `"";"${entry.accountNumber}";"${entry.accountName}";${entry.amount}`, + ); + } + + lines.push('"Long-term Liabilities";"";"";"";'); + for (const entry of report.liabilities.longTerm) { + lines.push( + `"";"${entry.accountNumber}";"${entry.accountName}";${entry.amount}`, + ); + } + + lines.push( + `"Total Liabilities";"";"";"${report.liabilities.totalLiabilities}"`, + ); + lines.push('"";"";"";"";'); + + lines.push('"EQUITY";"";"";"";'); + for (const entry of report.equity.entries) { + lines.push( + `"";"${entry.accountNumber}";"${entry.accountName}";${entry.amount}`, + ); + } + + lines.push(`"Total Equity";"";"";"${report.equity.totalEquity}"`); + lines.push('"";"";"";"";'); + lines.push( + `"Total Liabilities + Equity";"";"";"${report.liabilities.totalLiabilities + report.equity.totalEquity}"`, + ); + + return lines.join('\n'); + } + + /** + * Export to DATEV format + */ + public async exportToDATEV(params?: IReportParams): Promise { + // DATEV format is specific to German accounting software + // This is a simplified implementation + const transactions = await Transaction.getInstances({ + skrType: this.skrType, + status: 'posted', + }); + + const lines: string[] = []; + + // DATEV header + lines.push('EXTF;510;21;"Buchungsstapel";1;;;;;;;;;;;;;;'); + + for (const transaction of transactions) { + const date = transaction.date + .toISOString() + .split('T')[0] + .replace(/-/g, ''); + const line = [ + transaction.amount.toFixed(2).replace('.', ','), + 'S', + 'EUR', + '', + '', + transaction.debitAccount, + transaction.creditAccount, + '', + date, + '', + transaction.description.substring(0, 60), + '', + ].join(';'); + + lines.push(line); + } + + return lines.join('\n'); + } +} diff --git a/ts/skr.classes.transaction.ts b/ts/skr.classes.transaction.ts new file mode 100644 index 0000000..1e45227 --- /dev/null +++ b/ts/skr.classes.transaction.ts @@ -0,0 +1,300 @@ +import * as plugins from './plugins.js'; +import { getDbSync } from './skr.database.js'; +import { Account } from './skr.classes.account.js'; +import type { + TSKRType, + TTransactionStatus, + ITransactionData, +} from './skr.types.js'; + +const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata; + +@plugins.smartdata.Collection(() => getDbSync()) +export class Transaction extends SmartDataDbDoc { + @unI() + public id: string; + + @svDb() + @index() + public transactionNumber: string; + + @svDb() + @index() + public date: Date; + + @svDb() + @index() + public debitAccount: string; + + @svDb() + @index() + public creditAccount: string; + + @svDb() + public amount: number; + + @svDb() + @searchable() + public description: string; + + @svDb() + @index() + public reference: string; + + @svDb() + @index() + public skrType: TSKRType; + + @svDb() + public vatAmount: number; + + @svDb() + public costCenter: string; + + @svDb() + @index() + public status: TTransactionStatus; + + @svDb() + public reversalOf: string; + + @svDb() + public reversedBy: string; + + @svDb() + @index() + public period: string; // Format: YYYY-MM + + @svDb() + public fiscalYear: number; + + @svDb() + public createdAt: Date; + + @svDb() + public postedAt: Date; + + @svDb() + public createdBy: string; + + constructor(data?: Partial) { + super(); + + if (data) { + this.id = plugins.smartunique.shortId(); + this.transactionNumber = this.generateTransactionNumber(); + this.date = data.date || new Date(); + this.debitAccount = data.debitAccount || ''; + this.creditAccount = data.creditAccount || ''; + this.amount = data.amount || 0; + this.description = data.description || ''; + this.reference = data.reference || ''; + this.skrType = data.skrType || 'SKR03'; + this.vatAmount = data.vatAmount || 0; + this.costCenter = data.costCenter || ''; + this.status = 'pending'; + this.reversalOf = ''; + this.reversedBy = ''; + + // Set period and fiscal year + const transDate = new Date(this.date); + this.period = `${transDate.getFullYear()}-${String(transDate.getMonth() + 1).padStart(2, '0')}`; + this.fiscalYear = transDate.getFullYear(); + + this.createdAt = new Date(); + this.postedAt = null; + this.createdBy = 'system'; + } + } + + private generateTransactionNumber(): string { + const timestamp = Date.now(); + const random = Math.floor(Math.random() * 1000); + return `TXN-${timestamp}-${random}`; + } + + public static async createTransaction( + data: ITransactionData, + ): Promise { + const transaction = new Transaction(data); + await transaction.validateAndPost(); + return transaction; + } + + public static async getTransactionById( + id: string, + ): Promise { + const transaction = await Transaction.getInstance({ id }); + return transaction; + } + + public static async getTransactionsByAccount( + accountNumber: string, + skrType: TSKRType, + ): Promise { + const transactionsDebit = await Transaction.getInstances({ + debitAccount: accountNumber, + skrType, + status: 'posted', + }); + const transactionsCredit = await Transaction.getInstances({ + creditAccount: accountNumber, + skrType, + status: 'posted', + }); + const transactions = [...transactionsDebit, ...transactionsCredit]; + return transactions; + } + + public static async getTransactionsByPeriod( + period: string, + skrType: TSKRType, + ): Promise { + const transactions = await Transaction.getInstances({ + period, + skrType, + status: 'posted', + }); + return transactions; + } + + public static async getTransactionsByDateRange( + dateFrom: Date, + dateTo: Date, + skrType: TSKRType, + ): Promise { + const allTransactions = await Transaction.getInstances({ + skrType, + status: 'posted', + }); + const transactions = allTransactions.filter( + (t) => t.date >= dateFrom && t.date <= dateTo, + ); + return transactions; + } + + public async validateAndPost(): Promise { + // Validate transaction + await this.validateTransaction(); + + // Update account balances + await this.updateAccountBalances(); + + // Mark as posted + this.status = 'posted'; + this.postedAt = new Date(); + + await this.save(); + } + + private async validateTransaction(): Promise { + // Check if accounts exist + const debitAccount = await Account.getAccountByNumber( + this.debitAccount, + this.skrType, + ); + const creditAccount = await Account.getAccountByNumber( + this.creditAccount, + this.skrType, + ); + + if (!debitAccount) { + throw new Error( + `Debit account ${this.debitAccount} not found for ${this.skrType}`, + ); + } + + if (!creditAccount) { + throw new Error( + `Credit account ${this.creditAccount} not found for ${this.skrType}`, + ); + } + + // Check if accounts are active + if (!debitAccount.isActive) { + throw new Error(`Debit account ${this.debitAccount} is not active`); + } + + if (!creditAccount.isActive) { + throw new Error(`Credit account ${this.creditAccount} is not active`); + } + + // Validate amount + if (this.amount <= 0) { + throw new Error('Transaction amount must be greater than zero'); + } + + // Check for same account + if (this.debitAccount === this.creditAccount) { + throw new Error('Debit and credit accounts cannot be the same'); + } + } + + private async updateAccountBalances(): Promise { + const debitAccount = await Account.getAccountByNumber( + this.debitAccount, + this.skrType, + ); + const creditAccount = await Account.getAccountByNumber( + this.creditAccount, + this.skrType, + ); + + if (debitAccount) { + await debitAccount.updateBalance(this.amount, 0); + } + + if (creditAccount) { + await creditAccount.updateBalance(0, this.amount); + } + } + + public async reverseTransaction(): Promise { + if (this.status !== 'posted') { + throw new Error('Can only reverse posted transactions'); + } + + if (this.reversedBy) { + throw new Error('Transaction has already been reversed'); + } + + // Create reversal transaction + const reversalData: ITransactionData = { + date: new Date(), + debitAccount: this.creditAccount, // Swap accounts + creditAccount: this.debitAccount, // Swap accounts + amount: this.amount, + description: `Reversal of ${this.transactionNumber}: ${this.description}`, + reference: `REV-${this.transactionNumber}`, + skrType: this.skrType, + vatAmount: this.vatAmount, + costCenter: this.costCenter, + }; + + const reversalTransaction = new Transaction(reversalData); + reversalTransaction.reversalOf = this.id; + await reversalTransaction.validateAndPost(); + + // Update original transaction + this.reversedBy = reversalTransaction.id; + this.status = 'reversed'; + await this.save(); + + return reversalTransaction; + } + + public async beforeSave(): Promise { + // Additional validation before saving + if (!this.debitAccount || !this.creditAccount) { + throw new Error('Both debit and credit accounts are required'); + } + + if (!this.date) { + throw new Error('Transaction date is required'); + } + + if (!this.description) { + throw new Error('Transaction description is required'); + } + } +} diff --git a/ts/skr.database.ts b/ts/skr.database.ts new file mode 100644 index 0000000..ffa9428 --- /dev/null +++ b/ts/skr.database.ts @@ -0,0 +1,39 @@ +import * as plugins from './plugins.js'; +import type { IDatabaseConfig } from './skr.types.js'; + +let dbInstance: plugins.smartdata.SmartdataDb | null = null; + +export const getDb = async ( + config?: IDatabaseConfig, +): Promise => { + if (!dbInstance) { + if (!config) { + throw new Error( + 'Database configuration required for first initialization', + ); + } + + dbInstance = new plugins.smartdata.SmartdataDb({ + mongoDbUrl: config.mongoDbUrl, + mongoDbName: config.dbName || 'skr_accounting', + }); + + await dbInstance.init(); + } + + return dbInstance; +}; + +export const getDbSync = (): plugins.smartdata.SmartdataDb => { + if (!dbInstance) { + throw new Error('Database not initialized. Call getDb() first.'); + } + return dbInstance; +}; + +export const closeDb = async (): Promise => { + if (dbInstance) { + await dbInstance.close(); + dbInstance = null; + } +}; diff --git a/ts/skr.types.ts b/ts/skr.types.ts new file mode 100644 index 0000000..46a0033 --- /dev/null +++ b/ts/skr.types.ts @@ -0,0 +1,154 @@ +export type TAccountType = + | 'asset' + | 'liability' + | 'equity' + | 'revenue' + | 'expense'; + +export type TSKRType = 'SKR03' | 'SKR04'; + +export type TTransactionStatus = 'pending' | 'posted' | 'reversed'; + +export type TReportType = + | 'trial_balance' + | 'income_statement' + | 'balance_sheet' + | 'general_ledger' + | 'cash_flow'; + +export interface IAccountData { + accountNumber: string; + accountName: string; + accountClass: number; + accountType: TAccountType; + skrType: TSKRType; + description?: string; + vatRate?: number; + isActive?: boolean; +} + +export interface ITransactionData { + date: Date; + debitAccount: string; + creditAccount: string; + amount: number; + description: string; + reference?: string; + skrType: TSKRType; + vatAmount?: number; + costCenter?: string; +} + +export interface IJournalEntry { + date: Date; + description: string; + reference?: string; + lines: IJournalEntryLine[]; + skrType: TSKRType; +} + +export interface IJournalEntryLine { + accountNumber: string; + debit?: number; + credit?: number; + description?: string; + costCenter?: string; +} + +export interface ITrialBalanceEntry { + accountNumber: string; + accountName: string; + debitBalance: number; + creditBalance: number; + netBalance: number; +} + +export interface ITrialBalanceReport { + date: Date; + skrType: TSKRType; + entries: ITrialBalanceEntry[]; + totalDebits: number; + totalCredits: number; + isBalanced: boolean; +} + +export interface IIncomeStatementEntry { + accountNumber: string; + accountName: string; + amount: number; + percentage?: number; +} + +export interface IIncomeStatement { + date: Date; + skrType: TSKRType; + revenue: IIncomeStatementEntry[]; + expenses: IIncomeStatementEntry[]; + totalRevenue: number; + totalExpenses: number; + netIncome: number; +} + +export interface IBalanceSheetEntry { + accountNumber: string; + accountName: string; + amount: number; +} + +export interface IBalanceSheet { + date: Date; + skrType: TSKRType; + assets: { + current: IBalanceSheetEntry[]; + fixed: IBalanceSheetEntry[]; + totalAssets: number; + }; + liabilities: { + current: IBalanceSheetEntry[]; + longTerm: IBalanceSheetEntry[]; + totalLiabilities: number; + }; + equity: { + entries: IBalanceSheetEntry[]; + totalEquity: number; + }; + isBalanced: boolean; +} + +export interface IAccountFilter { + skrType?: TSKRType; + accountClass?: number; + accountType?: TAccountType; + isActive?: boolean; + searchTerm?: string; +} + +export interface ITransactionFilter { + skrType?: TSKRType; + dateFrom?: Date; + dateTo?: Date; + accountNumber?: string; + minAmount?: number; + maxAmount?: number; + searchTerm?: string; +} + +export interface IDatabaseConfig { + mongoDbUrl: string; + dbName?: string; +} + +export interface IReportParams { + dateFrom?: Date; + dateTo?: Date; + skrType: TSKRType; + format?: 'json' | 'csv' | 'datev'; +} + +export interface IAccountBalance { + accountNumber: string; + debitTotal: number; + creditTotal: number; + balance: number; + lastUpdated: Date; +} diff --git a/ts/skr03.data.ts b/ts/skr03.data.ts new file mode 100644 index 0000000..e985ab1 --- /dev/null +++ b/ts/skr03.data.ts @@ -0,0 +1,901 @@ +import type { IAccountData } from './skr.types.js'; + +/** + * SKR03 - Process Structure Principle (Prozessgliederungsprinzip) + * Organized by business process flow + */ +export const SKR03_ACCOUNTS: IAccountData[] = [ + // Class 0: Capital Accounts (Anlagekonten) + { + accountNumber: '0001', + accountName: 'Aufwendungen für Ingangsetzung', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Start-up expenses', + }, + { + accountNumber: '0010', + accountName: 'Konzessionen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Concessions', + }, + { + accountNumber: '0020', + accountName: 'Patente', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Patents', + }, + { + accountNumber: '0030', + accountName: 'Lizenzen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Licenses', + }, + { + accountNumber: '0050', + accountName: 'Firmenwert', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Goodwill', + }, + { + accountNumber: '0100', + accountName: 'EDV-Software', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'IT Software', + }, + { + accountNumber: '0200', + accountName: 'Grundstücke', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Land and property', + }, + { + accountNumber: '0210', + accountName: 'Gebäude', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Buildings', + }, + { + accountNumber: '0300', + accountName: 'Maschinen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Machinery', + }, + { + accountNumber: '0400', + accountName: 'Fuhrpark', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Vehicles', + }, + { + accountNumber: '0500', + accountName: 'Betriebs- und Geschäftsausstattung', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Office equipment', + }, + { + accountNumber: '0600', + accountName: 'Geleistete Anzahlungen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Prepayments on fixed assets', + }, + { + accountNumber: '0800', + accountName: 'Finanzanlagen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR03', + description: 'Financial assets', + }, + + // Class 1: Current Assets (Umlaufvermögen) + { + accountNumber: '1000', + accountName: 'Kasse', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Cash on hand', + }, + { + accountNumber: '1100', + accountName: 'Postbank', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Postal bank account', + }, + { + accountNumber: '1200', + accountName: 'Bank', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Bank account', + }, + { + accountNumber: '1210', + accountName: 'Sparkasse', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Savings bank', + }, + { + accountNumber: '1300', + accountName: 'Wertpapiere', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Securities', + }, + { + accountNumber: '1400', + accountName: 'Forderungen aus Lieferungen und Leistungen', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Trade receivables', + }, + { + accountNumber: '1500', + accountName: 'Sonstige Vermögensgegenstände', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Other assets', + }, + { + accountNumber: '1520', + accountName: 'Abziehbare Vorsteuer', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Input VAT', + }, + { + accountNumber: '1570', + accountName: 'Vorsteuer 7%', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Input VAT 7%', + }, + { + accountNumber: '1571', + accountName: 'Vorsteuer 19%', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Input VAT 19%', + }, + { + accountNumber: '1600', + accountName: 'Verbindlichkeiten aus Lieferungen und Leistungen', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR03', + description: 'Trade payables', + }, + { + accountNumber: '1700', + accountName: 'Sonstige Verbindlichkeiten', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR03', + description: 'Other liabilities', + }, + { + accountNumber: '1770', + accountName: 'Umsatzsteuer 7%', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR03', + description: 'VAT payable 7%', + }, + { + accountNumber: '1771', + accountName: 'Umsatzsteuer 19%', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR03', + description: 'VAT payable 19%', + }, + { + accountNumber: '1800', + accountName: 'Privatentnahmen', + accountClass: 1, + accountType: 'equity', + skrType: 'SKR03', + description: 'Private withdrawals', + }, + { + accountNumber: '1810', + accountName: 'Privateinlagen', + accountClass: 1, + accountType: 'equity', + skrType: 'SKR03', + description: 'Private deposits', + }, + { + accountNumber: '1900', + accountName: 'Verrechnungskonto', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR03', + description: 'Clearing account', + }, + + // Class 2: Equity (Eigenkapital) + { + accountNumber: '2000', + accountName: 'Eigenkapital', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Equity capital', + }, + { + accountNumber: '2100', + accountName: 'Gezeichnetes Kapital', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Subscribed capital', + }, + { + accountNumber: '2200', + accountName: 'Kapitalrücklage', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Capital reserves', + }, + { + accountNumber: '2300', + accountName: 'Gewinnrücklagen', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Revenue reserves', + }, + { + accountNumber: '2400', + accountName: 'Gewinnvortrag', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Profit carried forward', + }, + { + accountNumber: '2500', + accountName: 'Verlustvortrag', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Loss carried forward', + }, + { + accountNumber: '2600', + accountName: 'Jahresüberschuss', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Annual surplus', + }, + { + accountNumber: '2700', + accountName: 'Jahresfehlbetrag', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Annual deficit', + }, + { + accountNumber: '2900', + accountName: 'Sonderposten mit Rücklageanteil', + accountClass: 2, + accountType: 'equity', + skrType: 'SKR03', + description: 'Special items with reserve portion', + }, + + // Class 3: Provisions and Liabilities (Rückstellungen und Verbindlichkeiten) + { + accountNumber: '3000', + accountName: 'Rückstellungen für Pensionen', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Pension provisions', + }, + { + accountNumber: '3100', + accountName: 'Steuerrückstellungen', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Tax provisions', + }, + { + accountNumber: '3200', + accountName: 'Sonstige Rückstellungen', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Other provisions', + }, + { + accountNumber: '3300', + accountName: 'Verbindlichkeiten gegenüber Kreditinstituten', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Bank loans', + }, + { + accountNumber: '3400', + accountName: 'Erhaltene Anzahlungen', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Advance payments received', + }, + { + accountNumber: '3500', + accountName: 'Verbindlichkeiten aus Steuern', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Tax liabilities', + }, + { + accountNumber: '3600', + accountName: 'Verbindlichkeiten im Rahmen der sozialen Sicherheit', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Social security liabilities', + }, + { + accountNumber: '3700', + accountName: 'Sonstige Verbindlichkeiten', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Other liabilities', + }, + { + accountNumber: '3900', + accountName: 'Passive Rechnungsabgrenzung', + accountClass: 3, + accountType: 'liability', + skrType: 'SKR03', + description: 'Deferred income', + }, + + // Class 4: Operating Income (Betriebliche Erträge) + { + accountNumber: '4000', + accountName: 'Umsatzerlöse', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Sales revenue', + vatRate: 19, + }, + { + accountNumber: '4100', + accountName: 'steuerfreie Umsätze', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Tax-free sales', + }, + { + accountNumber: '4200', + accountName: 'Erlöse 7% USt', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Revenue 7% VAT', + vatRate: 7, + }, + { + accountNumber: '4300', + accountName: 'Erlöse 19% USt', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Revenue 19% VAT', + vatRate: 19, + }, + { + accountNumber: '4400', + accountName: 'Erlöse innergemeinschaftliche Lieferungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'EU sales', + }, + { + accountNumber: '4500', + accountName: 'Erlöse Export', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Export sales', + }, + { + accountNumber: '4600', + accountName: 'Bestandsveränderungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Inventory changes', + }, + { + accountNumber: '4700', + accountName: 'Aktivierte Eigenleistungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Capitalized own work', + }, + { + accountNumber: '4800', + accountName: 'Sonstige betriebliche Erträge', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Other operating income', + }, + { + accountNumber: '4900', + accountName: 'Erträge aus Beteiligungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Investment income', + }, + + // Class 5: Material Costs (Materialkosten) + { + accountNumber: '5000', + accountName: 'Aufwendungen für Roh-, Hilfs- und Betriebsstoffe', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Raw materials and supplies', + }, + { + accountNumber: '5100', + accountName: 'Einkauf Waren', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Purchase of goods', + }, + { + accountNumber: '5200', + accountName: 'Wareneingang 7% Vorsteuer', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Goods receipt 7% input tax', + vatRate: 7, + }, + { + accountNumber: '5400', + accountName: 'Wareneingang 19% Vorsteuer', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Goods receipt 19% input tax', + vatRate: 19, + }, + { + accountNumber: '5500', + accountName: 'Aufwendungen für bezogene Leistungen', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Purchased services', + }, + { + accountNumber: '5600', + accountName: 'Aufwendungen für Energie', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Energy costs', + }, + { + accountNumber: '5700', + accountName: 'Reisekosten', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Travel expenses', + }, + { + accountNumber: '5800', + accountName: 'Bewirtungskosten', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'Entertainment expenses', + }, + { + accountNumber: '5900', + accountName: 'Fremdleistungen', + accountClass: 5, + accountType: 'expense', + skrType: 'SKR03', + description: 'External services', + }, + + // Class 6: Personnel Costs (Personalkosten) + { + accountNumber: '6000', + accountName: 'Löhne und Gehälter', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Wages and salaries', + }, + { + accountNumber: '6100', + accountName: 'Soziale Abgaben', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Social security contributions', + }, + { + accountNumber: '6200', + accountName: 'Aufwendungen für Altersversorgung', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Pension expenses', + }, + { + accountNumber: '6300', + accountName: 'Sonstige soziale Aufwendungen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Other social expenses', + }, + { + accountNumber: '6400', + accountName: 'Versicherungen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Insurance', + }, + { + accountNumber: '6500', + accountName: 'Berufsgenossenschaft', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Occupational insurance', + }, + { + accountNumber: '6600', + accountName: 'Vermögenswirksame Leistungen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Employee savings schemes', + }, + { + accountNumber: '6700', + accountName: 'Aufwendungen für Fortbildung', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Training expenses', + }, + { + accountNumber: '6800', + accountName: 'Aushilfslöhne', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Temporary staff wages', + }, + { + accountNumber: '6900', + accountName: 'Aufwendungen für freie Mitarbeiter', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR03', + description: 'Freelancer expenses', + }, + + // Class 7: Other Operating Expenses (Sonstige betriebliche Aufwendungen) + { + accountNumber: '7000', + accountName: 'Abschreibungen', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Depreciation', + }, + { + accountNumber: '7100', + accountName: 'Raumkosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Rent and lease', + }, + { + accountNumber: '7200', + accountName: 'Instandhaltung', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Maintenance', + }, + { + accountNumber: '7300', + accountName: 'Versicherungen', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Insurance', + }, + { + accountNumber: '7400', + accountName: 'Fahrzeugkosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Vehicle expenses', + }, + { + accountNumber: '7500', + accountName: 'Werbe- und Reisekosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Marketing and travel', + }, + { + accountNumber: '7600', + accountName: 'Kosten der Warenabgabe', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Distribution costs', + }, + { + accountNumber: '7700', + accountName: 'Verschiedene betriebliche Kosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Miscellaneous operating costs', + }, + { + accountNumber: '7800', + accountName: 'Steuern vom Einkommen und Ertrag', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Income taxes', + }, + { + accountNumber: '7900', + accountName: 'Sonstige Steuern', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR03', + description: 'Other taxes', + }, + + // Class 8: Financial Accounts (Finanzkonten) + { + accountNumber: '8000', + accountName: 'Erlöse aus Anlagenabgängen', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Gains from asset disposals', + }, + { + accountNumber: '8100', + accountName: 'Sonstige Zinsen und ähnliche Erträge', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Interest income', + }, + { + accountNumber: '8200', + accountName: 'Erträge aus Beteiligungen', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Investment income', + }, + { + accountNumber: '8300', + accountName: 'Zinsen und ähnliche Aufwendungen', + accountClass: 8, + accountType: 'expense', + skrType: 'SKR03', + description: 'Interest expense', + }, + { + accountNumber: '8400', + accountName: 'Sonstige Erträge', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Other income', + }, + { + accountNumber: '8500', + accountName: 'Sonstige Aufwendungen', + accountClass: 8, + accountType: 'expense', + skrType: 'SKR03', + description: 'Other expenses', + }, + { + accountNumber: '8600', + accountName: 'Außerordentliche Erträge', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Extraordinary income', + }, + { + accountNumber: '8700', + accountName: 'Außerordentliche Aufwendungen', + accountClass: 8, + accountType: 'expense', + skrType: 'SKR03', + description: 'Extraordinary expenses', + }, + { + accountNumber: '8800', + accountName: 'Erträge aus Verlustübernahme', + accountClass: 8, + accountType: 'revenue', + skrType: 'SKR03', + description: 'Income from loss absorption', + }, + { + accountNumber: '8900', + accountName: 'Aufgrund von Gewinnabführung abgeführte Gewinne', + accountClass: 8, + accountType: 'expense', + skrType: 'SKR03', + description: 'Profits transferred', + }, + + // Class 9: Closing Accounts (Abschlusskonten) + { + accountNumber: '9000', + accountName: 'Saldenvorträge', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Opening balances', + }, + { + accountNumber: '9100', + accountName: 'Summenvortrag', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Total carried forward', + }, + { + accountNumber: '9200', + accountName: 'Eröffnungsbilanzkonto', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Opening balance sheet account', + }, + { + accountNumber: '9300', + accountName: 'Schlussbilanzkonto', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Closing balance sheet account', + }, + { + accountNumber: '9400', + accountName: 'Gewinn- und Verlustkonto', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Profit and loss account', + }, + { + accountNumber: '9500', + accountName: 'Kapitalkonto', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Capital account', + }, + { + accountNumber: '9600', + accountName: 'Privatkonto', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Private account', + }, + { + accountNumber: '9700', + accountName: 'Eigenverbrauch', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Personal consumption', + }, + { + accountNumber: '9800', + accountName: 'Statistische Konten', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Statistical accounts', + }, + { + accountNumber: '9900', + accountName: 'Verrechnungskonten', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR03', + description: 'Clearing accounts', + }, +]; + +export const SKR03_ACCOUNT_CLASSES = { + 0: 'Anlagekonten (Fixed Assets)', + 1: 'Umlaufvermögen (Current Assets)', + 2: 'Eigenkapital (Equity)', + 3: 'Rückstellungen und Verbindlichkeiten (Provisions and Liabilities)', + 4: 'Betriebliche Erträge (Operating Income)', + 5: 'Materialkosten (Material Costs)', + 6: 'Personalkosten (Personnel Costs)', + 7: 'Sonstige betriebliche Aufwendungen (Other Operating Expenses)', + 8: 'Finanzkonten (Financial Accounts)', + 9: 'Abschlusskonten (Closing Accounts)', +}; diff --git a/ts/skr04.data.ts b/ts/skr04.data.ts new file mode 100644 index 0000000..970825c --- /dev/null +++ b/ts/skr04.data.ts @@ -0,0 +1,923 @@ +import type { IAccountData } from './skr.types.js'; + +/** + * SKR04 - Financial Classification Principle (Abschlussgliederungsprinzip) + * Organized by financial statement structure + */ +export const SKR04_ACCOUNTS: IAccountData[] = [ + // Class 0: Capital Accounts (Anlagekonten) + { + accountNumber: '0001', + accountName: 'Aufwendungen für Ingangsetzung', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Start-up expenses', + }, + { + accountNumber: '0010', + accountName: 'Konzessionen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Concessions', + }, + { + accountNumber: '0020', + accountName: 'Patente', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Patents', + }, + { + accountNumber: '0030', + accountName: 'Lizenzen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Licenses', + }, + { + accountNumber: '0050', + accountName: 'Firmenwert', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Goodwill', + }, + { + accountNumber: '0100', + accountName: 'EDV-Software', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'IT Software', + }, + { + accountNumber: '0200', + accountName: 'Grundstücke', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Land and property', + }, + { + accountNumber: '0210', + accountName: 'Gebäude', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Buildings', + }, + { + accountNumber: '0300', + accountName: 'Maschinen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Machinery', + }, + { + accountNumber: '0400', + accountName: 'Fuhrpark', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Vehicles', + }, + { + accountNumber: '0500', + accountName: 'Betriebs- und Geschäftsausstattung', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Office equipment', + }, + { + accountNumber: '0600', + accountName: 'Geleistete Anzahlungen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Prepayments on fixed assets', + }, + { + accountNumber: '0800', + accountName: 'Finanzanlagen', + accountClass: 0, + accountType: 'asset', + skrType: 'SKR04', + description: 'Financial assets', + }, + + // Class 1: Financial and Current Assets (Finanz- und Umlaufvermögen) + { + accountNumber: '1000', + accountName: 'Kasse', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Cash on hand', + }, + { + accountNumber: '1100', + accountName: 'Postbank', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Postal bank account', + }, + { + accountNumber: '1200', + accountName: 'Bank', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Bank account', + }, + { + accountNumber: '1210', + accountName: 'Sparkasse', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Savings bank', + }, + { + accountNumber: '1300', + accountName: 'Wertpapiere', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Securities', + }, + { + accountNumber: '1400', + accountName: 'Forderungen aus Lieferungen und Leistungen', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Trade receivables', + }, + { + accountNumber: '1500', + accountName: 'Sonstige Vermögensgegenstände', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Other assets', + }, + { + accountNumber: '1520', + accountName: 'Abziehbare Vorsteuer', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Input VAT', + }, + { + accountNumber: '1570', + accountName: 'Vorsteuer 7%', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Input VAT 7%', + }, + { + accountNumber: '1571', + accountName: 'Vorsteuer 19%', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Input VAT 19%', + }, + { + accountNumber: '1600', + accountName: 'Verbindlichkeiten aus Lieferungen und Leistungen', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR04', + description: 'Trade payables', + }, + { + accountNumber: '1700', + accountName: 'Sonstige Verbindlichkeiten', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR04', + description: 'Other liabilities', + }, + { + accountNumber: '1770', + accountName: 'Umsatzsteuer 7%', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR04', + description: 'VAT payable 7%', + }, + { + accountNumber: '1771', + accountName: 'Umsatzsteuer 19%', + accountClass: 1, + accountType: 'liability', + skrType: 'SKR04', + description: 'VAT payable 19%', + }, + { + accountNumber: '1800', + accountName: 'Privatentnahmen', + accountClass: 1, + accountType: 'equity', + skrType: 'SKR04', + description: 'Private withdrawals', + }, + { + accountNumber: '1810', + accountName: 'Privateinlagen', + accountClass: 1, + accountType: 'equity', + skrType: 'SKR04', + description: 'Private deposits', + }, + { + accountNumber: '1900', + accountName: 'Verrechnungskonto', + accountClass: 1, + accountType: 'asset', + skrType: 'SKR04', + description: 'Clearing account', + }, + + // Class 2: Expenses (Aufwendungen) - Part 1 + { + accountNumber: '2000', + accountName: 'Roh-, Hilfs- und Betriebsstoffe', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Raw materials and supplies', + }, + { + accountNumber: '2100', + accountName: 'Bezogene Waren', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Purchased goods', + }, + { + accountNumber: '2200', + accountName: 'Bezogene Leistungen', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Purchased services', + }, + { + accountNumber: '2300', + accountName: 'Löhne', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Wages', + }, + { + accountNumber: '2400', + accountName: 'Gehälter', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Salaries', + }, + { + accountNumber: '2500', + accountName: 'Soziale Abgaben', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Social security contributions', + }, + { + accountNumber: '2600', + accountName: 'Aufwendungen für Altersversorgung', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Pension expenses', + }, + { + accountNumber: '2700', + accountName: 'Abschreibungen auf immaterielle Vermögensgegenstände', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Depreciation on intangible assets', + }, + { + accountNumber: '2800', + accountName: 'Abschreibungen auf Sachanlagen', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Depreciation on fixed assets', + }, + { + accountNumber: '2900', + accountName: 'Abschreibungen auf Finanzanlagen', + accountClass: 2, + accountType: 'expense', + skrType: 'SKR04', + description: 'Depreciation on financial assets', + }, + + // Class 3: Expenses (Aufwendungen) - Part 2 + { + accountNumber: '3000', + accountName: 'Raumkosten', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Rent and lease', + }, + { + accountNumber: '3100', + accountName: 'Sonstige Raumkosten', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Other occupancy costs', + }, + { + accountNumber: '3200', + accountName: 'Instandhaltung', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Maintenance', + }, + { + accountNumber: '3300', + accountName: 'Fahrzeugkosten', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Vehicle expenses', + }, + { + accountNumber: '3400', + accountName: 'Werbe- und Reisekosten', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Marketing and travel', + }, + { + accountNumber: '3500', + accountName: 'Bewirtungskosten', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Entertainment expenses', + }, + { + accountNumber: '3600', + accountName: 'Versicherungen', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Insurance', + }, + { + accountNumber: '3700', + accountName: 'Beiträge und Gebühren', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Fees and subscriptions', + }, + { + accountNumber: '3800', + accountName: 'Büromaterial', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Office supplies', + }, + { + accountNumber: '3900', + accountName: 'Sonstige Aufwendungen', + accountClass: 3, + accountType: 'expense', + skrType: 'SKR04', + description: 'Other expenses', + }, + + // Class 4: Revenues (Erträge) - Part 1 + { + accountNumber: '4000', + accountName: 'Umsatzerlöse', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Sales revenue', + vatRate: 19, + }, + { + accountNumber: '4100', + accountName: 'steuerfreie Umsätze', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Tax-free sales', + }, + { + accountNumber: '4200', + accountName: 'Erlöse 7% USt', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Revenue 7% VAT', + vatRate: 7, + }, + { + accountNumber: '4300', + accountName: 'Erlöse 19% USt', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Revenue 19% VAT', + vatRate: 19, + }, + { + accountNumber: '4400', + accountName: 'Erlöse innergemeinschaftliche Lieferungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'EU sales', + }, + { + accountNumber: '4500', + accountName: 'Erlöse Export', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Export sales', + }, + { + accountNumber: '4600', + accountName: 'Bestandsveränderungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Inventory changes', + }, + { + accountNumber: '4700', + accountName: 'Aktivierte Eigenleistungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Capitalized own work', + }, + { + accountNumber: '4800', + accountName: 'Sonstige betriebliche Erträge', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Other operating income', + }, + { + accountNumber: '4900', + accountName: 'Erträge aus Beteiligungen', + accountClass: 4, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Investment income', + }, + + // Class 5: Revenues (Erträge) - Part 2 + { + accountNumber: '5000', + accountName: 'Zinserträge', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Interest income', + }, + { + accountNumber: '5100', + accountName: 'Erträge aus Wertpapieren', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Securities income', + }, + { + accountNumber: '5200', + accountName: 'Erträge aus Anlagenabgängen', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Gains from asset disposals', + }, + { + accountNumber: '5300', + accountName: 'Währungsgewinne', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Currency gains', + }, + { + accountNumber: '5400', + accountName: 'Erträge aus der Auflösung von Rückstellungen', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Income from provision releases', + }, + { + accountNumber: '5500', + accountName: 'Periodenfremde Erträge', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Prior period income', + }, + { + accountNumber: '5600', + accountName: 'Außerordentliche Erträge', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Extraordinary income', + }, + { + accountNumber: '5700', + accountName: 'Verwendung von Rücklagen', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Use of reserves', + }, + { + accountNumber: '5800', + accountName: 'Gewinne aus Unternehmensverträgen', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Profits from company agreements', + }, + { + accountNumber: '5900', + accountName: 'Sonstige Erträge', + accountClass: 5, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Other income', + }, + + // Class 6: Special Accounts (Sonderkonten) + { + accountNumber: '6000', + accountName: 'Betriebssteuern', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Operating taxes', + }, + { + accountNumber: '6100', + accountName: 'Vermögensteuer', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Wealth tax', + }, + { + accountNumber: '6200', + accountName: 'Körperschaftsteuer', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Corporate tax', + }, + { + accountNumber: '6300', + accountName: 'Einkommensteuer', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Income tax', + }, + { + accountNumber: '6400', + accountName: 'Gewerbesteuer', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Trade tax', + }, + { + accountNumber: '6500', + accountName: 'Sonstige Steuern', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Other taxes', + }, + { + accountNumber: '6600', + accountName: 'Zinsaufwendungen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Interest expense', + }, + { + accountNumber: '6700', + accountName: 'Währungsverluste', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Currency losses', + }, + { + accountNumber: '6800', + accountName: 'Außerordentliche Aufwendungen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Extraordinary expenses', + }, + { + accountNumber: '6900', + accountName: 'Verluste aus Unternehmensverträgen', + accountClass: 6, + accountType: 'expense', + skrType: 'SKR04', + description: 'Losses from company agreements', + }, + + // Class 7: Cost Accounting (Kosten- und Leistungsrechnung) + { + accountNumber: '7000', + accountName: 'Kostenstellenrechnung', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Cost center accounting', + }, + { + accountNumber: '7100', + accountName: 'Kostenträgerrechnung', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Cost object accounting', + }, + { + accountNumber: '7200', + accountName: 'Kostenartenrechnung', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Cost type accounting', + }, + { + accountNumber: '7300', + accountName: 'Kalkulatorische Kosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Imputed costs', + }, + { + accountNumber: '7400', + accountName: 'Kalkulatorische Abschreibungen', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Imputed depreciation', + }, + { + accountNumber: '7500', + accountName: 'Kalkulatorische Zinsen', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Imputed interest', + }, + { + accountNumber: '7600', + accountName: 'Kalkulatorischer Unternehmerlohn', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Imputed entrepreneur salary', + }, + { + accountNumber: '7700', + accountName: 'Kalkulatorische Miete', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Imputed rent', + }, + { + accountNumber: '7800', + accountName: 'Verrechnete Kosten', + accountClass: 7, + accountType: 'expense', + skrType: 'SKR04', + description: 'Allocated costs', + }, + { + accountNumber: '7900', + accountName: 'Verrechnete Leistungen', + accountClass: 7, + accountType: 'revenue', + skrType: 'SKR04', + description: 'Allocated services', + }, + + // Class 8: Free for Use (Zur freien Verfügung) + { + accountNumber: '8000', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8100', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8200', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8300', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8400', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8500', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8600', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8700', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8800', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + { + accountNumber: '8900', + accountName: 'frei', + accountClass: 8, + accountType: 'equity', + skrType: 'SKR04', + description: 'Available for custom use', + }, + + // Class 9: Equity and Closing Accounts (Eigenkapital und Abschlusskonten) + { + accountNumber: '9000', + accountName: 'Eigenkapital', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Equity capital', + }, + { + accountNumber: '9100', + accountName: 'Gezeichnetes Kapital', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Subscribed capital', + }, + { + accountNumber: '9200', + accountName: 'Kapitalrücklage', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Capital reserves', + }, + { + accountNumber: '9300', + accountName: 'Gewinnrücklagen', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Revenue reserves', + }, + { + accountNumber: '9400', + accountName: 'Gewinnvortrag/Verlustvortrag', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Profit/loss carried forward', + }, + { + accountNumber: '9500', + accountName: 'Jahresüberschuss/Jahresfehlbetrag', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Annual profit/loss', + }, + { + accountNumber: '9600', + accountName: 'Rückstellungen', + accountClass: 9, + accountType: 'liability', + skrType: 'SKR04', + description: 'Provisions', + }, + { + accountNumber: '9700', + accountName: 'Verbindlichkeiten', + accountClass: 9, + accountType: 'liability', + skrType: 'SKR04', + description: 'Liabilities', + }, + { + accountNumber: '9800', + accountName: 'Rechnungsabgrenzungsposten', + accountClass: 9, + accountType: 'liability', + skrType: 'SKR04', + description: 'Accruals and deferrals', + }, + { + accountNumber: '9900', + accountName: 'Statistische Konten', + accountClass: 9, + accountType: 'equity', + skrType: 'SKR04', + description: 'Statistical accounts', + }, +]; + +export const SKR04_ACCOUNT_CLASSES = { + 0: 'Anlagekonten (Fixed Assets)', + 1: 'Finanz- und Umlaufvermögen (Financial and Current Assets)', + 2: 'Aufwendungen Teil 1 (Expenses Part 1)', + 3: 'Aufwendungen Teil 2 (Expenses Part 2)', + 4: 'Erträge Teil 1 (Revenues Part 1)', + 5: 'Erträge Teil 2 (Revenues Part 2)', + 6: 'Sonderkonten (Special Accounts)', + 7: 'Kosten- und Leistungsrechnung (Cost Accounting)', + 8: 'Zur freien Verfügung (Free for Use)', + 9: 'Eigenkapital und Abschlusskonten (Equity and Closing Accounts)', +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..75d85bc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "useDefineForClassFields": false, + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "baseUrl": ".", + "paths": {} + }, + "exclude": ["dist_*/**/*.d.ts"] +}