diff --git a/.gitignore b/.gitignore index 1284b6e..a9f21f2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,15 +4,14 @@ node_modules/ # Build outputs dist/ -ui/dist/ -.angular/ -out-tsc/ # tsdeno temporary files package.json.bak # Generated files ts/embedded-ui.generated.ts +ts_bundled/ +dist_ts_web/ # Deno .deno/ @@ -64,8 +63,5 @@ stories/ package-lock.json yarn.lock -# Angular cache -.angular/cache/ - # TypeScript incremental compilation *.tsbuildinfo diff --git a/changelog.md b/changelog.md index 4082dd9..565d97e 100644 --- a/changelog.md +++ b/changelog.md @@ -1,72 +1,121 @@ # Changelog +## 2026-03-20 - 1.5.0 - feat(opsserver,web) +replace the Angular UI and REST management layer with a TypedRequest-based ops server and bundled web frontend + +- add a new OpsServer with TypedRequest handlers for auth, organizations, repositories, packages, tokens, audit, admin, OAuth, and user settings flows +- introduce shared TypedRequest contracts under ts_interfaces and wire the registry to serve POST /typedrequest requests +- replace the embedded Angular build pipeline with tsbundle/tswatch-based web bundling, static html entrypoint, and new ts_web app state and shell views +- remove the legacy Angular frontend, custom UI bundler script, reload websocket hot-reload path, and related build configuration + ## 2026-03-20 - 1.4.2 - fix(registry) + align registry integrations with updated auth, storage, repository, and audit models -- update smartregistry auth and storage provider implementations to match the current request, token, and storage hook APIs -- fix audit events for auth provider, platform settings, and external authentication flows to use dedicated event types -- adapt repository, organization, user, and package handlers to renamed model fields and revised repository visibility/protocol data -- add missing repository and team model fields plus helper methods needed by the updated API and permission flows +- update smartregistry auth and storage provider implementations to match the current request, + token, and storage hook APIs +- fix audit events for auth provider, platform settings, and external authentication flows to use + dedicated event types +- adapt repository, organization, user, and package handlers to renamed model fields and revised + repository visibility/protocol data +- add missing repository and team model fields plus helper methods needed by the updated API and + permission flows - correct AES-GCM crypto buffer handling and package version checksum mapping ## 2026-03-20 - 1.4.1 - fix(repo) + no changes to commit - ## 2026-03-20 - 1.4.0 - feat(release,build,tests) + add automated multi-platform release pipeline and align runtime, model, and test updates -- add a Gitea release workflow that builds the UI, bundles embedded assets, cross-compiles binaries for Linux and macOS, generates checksums, and publishes release assets from version tags -- switch compilation to tsdeno with compile targets defined in npmextra.json and simplify project scripts for check, lint, format, and compile tasks +- add a Gitea release workflow that builds the UI, bundles embedded assets, cross-compiles binaries + for Linux and macOS, generates checksums, and publishes release assets from version tags +- switch compilation to tsdeno with compile targets defined in npmextra.json and simplify project + scripts for check, lint, format, and compile tasks - improve CLI startup error handling in mod.ts and guard execution with import.meta.main -- update test configuration to load MongoDB and S3 settings from qenv-based environment files and adjust tests for renamed model and token APIs -- rename package search usage to searchPackages, update audit event names, and align package version fields and model name overrides with newer dependency behavior +- update test configuration to load MongoDB and S3 settings from qenv-based environment files and + adjust tests for renamed model and token APIs +- rename package search usage to searchPackages, update audit event names, and align package version + fields and model name overrides with newer dependency behavior ## 2025-12-03 - 1.3.0 - feat(auth) + Add external authentication (OAuth/OIDC & LDAP) with admin management, UI, and encryption support -- Introduce external authentication models: AuthProvider, ExternalIdentity, PlatformSettings to store provider configs, links, and platform auth settings -- Add AuthProvider admin API (AdminAuthApi) to create/update/delete/test providers and manage platform auth settings -- Add public OAuth endpoints (OAuthApi) for listing providers, initiating OAuth flows, handling callbacks, and LDAP login -- Implement ExternalAuthService to orchestrate OAuth and LDAP flows, user provisioning, linking, session/token generation, and provider testing -- Add pluggable auth strategy pattern with OAuthStrategy and LdapStrategy plus AuthStrategyFactory to select appropriate strategy -- Add CryptoService for AES-256-GCM encryption/decryption of provider secrets and helper for key generation -- Extend AuthService and session/user handling to support tokens/sessions created by external auth flows and user provisioning flags -- Add UI: admin pages for managing auth providers (list, provider form, connection test) and login enhancements (SSO buttons, LDAP form, oauth-callback handler) -- Add client-side AdminAuthService for communicating with new admin auth endpoints and an adminGuard for route protection +- Introduce external authentication models: AuthProvider, ExternalIdentity, PlatformSettings to + store provider configs, links, and platform auth settings +- Add AuthProvider admin API (AdminAuthApi) to create/update/delete/test providers and manage + platform auth settings +- Add public OAuth endpoints (OAuthApi) for listing providers, initiating OAuth flows, handling + callbacks, and LDAP login +- Implement ExternalAuthService to orchestrate OAuth and LDAP flows, user provisioning, linking, + session/token generation, and provider testing +- Add pluggable auth strategy pattern with OAuthStrategy and LdapStrategy plus AuthStrategyFactory + to select appropriate strategy +- Add CryptoService for AES-256-GCM encryption/decryption of provider secrets and helper for key + generation +- Extend AuthService and session/user handling to support tokens/sessions created by external auth + flows and user provisioning flags +- Add UI: admin pages for managing auth providers (list, provider form, connection test) and login + enhancements (SSO buttons, LDAP form, oauth-callback handler) +- Add client-side AdminAuthService for communicating with new admin auth endpoints and an adminGuard + for route protection - Register new API routes in ApiRouter and wire server-side handlers into the router -- Implement safeguards: mask secrets in admin responses, validate provider configs, and track connection test results and audit logs +- Implement safeguards: mask secrets in admin responses, validate provider configs, and track + connection test results and audit logs ## 2025-11-28 - 1.2.0 - feat(tokens) + Add support for organization-owned API tokens and org-level token management -- ApiToken model: added optional organizationId and createdById fields (persisted and indexed) and new static getOrgTokens method -- auth.interfaces: IApiToken and ICreateTokenDto updated to include organizationId and createdById where appropriate -- TokenService: create token options now accept organizationId and createdById; tokens store org and creator info; added getOrgTokens and revokeAllOrgTokens (with audit logging) -- API: TokenApi now integrates PermissionService to allow organization managers to list/revoke org-owned tokens; GET /api/v1/tokens accepts organizationId query param and token lookup checks org management permissions +- ApiToken model: added optional organizationId and createdById fields (persisted and indexed) and + new static getOrgTokens method +- auth.interfaces: IApiToken and ICreateTokenDto updated to include organizationId and createdById + where appropriate +- TokenService: create token options now accept organizationId and createdById; tokens store org and + creator info; added getOrgTokens and revokeAllOrgTokens (with audit logging) +- API: TokenApi now integrates PermissionService to allow organization managers to list/revoke + org-owned tokens; GET /api/v1/tokens accepts organizationId query param and token lookup checks + org management permissions - Router: PermissionService instantiated and passed to TokenApi -- UI: api.service types and methods updated — IToken and ITokenScope include organizationId/createdById; getTokens and createToken now support an organizationId parameter and scoped scopes +- UI: api.service types and methods updated — IToken and ITokenScope include + organizationId/createdById; getTokens and createToken now support an organizationId parameter and + scoped scopes - .gitignore: added stories/ to ignore ## 2025-11-28 - 1.1.0 - feat(registry) + Add hot-reload websocket, embedded UI bundling, and multi-platform Deno build tasks -Introduce a ReloadSocketManager and client ReloadService for automatic page reloads when the server restarts. Serve UI assets from an embedded generated file and add Deno tasks to bundle the UI and compile native binaries for multiple platforms. Also update dev watch workflow and ignore generated embedded UI file. +Introduce a ReloadSocketManager and client ReloadService for automatic page reloads when the server +restarts. Serve UI assets from an embedded generated file and add Deno tasks to bundle the UI and +compile native binaries for multiple platforms. Also update dev watch workflow and ignore generated +embedded UI file. -- Add ReloadSocketManager (ts/reload-socket.ts) to broadcast a server instance ID to connected clients for hot-reload. -- Integrate reload socket into StackGalleryRegistry and expose WebSocket upgrade endpoint at /ws/reload. -- Add Angular ReloadService (ui/src/app/core/services/reload.service.ts) to connect to the reload WS and trigger page reloads with exponential reconnect. -- Serve static UI files from an embedded generated module (getEmbeddedFile) and add SPA fallback to index.html. +- Add ReloadSocketManager (ts/reload-socket.ts) to broadcast a server instance ID to connected + clients for hot-reload. +- Integrate reload socket into StackGalleryRegistry and expose WebSocket upgrade endpoint at + /ws/reload. +- Add Angular ReloadService (ui/src/app/core/services/reload.service.ts) to connect to the reload WS + and trigger page reloads with exponential reconnect. +- Serve static UI files from an embedded generated module (getEmbeddedFile) and add SPA fallback to + index.html. - Ignore generated embedded UI file (ts/embedded-ui.generated.ts) in .gitignore. -- Add Deno tasks in deno.json: bundle-ui, bundle-ui:watch, compile targets (linux/mac x64/arm64) and a release task to bundle + compile. -- Update package.json watch script to run BACKEND, UI and BUNDLER concurrently (deno task bundle-ui:watch). +- Add Deno tasks in deno.json: bundle-ui, bundle-ui:watch, compile targets (linux/mac x64/arm64) and + a release task to bundle + compile. +- Update package.json watch script to run BACKEND, UI and BUNDLER concurrently (deno task + bundle-ui:watch). ## 2025-11-28 - 1.0.1 - fix(smartdata) + Bump @push.rocks/smartdata to ^7.0.13 in deno.json - Updated deno.json imports mapping for @push.rocks/smartdata from ^7.0.9 to ^7.0.13 ## 2025-11-28 - 1.0.0 - Initial release + Release with core features, UI, and project scaffolding. - Implemented account settings and API tokens management. @@ -85,8 +134,10 @@ Release with core features, UI, and project scaffolding. - Dependency updates and fixes. ## 2025-11-27 - 2025-11-28 - unknown -> 1.0.0 - housekeeping / duplicate commits + Minor housekeeping and duplicate commits consolidated into the 1.0.0 release. - Added initial README with project overview, features, and setup instructions. -- Consolidated a duplicate "feat: add account settings and API tokens management" commit (unknown version) into the 1.0.0 release. -- Miscellaneous UI tweaks and dependency updates. \ No newline at end of file +- Consolidated a duplicate "feat: add account settings and API tokens management" commit (unknown + version) into the 1.0.0 release. +- Miscellaneous UI tweaks and dependency updates. diff --git a/deno.json b/deno.json index 181a2d1..8a594c8 100644 --- a/deno.json +++ b/deno.json @@ -12,9 +12,8 @@ "test:e2e": "deno test --allow-all --no-check test/e2e/", "test:docker-up": "docker compose -f test/docker-compose.test.yml up -d --wait", "test:docker-down": "docker compose -f test/docker-compose.test.yml down -v", - "build": "cd ui && pnpm run build", - "bundle-ui": "deno run --allow-all scripts/bundle-ui.ts", - "bundle-ui:watch": "deno run --allow-all scripts/bundle-ui.ts --watch", + "build-ui": "npx tsbundle", + "watch": "npx tswatch", "compile": "tsdeno compile", "check": "deno check mod.ts", "fmt": "deno fmt", @@ -35,7 +34,11 @@ "@push.rocks/smartdelay": "npm:@push.rocks/smartdelay@^3.0.5", "@push.rocks/smartrx": "npm:@push.rocks/smartrx@^3.0.10", "@push.rocks/smartcli": "npm:@push.rocks/smartcli@^4.0.20", + "@push.rocks/smartguard": "npm:@push.rocks/smartguard@^3.1.0", "@push.rocks/qenv": "npm:@push.rocks/qenv@^6.1.3", + "@api.global/typedrequest": "npm:@api.global/typedrequest@^3.1.10", + "@api.global/typedrequest-interfaces": "npm:@api.global/typedrequest-interfaces@^3.0.19", + "@api.global/typedserver": "npm:@api.global/typedserver@^3.0.53", "@tsclass/tsclass": "npm:@tsclass/tsclass@^9.5.0", "@std/path": "jsr:@std/path@^1.0.0", "@std/fs": "jsr:@std/fs@^1.0.0", diff --git a/deno.lock b/deno.lock index bb877be..5385de5 100644 --- a/deno.lock +++ b/deno.lock @@ -18,7 +18,15 @@ "jsr:@std/path@^1.1.4": "1.1.4", "jsr:@std/streams@^1.0.17": "1.0.17", "jsr:@std/testing@*": "1.0.17", + "npm:@api.global/typedrequest-interfaces@^3.0.19": "3.0.19", + "npm:@api.global/typedrequest@^3.1.10": "3.3.0", + "npm:@api.global/typedserver@^3.0.53": "3.0.80", + "npm:@api.global/typedserver@^8.4.2": "8.4.2_@push.rocks+smartserve@2.0.1", + "npm:@design.estate/dees-catalog@^3.43.0": "3.48.5_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_xterm@5.3.0", + "npm:@design.estate/dees-element@^2.1.6": "2.2.3", + "npm:@git.zone/tsbundle@^2.8.3": "2.9.1", "npm:@git.zone/tsdeno@^1.2.0": "1.2.0", + "npm:@git.zone/tswatch@^3.1.0": "3.3.0", "npm:@push.rocks/qenv@^6.1.3": "6.1.3", "npm:@push.rocks/smartbucket@^4.5.1": "4.5.1", "npm:@push.rocks/smartcli@^4.0.20": "4.0.20", @@ -26,6 +34,7 @@ "npm:@push.rocks/smartdata@^7.1.0": "7.1.0", "npm:@push.rocks/smartdelay@^3.0.5": "3.0.5", "npm:@push.rocks/smartenv@6": "6.0.0", + "npm:@push.rocks/smartguard@^3.1.0": "3.1.0", "npm:@push.rocks/smartjwt@^2.2.1": "2.2.1", "npm:@push.rocks/smartlog@^3.2.1": "3.2.1", "npm:@push.rocks/smartpath@6": "6.0.0", @@ -34,8 +43,7 @@ "npm:@push.rocks/smartrx@^3.0.10": "3.0.10", "npm:@push.rocks/smartstring@^4.1.0": "4.1.0", "npm:@push.rocks/smartunique@^3.0.9": "3.0.9", - "npm:@tsclass/tsclass@^9.5.0": "9.5.0", - "npm:concurrently@^9.1.2": "9.2.1" + "npm:@tsclass/tsclass@^9.5.0": "9.5.0" }, "jsr": { "@std/assert@1.0.17": { @@ -104,6 +112,10 @@ } }, "npm": { + "@api.global/typedrequest-interfaces@2.0.2": { + "integrity": "sha512-D+mkr4IiUZ/eUgrdp5jXjBKOW/iuMcl0z2ZLQsLLypKX/psFGD3viZJ58FNRa+/1OSM38JS5wFyoWl8oPEFLrw==", + "tarball": "https://verdaccio.lossless.digital/@api.global/typedrequest-interfaces/-/typedrequest-interfaces-2.0.2.tgz" + }, "@api.global/typedrequest-interfaces@3.0.19": { "integrity": "sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==", "tarball": "https://verdaccio.lossless.digital/@api.global/typedrequest-interfaces/-/typedrequest-interfaces-3.0.19.tgz" @@ -111,18 +123,132 @@ "@api.global/typedrequest@3.3.0": { "integrity": "sha512-Jwobqla+9k2IBG0duwrCFtc6GU6wsvHS3f0gJJsxTrpapylBW1YSF7NnGHPGs7F9hbATsO6IoUBpR2ScoKyGJA==", "dependencies": [ - "@api.global/typedrequest-interfaces", + "@api.global/typedrequest-interfaces@3.0.19", "@push.rocks/isounique", "@push.rocks/lik", "@push.rocks/smartbuffer", "@push.rocks/smartdelay", "@push.rocks/smartguard", "@push.rocks/smartpromise", - "@push.rocks/webrequest", + "@push.rocks/webrequest@4.0.5", "@push.rocks/webstream" ], "tarball": "https://verdaccio.lossless.digital/@api.global/typedrequest/-/typedrequest-3.3.0.tgz" }, + "@api.global/typedserver@3.0.80": { + "integrity": "sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==", + "dependencies": [ + "@api.global/typedrequest", + "@api.global/typedrequest-interfaces@3.0.19", + "@api.global/typedsocket@3.1.1", + "@cloudflare/workers-types", + "@design.estate/dees-comms", + "@push.rocks/lik", + "@push.rocks/smartchok", + "@push.rocks/smartdelay", + "@push.rocks/smartenv@5.0.13", + "@push.rocks/smartfeed", + "@push.rocks/smartfile@11.2.7", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartlog", + "@push.rocks/smartlog-destination-devtools", + "@push.rocks/smartlog-interfaces", + "@push.rocks/smartmanifest", + "@push.rocks/smartmatch", + "@push.rocks/smartmime", + "@push.rocks/smartntml", + "@push.rocks/smartopen", + "@push.rocks/smartpath@6.0.0", + "@push.rocks/smartpromise", + "@push.rocks/smartrequest@4.4.2", + "@push.rocks/smartrx", + "@push.rocks/smartsitemap", + "@push.rocks/smartstream", + "@push.rocks/smarttime", + "@push.rocks/taskbuffer", + "@push.rocks/webrequest@3.0.37", + "@push.rocks/webstore", + "@tsclass/tsclass@9.5.0", + "@types/express", + "body-parser", + "cors", + "express", + "express-force-ssl", + "lit" + ], + "tarball": "https://verdaccio.lossless.digital/@api.global/typedserver/-/typedserver-3.0.80.tgz" + }, + "@api.global/typedserver@8.4.2_@push.rocks+smartserve@2.0.1": { + "integrity": "sha512-eESOcWvrbqkshR4s4OeTX1AK74bNCeGgiRebKgjxIzJ+b0+rkPQyn2DOaMtyXjFZRNgRHyytLm5Iqj5fdazeqw==", + "dependencies": [ + "@api.global/typedrequest", + "@api.global/typedrequest-interfaces@3.0.19", + "@api.global/typedsocket@4.1.2_@push.rocks+smartserve@2.0.1", + "@cloudflare/workers-types", + "@design.estate/dees-catalog", + "@design.estate/dees-comms", + "@push.rocks/lik", + "@push.rocks/smartdelay", + "@push.rocks/smartenv@6.0.0", + "@push.rocks/smartfeed", + "@push.rocks/smartfile@13.1.2", + "@push.rocks/smartfs", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartlog", + "@push.rocks/smartlog-destination-devtools", + "@push.rocks/smartlog-interfaces", + "@push.rocks/smartmanifest", + "@push.rocks/smartmatch", + "@push.rocks/smartmime", + "@push.rocks/smartntml", + "@push.rocks/smartopen", + "@push.rocks/smartpath@6.0.0", + "@push.rocks/smartpromise", + "@push.rocks/smartrequest@5.0.1", + "@push.rocks/smartrx", + "@push.rocks/smartserve", + "@push.rocks/smartsitemap", + "@push.rocks/smartstream", + "@push.rocks/smarttime", + "@push.rocks/smartwatch", + "@push.rocks/taskbuffer", + "@push.rocks/webrequest@4.0.5", + "@push.rocks/webstore", + "@tsclass/tsclass@9.5.0", + "lit" + ], + "tarball": "https://verdaccio.lossless.digital/@api.global/typedserver/-/typedserver-8.4.2.tgz" + }, + "@api.global/typedsocket@3.1.1": { + "integrity": "sha512-Wkz3NlhmfdZMKqXXI2c2dMtGGmSmhdOegZiziL+9b2mqPYdc7Gd8AZRdEOKvbSoIvc9G22/5BEadIWHrfq66TA==", + "dependencies": [ + "@api.global/typedrequest", + "@api.global/typedrequest-interfaces@3.0.19", + "@push.rocks/isohash", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartrx", + "@push.rocks/smartsocket", + "@push.rocks/smartstring", + "@push.rocks/smarturl" + ], + "tarball": "https://verdaccio.lossless.digital/@api.global/typedsocket/-/typedsocket-3.1.1.tgz" + }, + "@api.global/typedsocket@4.1.2_@push.rocks+smartserve@2.0.1": { + "integrity": "sha512-fZFuJY9ucFCICjF4wi6OvK8drsv6UcwVVsfamOT1HxFj7OBOYw6QHOceQ+cAQ8IrWbX817sf8gzlesl+jlG8JA==", + "dependencies": [ + "@api.global/typedrequest", + "@api.global/typedrequest-interfaces@3.0.19", + "@push.rocks/isohash", + "@push.rocks/smartdelay", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartpromise", + "@push.rocks/smartrx", + "@push.rocks/smartserve", + "@push.rocks/smartstring", + "@push.rocks/smarturl" + ], + "tarball": "https://verdaccio.lossless.digital/@api.global/typedsocket/-/typedsocket-4.1.2.tgz" + }, "@aws-crypto/crc32@5.2.0": { "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "dependencies": [ @@ -661,7 +787,7 @@ "integrity": "sha512-I/+BMxM4WE/6xL0tyV7tAUDOAXmyw/va1oGr/eSly43HmLUcD1G+v96vEKAA8VoLcZ03ZQo/PWzjmN9zQErqPQ==", "dependencies": [ "@smithy/types", - "fast-xml-parser", + "fast-xml-parser@5.5.6", "tslib" ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/xml-builder/-/xml-builder-3.972.13.tgz" @@ -678,18 +804,59 @@ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", "tarball": "https://verdaccio.lossless.digital/@borewit/text-codec/-/text-codec-0.2.2.tgz" }, + "@cfworker/json-schema@4.1.1": { + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "tarball": "https://verdaccio.lossless.digital/@cfworker/json-schema/-/json-schema-4.1.1.tgz" + }, + "@cloudflare/workers-types@4.20260313.1": { + "integrity": "sha512-jMEeX3RKfOSVqqXRKr/ulgglcTloeMzSH3FdzIfqJHtvc12/ELKd5Ldsg8ZHahKX/4eRxYdw3kbzb8jLXbq/jQ==", + "tarball": "https://verdaccio.lossless.digital/@cloudflare/workers-types/-/workers-types-4.20260313.1.tgz" + }, "@configvault.io/interfaces@1.0.17": { "integrity": "sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==", "dependencies": [ - "@api.global/typedrequest-interfaces" + "@api.global/typedrequest-interfaces@3.0.19" ], "tarball": "https://verdaccio.lossless.digital/@configvault.io/interfaces/-/interfaces-1.0.17.tgz" }, + "@design.estate/dees-catalog@3.48.5_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_xterm@5.3.0": { + "integrity": "sha512-4BTKpofEL77k4GfJhrb7Zv9Y0vCJ/40Fn262p2bKAGwkQ+SnFEtqOKlNIgjogNggIfTMSBt3THtWPfonveVcuw==", + "dependencies": [ + "@design.estate/dees-domtools", + "@design.estate/dees-element", + "@design.estate/dees-wcctools", + "@fortawesome/fontawesome-svg-core", + "@fortawesome/free-brands-svg-icons", + "@fortawesome/free-regular-svg-icons", + "@fortawesome/free-solid-svg-icons", + "@push.rocks/smarti18n", + "@push.rocks/smartpromise", + "@push.rocks/smartstring", + "@tempfix/webcontainer__api", + "@tiptap/core", + "@tiptap/extension-link", + "@tiptap/extension-text-align", + "@tiptap/extension-typography", + "@tiptap/extension-underline", + "@tiptap/starter-kit", + "@tsclass/tsclass@9.5.0", + "apexcharts", + "highlight.js", + "ibantools", + "lucide", + "monaco-editor", + "pdfjs-dist", + "xterm", + "xterm-addon-fit" + ], + "scripts": true, + "tarball": "https://verdaccio.lossless.digital/@design.estate/dees-catalog/-/dees-catalog-3.48.5.tgz" + }, "@design.estate/dees-comms@1.0.30": { "integrity": "sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==", "dependencies": [ "@api.global/typedrequest", - "@api.global/typedrequest-interfaces", + "@api.global/typedrequest-interfaces@3.0.19", "@push.rocks/smartdelay", "broadcast-channel" ], @@ -710,7 +877,7 @@ "@push.rocks/smartstate", "@push.rocks/smartstring", "@push.rocks/smarturl", - "@push.rocks/webrequest", + "@push.rocks/webrequest@4.0.5", "@push.rocks/websetup", "@push.rocks/webstore", "@tempfix/lenis", @@ -729,6 +896,250 @@ ], "tarball": "https://verdaccio.lossless.digital/@design.estate/dees-element/-/dees-element-2.2.3.tgz" }, + "@design.estate/dees-wcctools@3.8.0": { + "integrity": "sha512-CC14iVKUrguzD9jIrdPBd9fZ4egVJEZMxl5y8iy0l7WLumeoYvGsoXj5INVkRPLRVLqziIdi4Je1hXqHt2NU+g==", + "dependencies": [ + "@design.estate/dees-domtools", + "@design.estate/dees-element", + "@push.rocks/smartdelay", + "lit" + ], + "tarball": "https://verdaccio.lossless.digital/@design.estate/dees-wcctools/-/dees-wcctools-3.8.0.tgz" + }, + "@emnapi/core@1.9.1": { + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dependencies": [ + "@emnapi/wasi-threads", + "tslib" + ], + "tarball": "https://verdaccio.lossless.digital/@emnapi/core/-/core-1.9.1.tgz" + }, + "@emnapi/runtime@1.9.1": { + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dependencies": [ + "tslib" + ], + "tarball": "https://verdaccio.lossless.digital/@emnapi/runtime/-/runtime-1.9.1.tgz" + }, + "@emnapi/wasi-threads@1.2.0": { + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dependencies": [ + "tslib" + ], + "tarball": "https://verdaccio.lossless.digital/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz" + }, + "@esbuild/aix-ppc64@0.27.4": { + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "os": ["aix"], + "cpu": ["ppc64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz" + }, + "@esbuild/android-arm64@0.27.4": { + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "os": ["android"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz" + }, + "@esbuild/android-arm@0.27.4": { + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "os": ["android"], + "cpu": ["arm"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/android-arm/-/android-arm-0.27.4.tgz" + }, + "@esbuild/android-x64@0.27.4": { + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "os": ["android"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/android-x64/-/android-x64-0.27.4.tgz" + }, + "@esbuild/darwin-arm64@0.27.4": { + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "os": ["darwin"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz" + }, + "@esbuild/darwin-x64@0.27.4": { + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "os": ["darwin"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz" + }, + "@esbuild/freebsd-arm64@0.27.4": { + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "os": ["freebsd"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz" + }, + "@esbuild/freebsd-x64@0.27.4": { + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "os": ["freebsd"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz" + }, + "@esbuild/linux-arm64@0.27.4": { + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz" + }, + "@esbuild/linux-arm@0.27.4": { + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "os": ["linux"], + "cpu": ["arm"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz" + }, + "@esbuild/linux-ia32@0.27.4": { + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "os": ["linux"], + "cpu": ["ia32"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz" + }, + "@esbuild/linux-loong64@0.27.4": { + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "os": ["linux"], + "cpu": ["loong64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz" + }, + "@esbuild/linux-mips64el@0.27.4": { + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "os": ["linux"], + "cpu": ["mips64el"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz" + }, + "@esbuild/linux-ppc64@0.27.4": { + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "os": ["linux"], + "cpu": ["ppc64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz" + }, + "@esbuild/linux-riscv64@0.27.4": { + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "os": ["linux"], + "cpu": ["riscv64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz" + }, + "@esbuild/linux-s390x@0.27.4": { + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "os": ["linux"], + "cpu": ["s390x"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz" + }, + "@esbuild/linux-x64@0.27.4": { + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz" + }, + "@esbuild/netbsd-arm64@0.27.4": { + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "os": ["netbsd"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz" + }, + "@esbuild/netbsd-x64@0.27.4": { + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "os": ["netbsd"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz" + }, + "@esbuild/openbsd-arm64@0.27.4": { + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "os": ["openbsd"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz" + }, + "@esbuild/openbsd-x64@0.27.4": { + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "os": ["openbsd"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz" + }, + "@esbuild/openharmony-arm64@0.27.4": { + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "os": ["openharmony"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz" + }, + "@esbuild/sunos-x64@0.27.4": { + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "os": ["sunos"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz" + }, + "@esbuild/win32-arm64@0.27.4": { + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "os": ["win32"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz" + }, + "@esbuild/win32-ia32@0.27.4": { + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "os": ["win32"], + "cpu": ["ia32"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz" + }, + "@esbuild/win32-x64@0.27.4": { + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "os": ["win32"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz" + }, + "@fortawesome/fontawesome-common-types@7.2.0": { + "integrity": "sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==", + "tarball": "https://verdaccio.lossless.digital/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.2.0.tgz" + }, + "@fortawesome/fontawesome-svg-core@7.2.0": { + "integrity": "sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==", + "dependencies": [ + "@fortawesome/fontawesome-common-types" + ], + "tarball": "https://verdaccio.lossless.digital/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.2.0.tgz" + }, + "@fortawesome/free-brands-svg-icons@7.2.0": { + "integrity": "sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==", + "dependencies": [ + "@fortawesome/fontawesome-common-types" + ], + "tarball": "https://verdaccio.lossless.digital/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.2.0.tgz" + }, + "@fortawesome/free-regular-svg-icons@7.2.0": { + "integrity": "sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==", + "dependencies": [ + "@fortawesome/fontawesome-common-types" + ], + "tarball": "https://verdaccio.lossless.digital/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.2.0.tgz" + }, + "@fortawesome/free-solid-svg-icons@7.2.0": { + "integrity": "sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==", + "dependencies": [ + "@fortawesome/fontawesome-common-types" + ], + "tarball": "https://verdaccio.lossless.digital/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.2.0.tgz" + }, + "@git.zone/tsbundle@2.9.1": { + "integrity": "sha512-JW1xjSv7UjAm2lwAQPxhCWs14wqs+UIq5FqIGUPuI6rrDBWIMT2d0gpP6iP6TqXqgm6XpBlfU4rHcHheUXzXbQ==", + "dependencies": [ + "@push.rocks/early", + "@push.rocks/npmextra", + "@push.rocks/smartcli", + "@push.rocks/smartdelay", + "@push.rocks/smartfs", + "@push.rocks/smartinteract", + "@push.rocks/smartlog", + "@push.rocks/smartlog-destination-local", + "@push.rocks/smartpath@6.0.0", + "@push.rocks/smartpromise", + "@push.rocks/smartspawn", + "@rspack/core", + "@types/html-minifier", + "esbuild", + "html-minifier", + "rolldown", + "typescript" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/@git.zone/tsbundle/-/tsbundle-2.9.1.tgz" + }, "@git.zone/tsdeno@1.2.0": { "integrity": "sha512-Kx/9NchzKRoBhgj44V/ymF3rtspMAO+U+x7d3CFfBAyHCzVCrFtzIdVb5JULSTSR89d9a0L4VJVyVUoRdz/MUA==", "dependencies": [ @@ -741,6 +1152,182 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/@git.zone/tsdeno/-/tsdeno-1.2.0.tgz" }, + "@git.zone/tsrun@2.0.1": { + "integrity": "sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==", + "dependencies": [ + "@push.rocks/smartfile@13.1.2", + "@push.rocks/smartshell", + "tsx" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/@git.zone/tsrun/-/tsrun-2.0.1.tgz" + }, + "@git.zone/tswatch@3.3.0": { + "integrity": "sha512-2d5G4L6RpEGW7d16xz6Gg6P/JnrMncNRDy74WaFrNjdn2fe5yIPtqoiQ/9LTbxqk67snj0gN2xtlQTXiN+Xa/w==", + "dependencies": [ + "@api.global/typedserver@8.4.2_@push.rocks+smartserve@2.0.1", + "@git.zone/tsbundle", + "@git.zone/tsrun", + "@push.rocks/early", + "@push.rocks/lik", + "@push.rocks/npmextra", + "@push.rocks/smartcli", + "@push.rocks/smartdelay", + "@push.rocks/smartexit", + "@push.rocks/smartfs", + "@push.rocks/smartinteract", + "@push.rocks/smartlog", + "@push.rocks/smartlog-destination-local", + "@push.rocks/smartshell", + "@push.rocks/smartwatch" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/@git.zone/tswatch/-/tswatch-3.3.0.tgz" + }, + "@happy-dom/global-registrator@15.11.7": { + "integrity": "sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==", + "dependencies": [ + "happy-dom" + ], + "tarball": "https://verdaccio.lossless.digital/@happy-dom/global-registrator/-/global-registrator-15.11.7.tgz" + }, + "@inquirer/checkbox@3.0.1": { + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "ansi-escapes", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/checkbox/-/checkbox-3.0.1.tgz" + }, + "@inquirer/confirm@4.0.1": { + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/confirm/-/confirm-4.0.1.tgz" + }, + "@inquirer/core@9.2.1": { + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dependencies": [ + "@inquirer/figures", + "@inquirer/type", + "@types/mute-stream", + "@types/node@22.19.15", + "@types/wrap-ansi", + "ansi-escapes", + "cli-width", + "mute-stream", + "signal-exit@4.1.0", + "strip-ansi", + "wrap-ansi", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/core/-/core-9.2.1.tgz" + }, + "@inquirer/editor@3.0.1": { + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "external-editor" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/editor/-/editor-3.0.1.tgz" + }, + "@inquirer/expand@3.0.1": { + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/expand/-/expand-3.0.1.tgz" + }, + "@inquirer/figures@1.0.15": { + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "tarball": "https://verdaccio.lossless.digital/@inquirer/figures/-/figures-1.0.15.tgz" + }, + "@inquirer/input@3.0.1": { + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/input/-/input-3.0.1.tgz" + }, + "@inquirer/number@2.0.1": { + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/number/-/number-2.0.1.tgz" + }, + "@inquirer/password@3.0.1": { + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "ansi-escapes" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/password/-/password-3.0.1.tgz" + }, + "@inquirer/prompts@6.0.1": { + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", + "dependencies": [ + "@inquirer/checkbox", + "@inquirer/confirm", + "@inquirer/editor", + "@inquirer/expand", + "@inquirer/input", + "@inquirer/number", + "@inquirer/password", + "@inquirer/rawlist", + "@inquirer/search", + "@inquirer/select" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/prompts/-/prompts-6.0.1.tgz" + }, + "@inquirer/rawlist@3.0.1": { + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", + "dependencies": [ + "@inquirer/core", + "@inquirer/type", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/rawlist/-/rawlist-3.0.1.tgz" + }, + "@inquirer/search@2.0.1": { + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/search/-/search-2.0.1.tgz" + }, + "@inquirer/select@3.0.1": { + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", + "dependencies": [ + "@inquirer/core", + "@inquirer/figures", + "@inquirer/type", + "ansi-escapes", + "yoctocolors-cjs" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/select/-/select-3.0.1.tgz" + }, + "@inquirer/type@2.0.0": { + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dependencies": [ + "mute-stream" + ], + "tarball": "https://verdaccio.lossless.digital/@inquirer/type/-/type-2.0.0.tgz" + }, "@isaacs/cliui@9.0.0": { "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", "tarball": "https://verdaccio.lossless.digital/@isaacs/cliui/-/cliui-9.0.0.tgz" @@ -760,6 +1347,47 @@ "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", "tarball": "https://verdaccio.lossless.digital/@mixmark-io/domino/-/domino-2.2.0.tgz" }, + "@module-federation/error-codes@0.22.0": { + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", + "tarball": "https://verdaccio.lossless.digital/@module-federation/error-codes/-/error-codes-0.22.0.tgz" + }, + "@module-federation/runtime-core@0.22.0": { + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", + "dependencies": [ + "@module-federation/error-codes", + "@module-federation/sdk" + ], + "tarball": "https://verdaccio.lossless.digital/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz" + }, + "@module-federation/runtime-tools@0.22.0": { + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", + "dependencies": [ + "@module-federation/runtime", + "@module-federation/webpack-bundler-runtime" + ], + "tarball": "https://verdaccio.lossless.digital/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz" + }, + "@module-federation/runtime@0.22.0": { + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", + "dependencies": [ + "@module-federation/error-codes", + "@module-federation/runtime-core", + "@module-federation/sdk" + ], + "tarball": "https://verdaccio.lossless.digital/@module-federation/runtime/-/runtime-0.22.0.tgz" + }, + "@module-federation/sdk@0.22.0": { + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "tarball": "https://verdaccio.lossless.digital/@module-federation/sdk/-/sdk-0.22.0.tgz" + }, + "@module-federation/webpack-bundler-runtime@0.22.0": { + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", + "dependencies": [ + "@module-federation/runtime", + "@module-federation/sdk" + ], + "tarball": "https://verdaccio.lossless.digital/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz" + }, "@mongodb-js/saslprep@1.4.6": { "integrity": "sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==", "dependencies": [ @@ -767,6 +1395,102 @@ ], "tarball": "https://verdaccio.lossless.digital/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz" }, + "@napi-rs/canvas-android-arm64@0.1.96": { + "integrity": "sha512-ew1sPrN3dGdZ3L4FoohPfnjq0f9/Jk7o+wP7HkQZokcXgIUD6FIyICEWGhMYzv53j63wUcPvZeAwgewX58/egg==", + "os": ["android"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.96.tgz" + }, + "@napi-rs/canvas-darwin-arm64@0.1.96": { + "integrity": "sha512-Q/wOXZ5PzTqpdmA5eUOcegCf4Go/zz3aZ5DlzSeDpOjFmfwMKh8EzLAoweQ+mJVagcHQyzoJhaTEnrO68TNyNg==", + "os": ["darwin"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.96.tgz" + }, + "@napi-rs/canvas-darwin-x64@0.1.96": { + "integrity": "sha512-UrXiQz28tQEvGM1qvyptewOAfmUrrd5+wvi6Rzjj2VprZI8iZ2KIvBD2lTTG1bVF95AbeDeG7PJA0D9sLKaOFA==", + "os": ["darwin"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-arm-gnueabihf@0.1.96": { + "integrity": "sha512-I90ODxweD8aEP6XKU/NU+biso95MwCtQ2F46dUvhec1HesFi0tq/tAJkYic/1aBSiO/1kGKmSeD1B0duOHhEHQ==", + "os": ["linux"], + "cpu": ["arm"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-arm64-gnu@0.1.96": { + "integrity": "sha512-Dx/0+RFV++w3PcRy+4xNXkghhXjA5d0Mw1bs95emn5Llinp1vihMaA6WJt3oYv2LAHc36+gnrhIBsPhUyI2SGw==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-arm64-musl@0.1.96": { + "integrity": "sha512-UvOi7fii3IE2KDfEfhh8m+LpzSRvhGK7o1eho99M2M0HTik11k3GX+2qgVx9EtujN3/bhFFS1kSO3+vPMaJ0Mg==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-riscv64-gnu@0.1.96": { + "integrity": "sha512-MBSukhGCQ5nRtf9NbFYWOU080yqkZU1PbuH4o1ROvB4CbPl12fchDR35tU83Wz8gWIM9JTn99lBn9DenPIv7Ig==", + "os": ["linux"], + "cpu": ["riscv64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-x64-gnu@0.1.96": { + "integrity": "sha512-I/ccu2SstyKiV3HIeVzyBIWfrJo8cN7+MSQZPnabewWV6hfJ2nY7Df2WqOHmobBRUw84uGR6zfQHsUEio/m5Vg==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.96.tgz" + }, + "@napi-rs/canvas-linux-x64-musl@0.1.96": { + "integrity": "sha512-H3uov7qnTl73GDT4h52lAqpJPsl1tIUyNPWJyhQ6gHakohNqqRq3uf80+NEpzcytKGEOENP1wX3yGwZxhjiWEQ==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.96.tgz" + }, + "@napi-rs/canvas-win32-arm64-msvc@0.1.96": { + "integrity": "sha512-ATp6Y+djOjYtkfV/VRH7CZ8I1MEtkUQBmKUbuWw5zWEHHqfL0cEcInE4Cxgx7zkNAhEdBbnH8HMVrqNp+/gwxA==", + "os": ["win32"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.96.tgz" + }, + "@napi-rs/canvas-win32-x64-msvc@0.1.96": { + "integrity": "sha512-UYGdTltVd+Z8mcIuoqGmAXXUvwH5CLf2M6mIB5B0/JmX5J041jETjqtSYl7gN+aj3k1by/SG6sS0hAwCqyK7zw==", + "os": ["win32"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.96.tgz" + }, + "@napi-rs/canvas@0.1.96": { + "integrity": "sha512-6NNmNxvoJKeucVjxaaRUt3La2i5jShgiAbaY3G/72s1Vp3U06XPrAIxkAjBxpDcamEn/t+WJ4OOlGmvILo4/Ew==", + "optionalDependencies": [ + "@napi-rs/canvas-android-arm64", + "@napi-rs/canvas-darwin-arm64", + "@napi-rs/canvas-darwin-x64", + "@napi-rs/canvas-linux-arm-gnueabihf", + "@napi-rs/canvas-linux-arm64-gnu", + "@napi-rs/canvas-linux-arm64-musl", + "@napi-rs/canvas-linux-riscv64-gnu", + "@napi-rs/canvas-linux-x64-gnu", + "@napi-rs/canvas-linux-x64-musl", + "@napi-rs/canvas-win32-arm64-msvc", + "@napi-rs/canvas-win32-x64-msvc" + ], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/canvas/-/canvas-0.1.96.tgz" + }, + "@napi-rs/wasm-runtime@1.0.7": { + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dependencies": [ + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util" + ], + "tarball": "https://verdaccio.lossless.digital/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz" + }, + "@oxc-project/types@0.99.0": { + "integrity": "sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==", + "tarball": "https://verdaccio.lossless.digital/@oxc-project/types/-/types-0.99.0.tgz" + }, "@push.rocks/consolecolor@2.0.3": { "integrity": "sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==", "dependencies": [ @@ -782,6 +1506,14 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/early/-/early-4.0.4.tgz" }, + "@push.rocks/isohash@2.0.1": { + "integrity": "sha512-UulhEui8O9Ei9fSqTldsB73TUmAFNqEBk82tHsJSLLpNK9gJZQE82iaSNsQUakoUQ2c9KueueMfwC3IoDaYRrQ==", + "dependencies": [ + "@pushrocks/smartenv", + "@pushrocks/smarthash" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/isohash/-/isohash-2.0.1.tgz" + }, "@push.rocks/isounique@1.0.5": { "integrity": "sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==", "tarball": "https://verdaccio.lossless.digital/@push.rocks/isounique/-/isounique-1.0.5.tgz" @@ -804,7 +1536,7 @@ "integrity": "sha512-kW0ZUGyf1e4nwloVwBQjNId+MzgTcNS834C+RxH21i1NqyOubbpWZtJtPP+K+s35nSJRyCTy3ICfBMdDBTAm2w==", "dependencies": [ "@push.rocks/lik", - "@push.rocks/smartfile", + "@push.rocks/smartfile@11.2.7", "@push.rocks/smartjson@5.2.0", "@push.rocks/smartpath@6.0.0", "@push.rocks/smartpromise", @@ -817,7 +1549,7 @@ "integrity": "sha512-snLpSHwaQ5OXlZzF1KX/FY71W5LwajjBzor82Vue0smjEPnSeUPY5/JcVdMwtdprdJe13pc/EQQuIiL/zw4/yg==", "dependencies": [ "@push.rocks/qenv", - "@push.rocks/smartfile", + "@push.rocks/smartfile@11.2.7", "@push.rocks/smartjson@5.2.0", "@push.rocks/smartlog", "@push.rocks/smartpath@6.0.0", @@ -833,7 +1565,7 @@ "dependencies": [ "@api.global/typedrequest", "@configvault.io/interfaces", - "@push.rocks/smartfile", + "@push.rocks/smartfile@11.2.7", "@push.rocks/smartlog", "@push.rocks/smartpath@6.0.0" ], @@ -862,6 +1594,29 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartbuffer/-/smartbuffer-3.0.5.tgz" }, + "@push.rocks/smartcache@1.0.18": { + "integrity": "sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==", + "dependencies": [ + "@push.rocks/smartdelay", + "@push.rocks/smarterror", + "@push.rocks/smarthash", + "@push.rocks/smartpromise", + "@push.rocks/smarttime" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartcache/-/smartcache-1.0.18.tgz" + }, + "@push.rocks/smartchok@1.2.0": { + "integrity": "sha512-I5fR++k6nR1wiMQUwcTYzO0g8FwD6gN+3HwfIzpQlolrM91i6Q5TaoMlt3aysbvKCSNvkL3FlJLOfUHNGWoWkA==", + "dependencies": [ + "@push.rocks/lik", + "@push.rocks/smartpromise", + "@push.rocks/smartrx", + "chokidar", + "picomatch" + ], + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartchok/-/smartchok-1.2.0.tgz" + }, "@push.rocks/smartcli@4.0.20": { "integrity": "sha512-gCo4ItvsPj8WoVAJw/6vkuoGA5FtIoACux2ktcCeH0nrFe7/xGR6waJ1aZcYAi7QN4gi52TlsgwuKz7BzXqhmQ==", "dependencies": [ @@ -870,7 +1625,7 @@ "@push.rocks/smartobject", "@push.rocks/smartpromise", "@push.rocks/smartrx", - "yargs-parser@22.0.0" + "yargs-parser" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartcli/-/smartcli-4.0.20.tgz" }, @@ -882,7 +1637,7 @@ "@push.rocks/smartpromise", "@push.rocks/smartrx", "@push.rocks/smarturl", - "@push.rocks/webrequest" + "@push.rocks/webrequest@4.0.5" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartclickhouse/-/smartclickhouse-2.2.0.tgz" }, @@ -952,6 +1707,14 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartenv/-/smartenv-6.0.0.tgz" }, + "@push.rocks/smarterror@2.0.1": { + "integrity": "sha512-iCcH1D8tlDJgMFsaJ6lhdOTKhbU0KoprNv9MRP9o7691QOx4JEDXiHtr/lNtxVo8BUtdb9CF6kazaknO9KuORA==", + "dependencies": [ + "clean-stack", + "make-error-cause" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smarterror/-/smarterror-2.0.1.tgz" + }, "@push.rocks/smartexit@2.0.3": { "integrity": "sha512-ZWpZ3Elorpv/rKtUcCUejUHG4BIE5B3QWysBAgb7lTcA7y0vGdFY32Y5/Q5tHpZM6PPxl/WTdUOYtSojQTq+pA==", "dependencies": [ @@ -960,6 +1723,14 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartexit/-/smartexit-2.0.3.tgz" }, + "@push.rocks/smartfeed@1.4.0": { + "integrity": "sha512-bvj/3cGQI6TbbjbqrgC1uufcqprd/VthefuIsS8KHiHyCqYD5Z6RTjrbQY9WOCsmub/dcuMavfXQZqe9g2+OrQ==", + "dependencies": [ + "@tsclass/tsclass@9.5.0", + "fast-xml-parser@4.5.4" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartfeed/-/smartfeed-1.4.0.tgz" + }, "@push.rocks/smartfile-interfaces@1.0.7": { "integrity": "sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==", "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartfile-interfaces/-/smartfile-interfaces-1.0.7.tgz" @@ -980,11 +1751,31 @@ "@types/fs-extra", "@types/js-yaml@4.0.9", "fs-extra", - "glob", + "glob@11.1.0", "js-yaml@4.1.1" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartfile/-/smartfile-11.2.7.tgz" }, + "@push.rocks/smartfile@13.1.2": { + "integrity": "sha512-DaEhwmnGEpX4coeeToaw4cZe3pNBhH7CY1iGr+d3pIXihozREvzzAR9/0i2r7bUXXL5+Lgy8YYIk5ZS+fwxMKA==", + "dependencies": [ + "@push.rocks/lik", + "@push.rocks/smartdelay", + "@push.rocks/smartfile-interfaces", + "@push.rocks/smartfs", + "@push.rocks/smarthash", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartmime", + "@push.rocks/smartpath@6.0.0", + "@push.rocks/smartpromise", + "@push.rocks/smartrequest@4.4.2", + "@push.rocks/smartstream", + "@types/js-yaml@4.0.9", + "glob@11.1.0", + "js-yaml@4.1.1" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartfile/-/smartfile-13.1.2.tgz" + }, "@push.rocks/smartfs@1.5.0": { "integrity": "sha512-QwMD44HgX3d9PPxUwR0uS+0PEMtesKvKbZR+s4pezL2er6oPneKJMLkO6TJPvJ38nug6Lmlk9Bu7UrwR2kS3Vw==", "dependencies": [ @@ -1012,6 +1803,20 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smarthash/-/smarthash-3.2.6.tgz" }, + "@push.rocks/smarti18n@1.0.4": { + "integrity": "sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==", + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smarti18n/-/smarti18n-1.0.4.tgz" + }, + "@push.rocks/smartinteract@2.0.16": { + "integrity": "sha512-eltvVRRUKBKd77DSFA4DPY2g4V4teZLNe8A93CDy/WglglYcUjxMoLY/b0DFTWCWKYT+yjk6Fe6p0FRrvX9Yvg==", + "dependencies": [ + "@push.rocks/lik", + "@push.rocks/smartobject", + "@push.rocks/smartpromise", + "inquirer" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartinteract/-/smartinteract-2.0.16.tgz" + }, "@push.rocks/smartjson@5.2.0": { "integrity": "sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==", "dependencies": [ @@ -1044,26 +1849,54 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartjwt/-/smartjwt-2.2.1.tgz" }, + "@push.rocks/smartlog-destination-devtools@1.0.12": { + "integrity": "sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==", + "dependencies": [ + "@push.rocks/smartlog-interfaces" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartlog-destination-devtools/-/smartlog-destination-devtools-1.0.12.tgz" + }, + "@push.rocks/smartlog-destination-local@9.0.2": { + "integrity": "sha512-htzIY+4+hU61Z2J4Oz+IHnAB3RGe+fpS0VKCKnAoppZqzMWnJ3UOgYIyr4djDBy2WtgpXV/16KdisKrOmwuuvw==", + "dependencies": [ + "@push.rocks/consolecolor", + "@push.rocks/smartlog-interfaces", + "@push.rocks/smartpromise" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartlog-destination-local/-/smartlog-destination-local-9.0.2.tgz" + }, + "@push.rocks/smartlog-interfaces@3.0.2": { + "integrity": "sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==", + "dependencies": [ + "@api.global/typedrequest-interfaces@2.0.2", + "@tsclass/tsclass@4.4.4" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartlog-interfaces/-/smartlog-interfaces-3.0.2.tgz" + }, "@push.rocks/smartlog@3.2.1": { "integrity": "sha512-x9/P59pfzY6HOGYmYrhqmoRl/pliTVx44g2Vbb8dIr/0zA39cAJHlPze1+UGncn37XKGmutK2iLSsJLEsexD0A==", "dependencies": [ - "@api.global/typedrequest-interfaces", + "@api.global/typedrequest-interfaces@3.0.19", "@push.rocks/consolecolor", "@push.rocks/isounique", "@push.rocks/smartclickhouse", - "@push.rocks/smartfile", + "@push.rocks/smartfile@11.2.7", "@push.rocks/smarthash", "@push.rocks/smartpromise", "@push.rocks/smarttime", - "@push.rocks/webrequest", + "@push.rocks/webrequest@4.0.5", "@tsclass/tsclass@9.5.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartlog/-/smartlog-3.2.1.tgz" }, + "@push.rocks/smartmanifest@2.0.2": { + "integrity": "sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==", + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartmanifest/-/smartmanifest-2.0.2.tgz" + }, "@push.rocks/smartmarkdown@3.0.3": { "integrity": "sha512-9KhKZxDQKPk4P/2CYdVqJa5dpGfTA8w1cxqoVZL3e8RPA7EGxbdYEqMp0n2d9mth0btk/m0KHHV+G09LfCVeBw==", "dependencies": [ - "@push.rocks/smartyaml", + "@push.rocks/smartyaml@2.0.5", "@types/turndown", "remark-frontmatter", "remark-gfm", @@ -1107,6 +1940,16 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartmongo/-/smartmongo-2.2.0.tgz" }, + "@push.rocks/smartntml@2.0.8": { + "integrity": "sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==", + "dependencies": [ + "@design.estate/dees-element", + "@happy-dom/global-registrator", + "@push.rocks/smartpromise", + "fake-indexeddb@6.2.5" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartntml/-/smartntml-2.0.8.tgz" + }, "@push.rocks/smartobject@1.0.12": { "integrity": "sha512-xSMiqXiZXXUOixT3QIPsOUKOWjL3YA/1h9/YTiCzqs5C0D3tyfTbojnfcp6YbKZoBzans2I5LghaDHsGid2DKQ==", "dependencies": [ @@ -1115,6 +1958,13 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartobject/-/smartobject-1.0.12.tgz" }, + "@push.rocks/smartopen@2.0.0": { + "integrity": "sha512-eVT0GhtQ2drb95j/kktYst/Toh1zCwCqjTJFYtaYFUnnBnBUajPtBZDFnPQo01DN8JxoeCTo8jggq+PCvzcfww==", + "dependencies": [ + "open" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartopen/-/smartopen-2.0.0.tgz" + }, "@push.rocks/smartpath@5.1.0": { "integrity": "sha512-pJ4UGATHV/C6Dw5DU0D3MJaPMASlKAgeS+Hl9dkhD2ceYArn86Ky3Z/g7LNj40Oz6cUe77/AP1chztmJZISrpw==", "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartpath/-/smartpath-5.1.0.tgz" @@ -1199,6 +2049,19 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartrx/-/smartrx-3.0.10.tgz" }, + "@push.rocks/smartserve@2.0.1": { + "integrity": "sha512-YQb2qexfCzCqOlLWBBXKMg6xG4zahCPAxomz/KEKAwHtW6wMTtuHKSTSkRTQ0vl9jssLMAmRz2OyafiL9XGJXQ==", + "dependencies": [ + "@api.global/typedrequest", + "@cfworker/json-schema", + "@push.rocks/lik", + "@push.rocks/smartenv@6.0.0", + "@push.rocks/smartlog", + "@push.rocks/smartpath@6.0.0", + "ws@8.18.3" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartserve/-/smartserve-2.0.1.tgz" + }, "@push.rocks/smartshell@3.3.8": { "integrity": "sha512-t9J/py0vnea4ZtOs7Anc9dc6lcvg6EDvYBw5eE1mB+KUWxMQf/ROIQwWMo6B9SMNY4JS2UwvfuJQJ8makP/7Tg==", "dependencies": [ @@ -1210,6 +2073,49 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartshell/-/smartshell-3.3.8.tgz" }, + "@push.rocks/smartsitemap@2.0.4": { + "integrity": "sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==", + "dependencies": [ + "@push.rocks/smartcache", + "@push.rocks/smartfeed", + "@push.rocks/smartxml", + "@push.rocks/smartyaml@3.0.4", + "@push.rocks/webrequest@4.0.5", + "@tsclass/tsclass@9.5.0" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartsitemap/-/smartsitemap-2.0.4.tgz" + }, + "@push.rocks/smartsocket@2.1.0": { + "integrity": "sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==", + "dependencies": [ + "@api.global/typedrequest-interfaces@3.0.19", + "@api.global/typedserver@3.0.80", + "@push.rocks/isohash", + "@push.rocks/isounique", + "@push.rocks/lik", + "@push.rocks/smartdelay", + "@push.rocks/smartenv@5.0.13", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartlog", + "@push.rocks/smartpromise", + "@push.rocks/smartrx", + "@push.rocks/smarttime", + "engine.io", + "socket.io", + "socket.io-client" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartsocket/-/smartsocket-2.1.0.tgz" + }, + "@push.rocks/smartspawn@3.0.3": { + "integrity": "sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==", + "dependencies": [ + "@push.rocks/smartpromise", + "spawn-wrap", + "threads", + "tiny-worker" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartspawn/-/smartspawn-3.0.3.tgz" + }, "@push.rocks/smartstate@2.2.1": { "integrity": "sha512-fLrilAJNI6QOs0hcBRD9eTwU2Rlo6NlDCKQo9N/zyp0VJ6AV1UVdEZcVIQILu1CO0RUHX9aBAbFunJrb2+Zrkg==", "dependencies": [ @@ -1265,6 +2171,25 @@ "integrity": "sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==", "tarball": "https://verdaccio.lossless.digital/@push.rocks/smarturl/-/smarturl-3.1.0.tgz" }, + "@push.rocks/smartwatch@6.3.0": { + "integrity": "sha512-TeZ1PGBoBMpC4/CK8StIj5InEiFfKp7xWJSm3aYMjB/uaoeRP0vXqv1ORIC/TKYGJuEDuAXUsit8tZVjn0qT1Q==", + "dependencies": [ + "@push.rocks/lik", + "@push.rocks/smartenv@6.0.0", + "@push.rocks/smartpromise", + "@push.rocks/smartrx", + "chokidar", + "picomatch" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartwatch/-/smartwatch-6.3.0.tgz" + }, + "@push.rocks/smartxml@2.0.0": { + "integrity": "sha512-1d06zYJX4Zt8s5w5qFOUg2LAEz9ykrh9d6CQPK4WAgOBIefb1xzVEWHc7yoxicc2OkzNgC3IBCEg3s6BncZKWw==", + "dependencies": [ + "fast-xml-parser@5.5.6" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartxml/-/smartxml-2.0.0.tgz" + }, "@push.rocks/smartyaml@2.0.5": { "integrity": "sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==", "dependencies": [ @@ -1273,6 +2198,13 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartyaml/-/smartyaml-2.0.5.tgz" }, + "@push.rocks/smartyaml@3.0.4": { + "integrity": "sha512-1JRt+hnoc2zHw3AW+vXKlCdSVwqOmY/01fu+2HBviS0UDjoZCa+/rp6E3GaQb5lEEafKi8ENbffAfjXXp3N2xQ==", + "dependencies": [ + "yaml" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartyaml/-/smartyaml-3.0.4.tgz" + }, "@push.rocks/taskbuffer@3.5.0": { "integrity": "sha512-Y9WwIEIyp6oVFdj06j84tfrZIvjhbMb3DF52rYxlTeYLk3W7RPhSg1bGPCbtkXWeKdBrSe37V90BkOG7Qq8Pqg==", "dependencies": [ @@ -1287,6 +2219,17 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/taskbuffer/-/taskbuffer-3.5.0.tgz" }, + "@push.rocks/webrequest@3.0.37": { + "integrity": "sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==", + "dependencies": [ + "@push.rocks/smartdelay", + "@push.rocks/smartenv@5.0.13", + "@push.rocks/smartjson@5.2.0", + "@push.rocks/smartpromise", + "@push.rocks/webstore" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/webrequest/-/webrequest-3.0.37.tgz" + }, "@push.rocks/webrequest@4.0.5": { "integrity": "sha512-wVSCaXqJ9Vh+rbwVz0wDl46dYz4rnwwSrm5vbVXKbuH6oKTPF0YRoujeJPqRltIn64RVGdLeY9/6ix+ZCrzhsg==", "dependencies": [ @@ -1302,7 +2245,7 @@ "integrity": "sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==", "dependencies": [ "@pushrocks/smartdelay", - "@pushrocks/smartpromise", + "@pushrocks/smartpromise@4.0.2", "@tsclass/tsclass@4.4.4" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/websetup/-/websetup-3.0.19.tgz" @@ -1310,14 +2253,14 @@ "@push.rocks/webstore@2.0.20": { "integrity": "sha512-Z3L4OHGcw/Gs9aXpMUwebEPTh0nK/C7R6YwPfCLcGVu9yd/ZShaQ8QZEYE243Cu9J1Mn+CEtz4jpPLnHiizHQA==", "dependencies": [ - "@api.global/typedrequest-interfaces", + "@api.global/typedrequest-interfaces@3.0.19", "@push.rocks/lik", "@push.rocks/smartenv@5.0.13", "@push.rocks/smartjson@5.2.0", "@push.rocks/smartpromise", "@push.rocks/smartrx", "@tempfix/idb", - "fake-indexeddb" + "fake-indexeddb@5.0.2" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/webstore/-/webstore-2.0.20.tgz" }, @@ -1328,19 +2271,262 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/webstream/-/webstream-1.0.10.tgz" }, + "@pushrocks/isounique@1.0.5": { + "integrity": "sha512-XYeoKGkmIdsWX64NlPA1fuA41n/1bQ7LdYXytlU/QqYeW7ojgA0ARRhBSh/2phL6o0Jpw6K/7gJ8jc7ab/Tc+w==", + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/isounique/-/isounique-1.0.5.tgz" + }, "@pushrocks/smartdelay@3.0.1": { "integrity": "sha512-I+i/QhC6kLsXsWyW19UgD1vH2r1YWVxK19VMxt2CEuvxMyC6tuCd0vqud9vv5JxaxsJwxWlOsrURkgL4tXeILQ==", "dependencies": [ - "@pushrocks/smartpromise" + "@pushrocks/smartpromise@4.0.2" ], "deprecated": true, "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartdelay/-/smartdelay-3.0.1.tgz" }, + "@pushrocks/smartenv@5.0.5": { + "integrity": "sha512-VWON1OJ4qV2/9hzJbgRquRekaO9am3b8W82tgCwgO6LBg23ea2tanfd+gESVMbRFduxHVoFLvlhSBcDGM5zsLA==", + "dependencies": [ + "@pushrocks/smartpromise@3.1.10" + ], + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartenv/-/smartenv-5.0.5.tgz" + }, + "@pushrocks/smarthash@3.0.2": { + "integrity": "sha512-jXW4f8k6iqOQRvkCmXMID1C+qXyNvUMKm7apPETxnO+L172VlzxP1dml0Ey1+vjfpU2luKCteJWX7W95sOdLDg==", + "dependencies": [ + "@pushrocks/smartjson", + "@pushrocks/smartpromise@3.1.10", + "@types/through2", + "through2" + ], + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/smarthash/-/smarthash-3.0.2.tgz" + }, + "@pushrocks/smartjson@5.0.6": { + "integrity": "sha512-9OJbnRgLTaCRQz+pqu5tB3ZCqRs5Zh0hnBe7t7URE+TgwIZ8aiELUIbWRkgn4mSGVzHyL6pqTyIowP6AjUCG3w==", + "dependencies": [ + "@pushrocks/smartstring", + "@types/buffer-json", + "buffer-json", + "fast-json-stable-stringify", + "lodash.clonedeep" + ], + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartjson/-/smartjson-5.0.6.tgz" + }, + "@pushrocks/smartpromise@3.1.10": { + "integrity": "sha512-VeTurbZ1+ZMxBDJk1Y1LV8SN9xLI+oDXKVeCFw41FAGEKOUEqordqFpi6t+7Vhe/TXUZzCVpZ5bXxAxrGf8yTQ==", + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartpromise/-/smartpromise-3.1.10.tgz" + }, "@pushrocks/smartpromise@4.0.2": { "integrity": "sha512-bqorOaGXPOuiOSV81luTKrTghg4O4NBRD0zyv7TIqmrMGf4a0uoozaUMp1X8vQdZW+y0gTzUJP9wkzAE6Cci0g==", "deprecated": true, "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartpromise/-/smartpromise-4.0.2.tgz" }, + "@pushrocks/smartstring@4.0.7": { + "integrity": "sha512-TxHSar7Cj29E+GOcIj4DeZKWCNVzHKdqnrBRqcBqLqmeYZvzFosLXpFKoaCJDq7MSxuPoCvu5woSdp9YmPXyog==", + "dependencies": [ + "@pushrocks/isounique", + "@pushrocks/smartenv", + "@types/randomatic", + "buffer", + "crypto-random-string", + "js-base64", + "normalize-newline", + "randomatic", + "strip-indent", + "url" + ], + "deprecated": true, + "tarball": "https://verdaccio.lossless.digital/@pushrocks/smartstring/-/smartstring-4.0.7.tgz" + }, + "@remirror/core-constants@3.0.0": { + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "tarball": "https://verdaccio.lossless.digital/@remirror/core-constants/-/core-constants-3.0.0.tgz" + }, + "@rolldown/binding-android-arm64@1.0.0-beta.52": { + "integrity": "sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==", + "os": ["android"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-darwin-arm64@1.0.0-beta.52": { + "integrity": "sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==", + "os": ["darwin"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-darwin-x64@1.0.0-beta.52": { + "integrity": "sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==", + "os": ["darwin"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-freebsd-x64@1.0.0-beta.52": { + "integrity": "sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==", + "os": ["freebsd"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52": { + "integrity": "sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==", + "os": ["linux"], + "cpu": ["arm"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52": { + "integrity": "sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-linux-arm64-musl@1.0.0-beta.52": { + "integrity": "sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-linux-x64-gnu@1.0.0-beta.52": { + "integrity": "sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-linux-x64-musl@1.0.0-beta.52": { + "integrity": "sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-openharmony-arm64@1.0.0-beta.52": { + "integrity": "sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==", + "os": ["openharmony"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-wasm32-wasi@1.0.0-beta.52": { + "integrity": "sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==", + "dependencies": [ + "@napi-rs/wasm-runtime" + ], + "cpu": ["wasm32"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52": { + "integrity": "sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==", + "os": ["win32"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52": { + "integrity": "sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==", + "os": ["win32"], + "cpu": ["ia32"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.52.tgz" + }, + "@rolldown/binding-win32-x64-msvc@1.0.0-beta.52": { + "integrity": "sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==", + "os": ["win32"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.52.tgz" + }, + "@rolldown/pluginutils@1.0.0-beta.52": { + "integrity": "sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==", + "tarball": "https://verdaccio.lossless.digital/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.52.tgz" + }, + "@rspack/binding-darwin-arm64@1.7.9": { + "integrity": "sha512-64dgstte0If5czi9bA/cpOe0ryY6wC9AIQRtyJ3DlOF6Tt+y9cKkmUoGu3V+WYaYIZRT7HNk8V7kL8amVjFTYw==", + "os": ["darwin"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.9.tgz" + }, + "@rspack/binding-darwin-x64@1.7.9": { + "integrity": "sha512-2QSLs3w4rLy4UUGVnIlkt6IlIKOzR1e0RPsq2FYQW6s3p9JrwRCtOeHohyh7EJSqF54dtfhe9UZSAwba3LqH1Q==", + "os": ["darwin"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.9.tgz" + }, + "@rspack/binding-linux-arm64-gnu@1.7.9": { + "integrity": "sha512-qhUGI/uVfvLmKWts4QkVHGL8yfUyJkblZs+OFD5Upa2y676EOsbQgWsCwX4xGB6Tv+TOzFP0SLh/UfO8ZfdE+w==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.9.tgz" + }, + "@rspack/binding-linux-arm64-musl@1.7.9": { + "integrity": "sha512-VjfmR1hgO9n3L6MaE5KG+DXSrrLVqHHOkVcOtS2LMq3bjMTwbBywY7ycymcLnX5KJsol8d3ZGYep6IfSOt3lFA==", + "os": ["linux"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.9.tgz" + }, + "@rspack/binding-linux-x64-gnu@1.7.9": { + "integrity": "sha512-0kldV+3WTs/VYDWzxJ7K40hCW26IHtnk8xPK3whKoo1649rgeXXa0EdsU5P7hG8Ef5SWQjHHHZ/fuHYSO3Y6HA==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.9.tgz" + }, + "@rspack/binding-linux-x64-musl@1.7.9": { + "integrity": "sha512-Gi4872cFtc2d83FKATR6Qcf2VBa/tFCqffI/IwRRl6Hx5FulEBqx+tH7gAuRVF693vrbXNxK+FQ+k4iEsEJxrw==", + "os": ["linux"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.9.tgz" + }, + "@rspack/binding-wasm32-wasi@1.7.9": { + "integrity": "sha512-5QEzqo6EaolpuZmK6w/mgSueorgGnnzp7dJaAvBj6ECFIg/aLXhXXmWCWbxt7Ws2gKvG5/PgaxDqbUxYL51juA==", + "dependencies": [ + "@napi-rs/wasm-runtime" + ], + "cpu": ["wasm32"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.9.tgz" + }, + "@rspack/binding-win32-arm64-msvc@1.7.9": { + "integrity": "sha512-MMqvcrIc8aOqTuHjWkjdzilvoZ3Hv07Od0Foogiyq3JMudsS3Wcmh7T1dFerGg19MOJcRUeEkrg2NQOMOQ6xDA==", + "os": ["win32"], + "cpu": ["arm64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.9.tgz" + }, + "@rspack/binding-win32-ia32-msvc@1.7.9": { + "integrity": "sha512-4kYYS+NZ2CuNbKjq40yB/UEyB51o1PHj5wpr+Y943oOJXpEKWU2Q4vkF8VEohPEcnA9cKVotYCnqStme+02suA==", + "os": ["win32"], + "cpu": ["ia32"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.9.tgz" + }, + "@rspack/binding-win32-x64-msvc@1.7.9": { + "integrity": "sha512-1g+QyXXvs+838Un/4GaUvJfARDGHMCs15eXDYWBl5m/Skubyng8djWAgr6ag1+cVoJZXCPOvybTItcblWF3gbQ==", + "os": ["win32"], + "cpu": ["x64"], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.9.tgz" + }, + "@rspack/binding@1.7.9": { + "integrity": "sha512-A56e0NdfNwbOSJoilMkxzaPuVYaKCNn1shuiwWnCIBmhV9ix1n9S1XvquDjkGyv+gCdR1+zfJBOa5DMB7htLHw==", + "optionalDependencies": [ + "@rspack/binding-darwin-arm64", + "@rspack/binding-darwin-x64", + "@rspack/binding-linux-arm64-gnu", + "@rspack/binding-linux-arm64-musl", + "@rspack/binding-linux-x64-gnu", + "@rspack/binding-linux-x64-musl", + "@rspack/binding-wasm32-wasi", + "@rspack/binding-win32-arm64-msvc", + "@rspack/binding-win32-ia32-msvc", + "@rspack/binding-win32-x64-msvc" + ], + "tarball": "https://verdaccio.lossless.digital/@rspack/binding/-/binding-1.7.9.tgz" + }, + "@rspack/core@1.7.9": { + "integrity": "sha512-VHuSKvRkuv42Ya+TxEGO0LE0r9+8P4tKGokmomj4R1f/Nu2vtS3yoaIMfC4fR6VuHGd3MZ+KTI0cNNwHfFcskw==", + "dependencies": [ + "@module-federation/runtime-tools", + "@rspack/binding", + "@rspack/lite-tapable" + ], + "tarball": "https://verdaccio.lossless.digital/@rspack/core/-/core-1.7.9.tgz" + }, + "@rspack/lite-tapable@1.1.0": { + "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "tarball": "https://verdaccio.lossless.digital/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz" + }, "@sec-ant/readable-stream@0.4.1": { "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "tarball": "https://verdaccio.lossless.digital/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz" @@ -1846,6 +3032,10 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/uuid/-/uuid-1.1.2.tgz" }, + "@socket.io/component-emitter@3.1.2": { + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "tarball": "https://verdaccio.lossless.digital/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" + }, "@tempfix/idb@8.0.3": { "integrity": "sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==", "tarball": "https://verdaccio.lossless.digital/@tempfix/idb/-/idb-8.0.3.tgz" @@ -1854,6 +3044,236 @@ "integrity": "sha512-ypeB0FuHLHOCQXW4d0RQ69txPJJH+1CHcpsZIUdcv2t1vR0IVyQr2vHihtde9UOXhjzqEnUphWon/UcJNsa0YA==", "tarball": "https://verdaccio.lossless.digital/@tempfix/lenis/-/lenis-1.3.20.tgz" }, + "@tempfix/webcontainer__api@1.6.1": { + "integrity": "sha512-Hgn3cwy0vPzjrVBqeVnY0jNZLaOCW7d+dxBe7Jv9YGHAjJ8udUMS+KbTywSv5paAfld3A/RN/iolmMzOwZxLTA==", + "tarball": "https://verdaccio.lossless.digital/@tempfix/webcontainer__api/-/webcontainer__api-1.6.1.tgz" + }, + "@tiptap/core@2.27.2_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==", + "dependencies": [ + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/core/-/core-2.27.2.tgz" + }, + "@tiptap/extension-blockquote@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-blockquote/-/extension-blockquote-2.27.2.tgz" + }, + "@tiptap/extension-bold@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-bold/-/extension-bold-2.27.2.tgz" + }, + "@tiptap/extension-bullet-list@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-bullet-list/-/extension-bullet-list-2.27.2.tgz" + }, + "@tiptap/extension-code-block@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-code-block/-/extension-code-block-2.27.2.tgz" + }, + "@tiptap/extension-code@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-code/-/extension-code-2.27.2.tgz" + }, + "@tiptap/extension-document@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-document/-/extension-document-2.27.2.tgz" + }, + "@tiptap/extension-dropcursor@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-dropcursor/-/extension-dropcursor-2.27.2.tgz" + }, + "@tiptap/extension-gapcursor@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-gapcursor/-/extension-gapcursor-2.27.2.tgz" + }, + "@tiptap/extension-hard-break@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-hard-break/-/extension-hard-break-2.27.2.tgz" + }, + "@tiptap/extension-heading@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-heading/-/extension-heading-2.27.2.tgz" + }, + "@tiptap/extension-history@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-history/-/extension-history-2.27.2.tgz" + }, + "@tiptap/extension-horizontal-rule@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.27.2.tgz" + }, + "@tiptap/extension-italic@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-italic/-/extension-italic-2.27.2.tgz" + }, + "@tiptap/extension-link@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-bnP61qkr0Kj9Cgnop1hxn2zbOCBzNtmawxr92bVTOE31fJv6FhtCnQiD6tuPQVGMYhcmAj7eihtvuEMFfqEPcQ==", + "dependencies": [ + "@tiptap/core", + "@tiptap/pm", + "linkifyjs" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-link/-/extension-link-2.27.2.tgz" + }, + "@tiptap/extension-list-item@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-list-item/-/extension-list-item-2.27.2.tgz" + }, + "@tiptap/extension-ordered-list@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-ordered-list/-/extension-ordered-list-2.27.2.tgz" + }, + "@tiptap/extension-paragraph@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-paragraph/-/extension-paragraph-2.27.2.tgz" + }, + "@tiptap/extension-strike@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-strike/-/extension-strike-2.27.2.tgz" + }, + "@tiptap/extension-text-align@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6": { + "integrity": "sha512-0Pyks6Hu+Q/+9+5/osoSv0SP6jIerdWMYbi13aaZLsJoj3lBj5WNaE11JtAwSFN5sx0IbqhDSlp1zkvRnzgZ8g==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-text-align/-/extension-text-align-2.27.2.tgz" + }, + "@tiptap/extension-text-style@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-text-style/-/extension-text-style-2.27.2.tgz" + }, + "@tiptap/extension-text@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6": { + "integrity": "sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-text/-/extension-text-2.27.2.tgz" + }, + "@tiptap/extension-typography@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6": { + "integrity": "sha512-NSyqDa8PlAZoVRfTWQuxueTZ6ftOD72EV7UKVpftf3C+Heme727mvwl1YHMnagOlqVoxBhFOrl9CnSs/q5uayQ==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-typography/-/extension-typography-2.27.2.tgz" + }, + "@tiptap/extension-underline@2.27.2_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6": { + "integrity": "sha512-gPOsbAcw1S07ezpAISwoO8f0RxpjcSH7VsHEFDVuXm4ODE32nhvSinvHQjv2icRLOXev+bnA7oIBu7Oy859gWQ==", + "dependencies": [ + "@tiptap/core" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/extension-underline/-/extension-underline-2.27.2.tgz" + }, + "@tiptap/pm@2.27.2_prosemirror-model@1.25.4_prosemirror-state@1.4.4_prosemirror-view@1.41.6": { + "integrity": "sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==", + "dependencies": [ + "prosemirror-changeset", + "prosemirror-collab", + "prosemirror-commands", + "prosemirror-dropcursor", + "prosemirror-gapcursor", + "prosemirror-history", + "prosemirror-inputrules", + "prosemirror-keymap", + "prosemirror-markdown", + "prosemirror-menu", + "prosemirror-model", + "prosemirror-schema-basic", + "prosemirror-schema-list", + "prosemirror-state", + "prosemirror-tables", + "prosemirror-trailing-node", + "prosemirror-transform", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/pm/-/pm-2.27.2.tgz" + }, + "@tiptap/starter-kit@2.27.2_@tiptap+pm@2.27.2__prosemirror-model@1.25.4__prosemirror-state@1.4.4__prosemirror-view@1.41.6_@tiptap+core@2.27.2__@tiptap+pm@2.27.2___prosemirror-model@1.25.4___prosemirror-state@1.4.4___prosemirror-view@1.41.6": { + "integrity": "sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==", + "dependencies": [ + "@tiptap/core", + "@tiptap/extension-blockquote", + "@tiptap/extension-bold", + "@tiptap/extension-bullet-list", + "@tiptap/extension-code", + "@tiptap/extension-code-block", + "@tiptap/extension-document", + "@tiptap/extension-dropcursor", + "@tiptap/extension-gapcursor", + "@tiptap/extension-hard-break", + "@tiptap/extension-heading", + "@tiptap/extension-history", + "@tiptap/extension-horizontal-rule", + "@tiptap/extension-italic", + "@tiptap/extension-list-item", + "@tiptap/extension-ordered-list", + "@tiptap/extension-paragraph", + "@tiptap/extension-strike", + "@tiptap/extension-text", + "@tiptap/extension-text-style", + "@tiptap/pm" + ], + "tarball": "https://verdaccio.lossless.digital/@tiptap/starter-kit/-/starter-kit-2.27.2.tgz" + }, "@tokenizer/token@0.3.0": { "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "tarball": "https://verdaccio.lossless.digital/@tokenizer/token/-/token-0.3.0.tgz" @@ -1872,6 +3292,47 @@ ], "tarball": "https://verdaccio.lossless.digital/@tsclass/tsclass/-/tsclass-9.5.0.tgz" }, + "@tybys/wasm-util@0.10.1": { + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dependencies": [ + "tslib" + ], + "tarball": "https://verdaccio.lossless.digital/@tybys/wasm-util/-/wasm-util-0.10.1.tgz" + }, + "@types/body-parser@1.19.6": { + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dependencies": [ + "@types/connect", + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/body-parser/-/body-parser-1.19.6.tgz" + }, + "@types/buffer-json@2.0.3": { + "integrity": "sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==", + "tarball": "https://verdaccio.lossless.digital/@types/buffer-json/-/buffer-json-2.0.3.tgz" + }, + "@types/clean-css@4.2.11": { + "integrity": "sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==", + "dependencies": [ + "@types/node@24.2.0", + "source-map" + ], + "tarball": "https://verdaccio.lossless.digital/@types/clean-css/-/clean-css-4.2.11.tgz" + }, + "@types/connect@3.4.38": { + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": [ + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/connect/-/connect-3.4.38.tgz" + }, + "@types/cors@2.8.19": { + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dependencies": [ + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/cors/-/cors-2.8.19.tgz" + }, "@types/debug@4.1.13": { "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dependencies": [ @@ -1879,11 +3340,30 @@ ], "tarball": "https://verdaccio.lossless.digital/@types/debug/-/debug-4.1.13.tgz" }, + "@types/express-serve-static-core@5.1.1": { + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dependencies": [ + "@types/node@24.2.0", + "@types/qs", + "@types/range-parser", + "@types/send" + ], + "tarball": "https://verdaccio.lossless.digital/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz" + }, + "@types/express@5.0.6": { + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dependencies": [ + "@types/body-parser", + "@types/express-serve-static-core", + "@types/serve-static" + ], + "tarball": "https://verdaccio.lossless.digital/@types/express/-/express-5.0.6.tgz" + }, "@types/fs-extra@11.0.4": { "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dependencies": [ "@types/jsonfile", - "@types/node" + "@types/node@24.2.0" ], "tarball": "https://verdaccio.lossless.digital/@types/fs-extra/-/fs-extra-11.0.4.tgz" }, @@ -1894,6 +3374,19 @@ ], "tarball": "https://verdaccio.lossless.digital/@types/hast/-/hast-3.0.4.tgz" }, + "@types/html-minifier@4.0.6": { + "integrity": "sha512-1Dcf38DkVMYo8SIOkUka7GxI+0BztCVsnfiG2Sxb6G8ShHDQTWQb1WKps/eb3O074HNDCn8wU7LMl5N99nNG+Q==", + "dependencies": [ + "@types/clean-css", + "@types/relateurl", + "@types/uglify-js" + ], + "tarball": "https://verdaccio.lossless.digital/@types/html-minifier/-/html-minifier-4.0.6.tgz" + }, + "@types/http-errors@2.0.5": { + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "tarball": "https://verdaccio.lossless.digital/@types/http-errors/-/http-errors-2.0.5.tgz" + }, "@types/js-yaml@3.12.10": { "integrity": "sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==", "tarball": "https://verdaccio.lossless.digital/@types/js-yaml/-/js-yaml-3.12.10.tgz" @@ -1905,7 +3398,7 @@ "@types/jsonfile@6.1.4": { "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", "dependencies": [ - "@types/node" + "@types/node@24.2.0" ], "tarball": "https://verdaccio.lossless.digital/@types/jsonfile/-/jsonfile-6.1.4.tgz" }, @@ -1913,10 +3406,22 @@ "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", "dependencies": [ "@types/ms", - "@types/node" + "@types/node@24.2.0" ], "tarball": "https://verdaccio.lossless.digital/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz" }, + "@types/linkify-it@5.0.0": { + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "tarball": "https://verdaccio.lossless.digital/@types/linkify-it/-/linkify-it-5.0.0.tgz" + }, + "@types/markdown-it@14.1.2": { + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dependencies": [ + "@types/linkify-it", + "@types/mdurl" + ], + "tarball": "https://verdaccio.lossless.digital/@types/markdown-it/-/markdown-it-14.1.2.tgz" + }, "@types/mdast@4.0.4": { "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": [ @@ -1924,6 +3429,10 @@ ], "tarball": "https://verdaccio.lossless.digital/@types/mdast/-/mdast-4.0.4.tgz" }, + "@types/mdurl@2.0.0": { + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "tarball": "https://verdaccio.lossless.digital/@types/mdurl/-/mdurl-2.0.0.tgz" + }, "@types/mime-types@2.1.4": { "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", "tarball": "https://verdaccio.lossless.digital/@types/mime-types/-/mime-types-2.1.4.tgz" @@ -1936,20 +3445,65 @@ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "tarball": "https://verdaccio.lossless.digital/@types/ms/-/ms-2.1.0.tgz" }, + "@types/mute-stream@0.0.4": { + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dependencies": [ + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/mute-stream/-/mute-stream-0.0.4.tgz" + }, "@types/node-forge@1.3.14": { "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "dependencies": [ - "@types/node" + "@types/node@24.2.0" ], "tarball": "https://verdaccio.lossless.digital/@types/node-forge/-/node-forge-1.3.14.tgz" }, + "@types/node@22.19.15": { + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", + "dependencies": [ + "undici-types@6.21.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/node/-/node-22.19.15.tgz" + }, "@types/node@24.2.0": { "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", "dependencies": [ - "undici-types" + "undici-types@7.10.0" ], "tarball": "https://verdaccio.lossless.digital/@types/node/-/node-24.2.0.tgz" }, + "@types/qs@6.15.0": { + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "tarball": "https://verdaccio.lossless.digital/@types/qs/-/qs-6.15.0.tgz" + }, + "@types/randomatic@3.1.5": { + "integrity": "sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==", + "tarball": "https://verdaccio.lossless.digital/@types/randomatic/-/randomatic-3.1.5.tgz" + }, + "@types/range-parser@1.2.7": { + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "tarball": "https://verdaccio.lossless.digital/@types/range-parser/-/range-parser-1.2.7.tgz" + }, + "@types/relateurl@0.2.33": { + "integrity": "sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==", + "tarball": "https://verdaccio.lossless.digital/@types/relateurl/-/relateurl-0.2.33.tgz" + }, + "@types/send@1.2.1": { + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dependencies": [ + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/send/-/send-1.2.1.tgz" + }, + "@types/serve-static@2.2.0": { + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dependencies": [ + "@types/http-errors", + "@types/node@24.2.0" + ], + "tarball": "https://verdaccio.lossless.digital/@types/serve-static/-/serve-static-2.2.0.tgz" + }, "@types/symbol-tree@3.2.5": { "integrity": "sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==", "tarball": "https://verdaccio.lossless.digital/@types/symbol-tree/-/symbol-tree-3.2.5.tgz" @@ -1957,7 +3511,7 @@ "@types/through2@2.0.41": { "integrity": "sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==", "dependencies": [ - "@types/node" + "@types/node@24.2.0" ], "tarball": "https://verdaccio.lossless.digital/@types/through2/-/through2-2.0.41.tgz" }, @@ -1969,6 +3523,13 @@ "integrity": "sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==", "tarball": "https://verdaccio.lossless.digital/@types/turndown/-/turndown-5.0.6.tgz" }, + "@types/uglify-js@3.17.5": { + "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", + "dependencies": [ + "source-map" + ], + "tarball": "https://verdaccio.lossless.digital/@types/uglify-js/-/uglify-js-3.17.5.tgz" + }, "@types/unist@3.0.3": { "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "tarball": "https://verdaccio.lossless.digital/@types/unist/-/unist-3.0.3.tgz" @@ -1999,10 +3560,30 @@ "integrity": "sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==", "tarball": "https://verdaccio.lossless.digital/@types/which/-/which-3.0.4.tgz" }, + "@types/wrap-ansi@3.0.0": { + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "tarball": "https://verdaccio.lossless.digital/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" + }, "@ungap/structured-clone@1.3.0": { "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "tarball": "https://verdaccio.lossless.digital/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" }, + "accepts@1.3.8": { + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": [ + "mime-types@2.1.35", + "negotiator@0.6.3" + ], + "tarball": "https://verdaccio.lossless.digital/accepts/-/accepts-1.3.8.tgz" + }, + "accepts@2.0.0": { + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": [ + "mime-types@3.0.2", + "negotiator@1.0.0" + ], + "tarball": "https://verdaccio.lossless.digital/accepts/-/accepts-2.0.0.tgz" + }, "adm-zip@0.5.16": { "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "tarball": "https://verdaccio.lossless.digital/adm-zip/-/adm-zip-0.5.16.tgz" @@ -2022,6 +3603,13 @@ "integrity": "910de50efcc7c09e3d82f2f87abd6b700c18818a", "tarball": "https://verdaccio.lossless.digital/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz" }, + "ansi-escapes@4.3.2": { + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": [ + "type-fest@0.21.3" + ], + "tarball": "https://verdaccio.lossless.digital/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + }, "ansi-regex@5.0.1": { "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "tarball": "https://verdaccio.lossless.digital/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -2033,6 +3621,10 @@ ], "tarball": "https://verdaccio.lossless.digital/ansi-styles/-/ansi-styles-4.3.0.tgz" }, + "apexcharts@5.10.4": { + "integrity": "sha512-gt0VUqZ2+mr25ScbUcKZgJr96jKYm4vjOcxEWCEh/E5F4dWqhyo3dBhPRvNNnkKiWxkMd2cBwj3ZYH3rK39fkA==", + "tarball": "https://verdaccio.lossless.digital/apexcharts/-/apexcharts-5.10.4.tgz" + }, "argparse@1.0.10": { "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": [ @@ -2116,10 +3708,41 @@ ], "tarball": "https://verdaccio.lossless.digital/bare-url/-/bare-url-2.4.0.tgz" }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "tarball": "https://verdaccio.lossless.digital/base64-js/-/base64-js-1.5.1.tgz" + }, + "base64id@2.0.0": { + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "tarball": "https://verdaccio.lossless.digital/base64id/-/base64id-2.0.0.tgz" + }, + "body-parser@2.2.2": { + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dependencies": [ + "bytes", + "content-type", + "debug@4.4.3", + "http-errors", + "iconv-lite@0.7.2", + "on-finished", + "qs", + "raw-body", + "type-is" + ], + "tarball": "https://verdaccio.lossless.digital/body-parser/-/body-parser-2.2.2.tgz" + }, "bowser@2.14.1": { "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "tarball": "https://verdaccio.lossless.digital/bowser/-/bowser-2.14.1.tgz" }, + "brace-expansion@1.1.12": { + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": [ + "balanced-match@1.0.2", + "concat-map" + ], + "tarball": "https://verdaccio.lossless.digital/brace-expansion/-/brace-expansion-1.1.12.tgz" + }, "brace-expansion@2.0.2": { "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": [ @@ -2160,6 +3783,22 @@ "integrity": "f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819", "tarball": "https://verdaccio.lossless.digital/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" }, + "buffer-json@2.0.0": { + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "tarball": "https://verdaccio.lossless.digital/buffer-json/-/buffer-json-2.0.0.tgz" + }, + "buffer@6.0.3": { + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dependencies": [ + "base64-js", + "ieee754" + ], + "tarball": "https://verdaccio.lossless.digital/buffer/-/buffer-6.0.3.tgz" + }, + "bytes@3.1.2": { + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "tarball": "https://verdaccio.lossless.digital/bytes/-/bytes-3.1.2.tgz" + }, "call-bind-apply-helpers@1.0.2": { "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": [ @@ -2178,6 +3817,26 @@ ], "tarball": "https://verdaccio.lossless.digital/call-bind/-/call-bind-1.0.8.tgz" }, + "call-bound@1.0.4": { + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": [ + "call-bind-apply-helpers", + "get-intrinsic" + ], + "tarball": "https://verdaccio.lossless.digital/call-bound/-/call-bound-1.0.4.tgz" + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "tarball": "https://verdaccio.lossless.digital/callsites/-/callsites-3.1.0.tgz" + }, + "camel-case@3.0.0": { + "integrity": "ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73", + "dependencies": [ + "no-case", + "upper-case" + ], + "tarball": "https://verdaccio.lossless.digital/camel-case/-/camel-case-3.0.0.tgz" + }, "camelcase@6.3.0": { "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "tarball": "https://verdaccio.lossless.digital/camelcase/-/camelcase-6.3.0.tgz" @@ -2186,14 +3845,6 @@ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "tarball": "https://verdaccio.lossless.digital/ccount/-/ccount-2.0.1.tgz" }, - "chalk@4.1.2": { - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": [ - "ansi-styles", - "supports-color@7.2.0" - ], - "tarball": "https://verdaccio.lossless.digital/chalk/-/chalk-4.1.2.tgz" - }, "character-entities-html4@2.1.0": { "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "tarball": "https://verdaccio.lossless.digital/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -2206,14 +3857,31 @@ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "tarball": "https://verdaccio.lossless.digital/character-entities/-/character-entities-2.0.2.tgz" }, - "cliui@8.0.1": { - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "chardet@0.7.0": { + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "tarball": "https://verdaccio.lossless.digital/chardet/-/chardet-0.7.0.tgz" + }, + "chokidar@5.0.0": { + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dependencies": [ - "string-width", - "strip-ansi", - "wrap-ansi" + "readdirp" ], - "tarball": "https://verdaccio.lossless.digital/cliui/-/cliui-8.0.1.tgz" + "tarball": "https://verdaccio.lossless.digital/chokidar/-/chokidar-5.0.0.tgz" + }, + "clean-css@4.2.4": { + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": [ + "source-map" + ], + "tarball": "https://verdaccio.lossless.digital/clean-css/-/clean-css-4.2.4.tgz" + }, + "clean-stack@1.3.0": { + "integrity": "9e821501ae979986c46b1d66d2d432db2fd4ae31", + "tarball": "https://verdaccio.lossless.digital/clean-stack/-/clean-stack-1.3.0.tgz" + }, + "cli-width@4.1.0": { + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "tarball": "https://verdaccio.lossless.digital/cli-width/-/cli-width-4.1.0.tgz" }, "color-convert@2.0.1": { "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2237,22 +3905,45 @@ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "tarball": "https://verdaccio.lossless.digital/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" }, + "commander@2.20.3": { + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "tarball": "https://verdaccio.lossless.digital/commander/-/commander-2.20.3.tgz" + }, "commondir@1.0.1": { "integrity": "ddd800da0c66127393cca5950ea968a3aaf1253b", "tarball": "https://verdaccio.lossless.digital/commondir/-/commondir-1.0.1.tgz" }, - "concurrently@9.2.1": { - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "concat-map@0.0.1": { + "integrity": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "tarball": "https://verdaccio.lossless.digital/concat-map/-/concat-map-0.0.1.tgz" + }, + "content-disposition@1.0.1": { + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "tarball": "https://verdaccio.lossless.digital/content-disposition/-/content-disposition-1.0.1.tgz" + }, + "content-type@1.0.5": { + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "tarball": "https://verdaccio.lossless.digital/content-type/-/content-type-1.0.5.tgz" + }, + "cookie-signature@1.2.2": { + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "tarball": "https://verdaccio.lossless.digital/cookie-signature/-/cookie-signature-1.2.2.tgz" + }, + "cookie@0.7.2": { + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "tarball": "https://verdaccio.lossless.digital/cookie/-/cookie-0.7.2.tgz" + }, + "cors@2.8.6": { + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dependencies": [ - "chalk", - "rxjs", - "shell-quote", - "supports-color@8.1.1", - "tree-kill", - "yargs" + "object-assign", + "vary" ], - "bin": true, - "tarball": "https://verdaccio.lossless.digital/concurrently/-/concurrently-9.2.1.tgz" + "tarball": "https://verdaccio.lossless.digital/cors/-/cors-2.8.6.tgz" + }, + "crelt@1.0.6": { + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "tarball": "https://verdaccio.lossless.digital/crelt/-/crelt-1.0.6.tgz" }, "croner@10.0.1": { "integrity": "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==", @@ -2267,6 +3958,13 @@ ], "tarball": "https://verdaccio.lossless.digital/cross-spawn/-/cross-spawn-7.0.6.tgz" }, + "crypto-random-string@5.0.0": { + "integrity": "sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==", + "dependencies": [ + "type-fest@2.19.0" + ], + "tarball": "https://verdaccio.lossless.digital/crypto-random-string/-/crypto-random-string-5.0.0.tgz" + }, "date-fns@4.1.0": { "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "tarball": "https://verdaccio.lossless.digital/date-fns/-/date-fns-4.1.0.tgz" @@ -2275,6 +3973,13 @@ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "tarball": "https://verdaccio.lossless.digital/dayjs/-/dayjs-1.11.20.tgz" }, + "debug@4.3.7": { + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": [ + "ms" + ], + "tarball": "https://verdaccio.lossless.digital/debug/-/debug-4.3.7.tgz" + }, "debug@4.4.3": { "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": [ @@ -2298,6 +4003,10 @@ ], "tarball": "https://verdaccio.lossless.digital/define-data-property/-/define-data-property-1.1.4.tgz" }, + "define-lazy-prop@2.0.0": { + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "tarball": "https://verdaccio.lossless.digital/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + }, "define-properties@1.2.1": { "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": [ @@ -2311,6 +4020,10 @@ "integrity": "df3ae199acadfb7d440aaae0b29e2272b24ec619", "tarball": "https://verdaccio.lossless.digital/delayed-stream/-/delayed-stream-1.0.0.tgz" }, + "depd@2.0.0": { + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "tarball": "https://verdaccio.lossless.digital/depd/-/depd-2.0.0.tgz" + }, "dequal@2.0.3": { "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "tarball": "https://verdaccio.lossless.digital/dequal/-/dequal-2.0.3.tgz" @@ -2322,6 +4035,13 @@ ], "tarball": "https://verdaccio.lossless.digital/devlop/-/devlop-1.1.0.tgz" }, + "dompurify@3.2.7": { + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "optionalDependencies": [ + "@types/trusted-types" + ], + "tarball": "https://verdaccio.lossless.digital/dompurify/-/dompurify-3.2.7.tgz" + }, "dunder-proto@1.0.1": { "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": [ @@ -2338,10 +4058,52 @@ ], "tarball": "https://verdaccio.lossless.digital/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" }, + "ee-first@1.1.1": { + "integrity": "590c61156b0ae2f4f0255732a158b266bc56b21d", + "tarball": "https://verdaccio.lossless.digital/ee-first/-/ee-first-1.1.1.tgz" + }, "emoji-regex@8.0.0": { "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "tarball": "https://verdaccio.lossless.digital/emoji-regex/-/emoji-regex-8.0.0.tgz" }, + "encodeurl@2.0.0": { + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "tarball": "https://verdaccio.lossless.digital/encodeurl/-/encodeurl-2.0.0.tgz" + }, + "engine.io-client@6.6.4": { + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "dependencies": [ + "@socket.io/component-emitter", + "debug@4.4.3", + "engine.io-parser", + "ws@8.18.3", + "xmlhttprequest-ssl" + ], + "tarball": "https://verdaccio.lossless.digital/engine.io-client/-/engine.io-client-6.6.4.tgz" + }, + "engine.io-parser@5.2.3": { + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "tarball": "https://verdaccio.lossless.digital/engine.io-parser/-/engine.io-parser-5.2.3.tgz" + }, + "engine.io@6.6.4": { + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dependencies": [ + "@types/cors", + "@types/node@24.2.0", + "accepts@1.3.8", + "base64id", + "cookie", + "cors", + "debug@4.3.7", + "engine.io-parser", + "ws@8.17.1" + ], + "tarball": "https://verdaccio.lossless.digital/engine.io/-/engine.io-6.6.4.tgz" + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "tarball": "https://verdaccio.lossless.digital/entities/-/entities-4.5.0.tgz" + }, "es-define-property@1.0.1": { "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "tarball": "https://verdaccio.lossless.digital/es-define-property/-/es-define-property-1.0.1.tgz" @@ -2367,19 +4129,65 @@ ], "tarball": "https://verdaccio.lossless.digital/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" }, - "escalade@3.2.0": { - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "tarball": "https://verdaccio.lossless.digital/escalade/-/escalade-3.2.0.tgz" + "esbuild@0.27.4": { + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "optionalDependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/openharmony-arm64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ], + "scripts": true, + "bin": true, + "tarball": "https://verdaccio.lossless.digital/esbuild/-/esbuild-0.27.4.tgz" + }, + "escape-html@1.0.3": { + "integrity": "0258eae4d3d0c0974de1c169188ef0051d1d1988", + "tarball": "https://verdaccio.lossless.digital/escape-html/-/escape-html-1.0.3.tgz" + }, + "escape-string-regexp@4.0.0": { + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "tarball": "https://verdaccio.lossless.digital/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" }, "escape-string-regexp@5.0.0": { "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "tarball": "https://verdaccio.lossless.digital/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" }, + "esm@3.2.25": { + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "tarball": "https://verdaccio.lossless.digital/esm/-/esm-3.2.25.tgz" + }, "esprima@4.0.1": { "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": true, "tarball": "https://verdaccio.lossless.digital/esprima/-/esprima-4.0.1.tgz" }, + "etag@1.8.1": { + "integrity": "41ae2eeb65efa62268aebfea83ac7d79299b0887", + "tarball": "https://verdaccio.lossless.digital/etag/-/etag-1.8.1.tgz" + }, "eventemitter3@4.0.7": { "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "tarball": "https://verdaccio.lossless.digital/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -2391,14 +4199,68 @@ ], "tarball": "https://verdaccio.lossless.digital/events-universal/-/events-universal-1.0.1.tgz" }, + "express-force-ssl@0.3.2": { + "integrity": "01b2b498ae6fd2e41152b22b57a3e173773af67e", + "dependencies": [ + "lodash.assign" + ], + "tarball": "https://verdaccio.lossless.digital/express-force-ssl/-/express-force-ssl-0.3.2.tgz" + }, + "express@5.2.1": { + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dependencies": [ + "accepts@2.0.0", + "body-parser", + "content-disposition", + "content-type", + "cookie", + "cookie-signature", + "debug@4.4.3", + "depd", + "encodeurl", + "escape-html", + "etag", + "finalhandler", + "fresh", + "http-errors", + "merge-descriptors", + "mime-types@3.0.2", + "on-finished", + "once", + "parseurl", + "proxy-addr", + "qs", + "range-parser", + "router", + "send", + "serve-static", + "statuses", + "type-is", + "vary" + ], + "tarball": "https://verdaccio.lossless.digital/express/-/express-5.2.1.tgz" + }, "extend@3.0.2": { "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "tarball": "https://verdaccio.lossless.digital/extend/-/extend-3.0.2.tgz" }, + "external-editor@3.1.0": { + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": [ + "chardet", + "iconv-lite@0.4.24", + "tmp" + ], + "tarball": "https://verdaccio.lossless.digital/external-editor/-/external-editor-3.1.0.tgz" + }, "fake-indexeddb@5.0.2": { "integrity": "sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==", "tarball": "https://verdaccio.lossless.digital/fake-indexeddb/-/fake-indexeddb-5.0.2.tgz" }, + "fake-indexeddb@6.2.5": { + "integrity": "sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==", + "tarball": "https://verdaccio.lossless.digital/fake-indexeddb/-/fake-indexeddb-6.2.5.tgz" + }, "fast-deep-equal@3.1.3": { "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "tarball": "https://verdaccio.lossless.digital/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -2418,12 +4280,20 @@ ], "tarball": "https://verdaccio.lossless.digital/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz" }, + "fast-xml-parser@4.5.4": { + "integrity": "sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==", + "dependencies": [ + "strnum@1.1.2" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/fast-xml-parser/-/fast-xml-parser-4.5.4.tgz" + }, "fast-xml-parser@5.5.6": { "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", "dependencies": [ "fast-xml-builder", "path-expression-matcher", - "strnum" + "strnum@2.2.1" ], "bin": true, "tarball": "https://verdaccio.lossless.digital/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz" @@ -2445,6 +4315,18 @@ ], "tarball": "https://verdaccio.lossless.digital/file-type/-/file-type-19.6.0.tgz" }, + "finalhandler@2.1.1": { + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dependencies": [ + "debug@4.4.3", + "encodeurl", + "escape-html", + "on-finished", + "parseurl", + "statuses" + ], + "tarball": "https://verdaccio.lossless.digital/finalhandler/-/finalhandler-2.1.1.tgz" + }, "find-cache-dir@3.3.2": { "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dependencies": [ @@ -2466,11 +4348,19 @@ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "tarball": "https://verdaccio.lossless.digital/follow-redirects/-/follow-redirects-1.15.11.tgz" }, + "foreground-child@2.0.0": { + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dependencies": [ + "cross-spawn", + "signal-exit@3.0.7" + ], + "tarball": "https://verdaccio.lossless.digital/foreground-child/-/foreground-child-2.0.0.tgz" + }, "foreground-child@3.3.1": { "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dependencies": [ "cross-spawn", - "signal-exit" + "signal-exit@4.1.0" ], "tarball": "https://verdaccio.lossless.digital/foreground-child/-/foreground-child-3.3.1.tgz" }, @@ -2481,7 +4371,7 @@ "combined-stream", "es-set-tostringtag", "hasown", - "mime-types" + "mime-types@2.1.35" ], "tarball": "https://verdaccio.lossless.digital/form-data/-/form-data-4.0.5.tgz" }, @@ -2489,6 +4379,14 @@ "integrity": "d6170107e9efdc4ed30c9dc39016df942b5cb58b", "tarball": "https://verdaccio.lossless.digital/format/-/format-0.2.2.tgz" }, + "forwarded@0.2.0": { + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "tarball": "https://verdaccio.lossless.digital/forwarded/-/forwarded-0.2.0.tgz" + }, + "fresh@2.0.0": { + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "tarball": "https://verdaccio.lossless.digital/fresh/-/fresh-2.0.0.tgz" + }, "fs-extra@11.3.4": { "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dependencies": [ @@ -2498,14 +4396,20 @@ ], "tarball": "https://verdaccio.lossless.digital/fs-extra/-/fs-extra-11.3.4.tgz" }, + "fs.realpath@1.0.0": { + "integrity": "1504ad2523158caa40db4a2787cb01411994ea4f", + "tarball": "https://verdaccio.lossless.digital/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true, + "tarball": "https://verdaccio.lossless.digital/fsevents/-/fsevents-2.3.3.tgz" + }, "function-bind@1.1.2": { "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "tarball": "https://verdaccio.lossless.digital/function-bind/-/function-bind-1.1.2.tgz" }, - "get-caller-file@2.0.5": { - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "tarball": "https://verdaccio.lossless.digital/get-caller-file/-/get-caller-file-2.0.5.tgz" - }, "get-intrinsic@1.3.0": { "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": [ @@ -2538,10 +4442,17 @@ ], "tarball": "https://verdaccio.lossless.digital/get-stream/-/get-stream-9.0.1.tgz" }, + "get-tsconfig@4.13.6": { + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dependencies": [ + "resolve-pkg-maps" + ], + "tarball": "https://verdaccio.lossless.digital/get-tsconfig/-/get-tsconfig-4.13.6.tgz" + }, "glob@11.1.0": { "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dependencies": [ - "foreground-child", + "foreground-child@3.3.1", "jackspeak", "minimatch@10.2.4", "minipass", @@ -2551,6 +4462,18 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/glob/-/glob-11.1.0.tgz" }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch@3.1.5", + "once", + "path-is-absolute" + ], + "tarball": "https://verdaccio.lossless.digital/glob/-/glob-7.2.3.tgz" + }, "gopd@1.2.0": { "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "tarball": "https://verdaccio.lossless.digital/gopd/-/gopd-1.2.0.tgz" @@ -2559,9 +4482,14 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "tarball": "https://verdaccio.lossless.digital/graceful-fs/-/graceful-fs-4.2.11.tgz" }, - "has-flag@4.0.0": { - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "tarball": "https://verdaccio.lossless.digital/has-flag/-/has-flag-4.0.0.tgz" + "happy-dom@15.11.7": { + "integrity": "sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==", + "dependencies": [ + "entities", + "webidl-conversions", + "whatwg-mimetype" + ], + "tarball": "https://verdaccio.lossless.digital/happy-dom/-/happy-dom-15.11.7.tgz" }, "has-property-descriptors@1.0.2": { "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", @@ -2621,15 +4549,49 @@ ], "tarball": "https://verdaccio.lossless.digital/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" }, + "he@1.2.0": { + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/he/-/he-1.2.0.tgz" + }, + "highlight.js@11.11.1": { + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "tarball": "https://verdaccio.lossless.digital/highlight.js/-/highlight.js-11.11.1.tgz" + }, + "html-minifier@4.0.0": { + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": [ + "camel-case", + "clean-css", + "commander", + "he", + "param-case", + "relateurl", + "uglify-js" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/html-minifier/-/html-minifier-4.0.0.tgz" + }, "html-void-elements@3.0.0": { "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "tarball": "https://verdaccio.lossless.digital/html-void-elements/-/html-void-elements-3.0.0.tgz" }, + "http-errors@2.0.1": { + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dependencies": [ + "depd", + "inherits", + "setprototypeof", + "statuses", + "toidentifier" + ], + "tarball": "https://verdaccio.lossless.digital/http-errors/-/http-errors-2.0.1.tgz" + }, "https-proxy-agent@7.0.6": { "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dependencies": [ "agent-base", - "debug" + "debug@4.4.3" ], "tarball": "https://verdaccio.lossless.digital/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" }, @@ -2640,14 +4602,63 @@ ], "tarball": "https://verdaccio.lossless.digital/humanize-ms/-/humanize-ms-1.2.1.tgz" }, + "ibantools@4.5.1": { + "integrity": "sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==", + "tarball": "https://verdaccio.lossless.digital/ibantools/-/ibantools-4.5.1.tgz" + }, + "iconv-lite@0.4.24": { + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": [ + "safer-buffer" + ], + "tarball": "https://verdaccio.lossless.digital/iconv-lite/-/iconv-lite-0.4.24.tgz" + }, + "iconv-lite@0.7.2": { + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": [ + "safer-buffer" + ], + "tarball": "https://verdaccio.lossless.digital/iconv-lite/-/iconv-lite-0.7.2.tgz" + }, "ieee754@1.2.1": { "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "tarball": "https://verdaccio.lossless.digital/ieee754/-/ieee754-1.2.1.tgz" }, + "inflight@1.0.6": { + "integrity": "49bd6331d7d02d0c09bc910a1075ba8165b56df9", + "dependencies": [ + "once", + "wrappy" + ], + "tarball": "https://verdaccio.lossless.digital/inflight/-/inflight-1.0.6.tgz" + }, "inherits@2.0.4": { "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "tarball": "https://verdaccio.lossless.digital/inherits/-/inherits-2.0.4.tgz" }, + "inquirer@11.1.0": { + "integrity": "sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==", + "dependencies": [ + "@inquirer/core", + "@inquirer/prompts", + "@inquirer/type", + "@types/mute-stream", + "ansi-escapes", + "mute-stream", + "run-async", + "rxjs" + ], + "tarball": "https://verdaccio.lossless.digital/inquirer/-/inquirer-11.1.0.tgz" + }, + "ipaddr.js@1.9.1": { + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "tarball": "https://verdaccio.lossless.digital/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + }, + "is-docker@2.2.1": { + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/is-docker/-/is-docker-2.2.1.tgz" + }, "is-fullwidth-code-point@3.0.0": { "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "tarball": "https://verdaccio.lossless.digital/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" @@ -2660,14 +4671,37 @@ ], "tarball": "https://verdaccio.lossless.digital/is-nan/-/is-nan-1.3.2.tgz" }, + "is-number@4.0.0": { + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "tarball": "https://verdaccio.lossless.digital/is-number/-/is-number-4.0.0.tgz" + }, + "is-observable@2.1.0": { + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "tarball": "https://verdaccio.lossless.digital/is-observable/-/is-observable-2.1.0.tgz" + }, "is-plain-obj@4.1.0": { "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "tarball": "https://verdaccio.lossless.digital/is-plain-obj/-/is-plain-obj-4.1.0.tgz" }, + "is-promise@4.0.0": { + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "tarball": "https://verdaccio.lossless.digital/is-promise/-/is-promise-4.0.0.tgz" + }, "is-stream@4.0.1": { "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "tarball": "https://verdaccio.lossless.digital/is-stream/-/is-stream-4.0.1.tgz" }, + "is-windows@1.0.2": { + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "tarball": "https://verdaccio.lossless.digital/is-windows/-/is-windows-1.0.2.tgz" + }, + "is-wsl@2.2.0": { + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": [ + "is-docker" + ], + "tarball": "https://verdaccio.lossless.digital/is-wsl/-/is-wsl-2.2.0.tgz" + }, "isexe@2.0.0": { "integrity": "e8fbf374dc556ff8947a10dcb0572d633f2cfa10", "tarball": "https://verdaccio.lossless.digital/isexe/-/isexe-2.0.0.tgz" @@ -2683,6 +4717,10 @@ ], "tarball": "https://verdaccio.lossless.digital/jackspeak/-/jackspeak-4.2.3.tgz" }, + "js-base64@3.7.8": { + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "tarball": "https://verdaccio.lossless.digital/js-base64/-/js-base64-3.7.8.tgz" + }, "js-yaml@3.14.2": { "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dependencies": [ @@ -2743,6 +4781,21 @@ ], "tarball": "https://verdaccio.lossless.digital/jws/-/jws-4.0.1.tgz" }, + "kind-of@6.0.3": { + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "tarball": "https://verdaccio.lossless.digital/kind-of/-/kind-of-6.0.3.tgz" + }, + "linkify-it@5.0.0": { + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": [ + "uc.micro" + ], + "tarball": "https://verdaccio.lossless.digital/linkify-it/-/linkify-it-5.0.0.tgz" + }, + "linkifyjs@4.3.2": { + "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", + "tarball": "https://verdaccio.lossless.digital/linkifyjs/-/linkifyjs-4.3.2.tgz" + }, "lit-element@4.2.2": { "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", "dependencies": [ @@ -2775,6 +4828,48 @@ ], "tarball": "https://verdaccio.lossless.digital/locate-path/-/locate-path-5.0.0.tgz" }, + "lodash._baseassign@3.2.0": { + "integrity": "8c38a099500f215ad09e59f1722fd0c52bfe0a4e", + "dependencies": [ + "lodash._basecopy", + "lodash.keys" + ], + "tarball": "https://verdaccio.lossless.digital/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz" + }, + "lodash._basecopy@3.0.1": { + "integrity": "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36", + "tarball": "https://verdaccio.lossless.digital/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" + }, + "lodash._bindcallback@3.0.1": { + "integrity": "e531c27644cf8b57a99e17ed95b35c748789392e", + "tarball": "https://verdaccio.lossless.digital/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" + }, + "lodash._createassigner@3.1.1": { + "integrity": "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11", + "dependencies": [ + "lodash._bindcallback", + "lodash._isiterateecall", + "lodash.restparam" + ], + "tarball": "https://verdaccio.lossless.digital/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz" + }, + "lodash._getnative@3.9.1": { + "integrity": "570bc7dede46d61cdcde687d65d3eecbaa3aaff5", + "tarball": "https://verdaccio.lossless.digital/lodash._getnative/-/lodash._getnative-3.9.1.tgz" + }, + "lodash._isiterateecall@3.0.9": { + "integrity": "5203ad7ba425fae842460e696db9cf3e6aac057c", + "tarball": "https://verdaccio.lossless.digital/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" + }, + "lodash.assign@3.2.0": { + "integrity": "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa", + "dependencies": [ + "lodash._baseassign", + "lodash._createassigner", + "lodash.keys" + ], + "tarball": "https://verdaccio.lossless.digital/lodash.assign/-/lodash.assign-3.2.0.tgz" + }, "lodash.clonedeep@4.5.0": { "integrity": "e23f3f9c4f8fbdde872529c1071857a086e5ccef", "tarball": "https://verdaccio.lossless.digital/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" @@ -2783,6 +4878,14 @@ "integrity": "60bb98a87cb923c68ca1e51325483314849f553f", "tarball": "https://verdaccio.lossless.digital/lodash.includes/-/lodash.includes-4.3.0.tgz" }, + "lodash.isarguments@3.1.0": { + "integrity": "2f573d85c6a24289ff00663b491c1d338ff3458a", + "tarball": "https://verdaccio.lossless.digital/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz" + }, + "lodash.isarray@3.0.4": { + "integrity": "79e4eb88c36a8122af86f844aa9bcd851b5fbb55", + "tarball": "https://verdaccio.lossless.digital/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + }, "lodash.isboolean@3.0.3": { "integrity": "6c2e171db2a257cd96802fd43b01b20d5f5870f6", "tarball": "https://verdaccio.lossless.digital/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" @@ -2803,18 +4906,39 @@ "integrity": "d527dfb5456eca7cc9bb95d5daeaf88ba54a5451", "tarball": "https://verdaccio.lossless.digital/lodash.isstring/-/lodash.isstring-4.0.1.tgz" }, + "lodash.keys@3.1.2": { + "integrity": "4dbc0472b156be50a0b286855d1bd0b0c656098a", + "dependencies": [ + "lodash._getnative", + "lodash.isarguments", + "lodash.isarray" + ], + "tarball": "https://verdaccio.lossless.digital/lodash.keys/-/lodash.keys-3.1.2.tgz" + }, "lodash.once@4.1.1": { "integrity": "0dd3971213c7c56df880977d504c88fb471a97ac", "tarball": "https://verdaccio.lossless.digital/lodash.once/-/lodash.once-4.1.1.tgz" }, + "lodash.restparam@3.6.1": { + "integrity": "936a4e309ef330a7645ed4145986c85ae5b20805", + "tarball": "https://verdaccio.lossless.digital/lodash.restparam/-/lodash.restparam-3.6.1.tgz" + }, "longest-streak@3.1.0": { "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "tarball": "https://verdaccio.lossless.digital/longest-streak/-/longest-streak-3.1.0.tgz" }, + "lower-case@1.1.4": { + "integrity": "9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac", + "tarball": "https://verdaccio.lossless.digital/lower-case/-/lower-case-1.1.4.tgz" + }, "lru-cache@11.2.7": { "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "tarball": "https://verdaccio.lossless.digital/lru-cache/-/lru-cache-11.2.7.tgz" }, + "lucide@0.577.0": { + "integrity": "sha512-PpC/m5eOItp/WU/GlQPFBXDOhq6HibL73KzYP37OX3LM7VmzWQF8voEj8QRWUFvy9FIKfeDQkWYoyS1D/MdWFA==", + "tarball": "https://verdaccio.lossless.digital/lucide/-/lucide-0.577.0.tgz" + }, "make-dir@3.1.0": { "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": [ @@ -2822,14 +4946,43 @@ ], "tarball": "https://verdaccio.lossless.digital/make-dir/-/make-dir-3.1.0.tgz" }, + "make-error-cause@2.3.0": { + "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", + "dependencies": [ + "make-error" + ], + "tarball": "https://verdaccio.lossless.digital/make-error-cause/-/make-error-cause-2.3.0.tgz" + }, + "make-error@1.3.6": { + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "tarball": "https://verdaccio.lossless.digital/make-error/-/make-error-1.3.6.tgz" + }, + "markdown-it@14.1.1": { + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dependencies": [ + "argparse@2.0.1", + "entities", + "linkify-it", + "mdurl", + "punycode.js", + "uc.micro" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/markdown-it/-/markdown-it-14.1.1.tgz" + }, "markdown-table@3.0.4": { "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "tarball": "https://verdaccio.lossless.digital/markdown-table/-/markdown-table-3.0.4.tgz" }, + "marked@14.0.0": { + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/marked/-/marked-14.0.0.tgz" + }, "matcher@5.0.0": { "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dependencies": [ - "escape-string-regexp" + "escape-string-regexp@5.0.0" ], "tarball": "https://verdaccio.lossless.digital/matcher/-/matcher-5.0.0.tgz" }, @@ -2837,11 +4990,15 @@ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "tarball": "https://verdaccio.lossless.digital/math-intrinsics/-/math-intrinsics-1.1.0.tgz" }, + "math-random@1.0.4": { + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "tarball": "https://verdaccio.lossless.digital/math-random/-/math-random-1.0.4.tgz" + }, "mdast-util-find-and-replace@3.0.2": { "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dependencies": [ "@types/mdast", - "escape-string-regexp", + "escape-string-regexp@5.0.0", "unist-util-is", "unist-util-visit-parents" ], @@ -2870,7 +5027,7 @@ "dependencies": [ "@types/mdast", "devlop", - "escape-string-regexp", + "escape-string-regexp@5.0.0", "mdast-util-from-markdown", "mdast-util-to-markdown", "micromark-extension-frontmatter" @@ -2987,10 +5144,22 @@ ], "tarball": "https://verdaccio.lossless.digital/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" }, + "mdurl@2.0.0": { + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "tarball": "https://verdaccio.lossless.digital/mdurl/-/mdurl-2.0.0.tgz" + }, + "media-typer@1.1.0": { + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "tarball": "https://verdaccio.lossless.digital/media-typer/-/media-typer-1.1.0.tgz" + }, "memory-pager@1.5.0": { "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "tarball": "https://verdaccio.lossless.digital/memory-pager/-/memory-pager-1.5.0.tgz" }, + "merge-descriptors@2.0.0": { + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "tarball": "https://verdaccio.lossless.digital/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + }, "micromark-core-commonmark@2.0.3": { "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "dependencies": [ @@ -3251,7 +5420,7 @@ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dependencies": [ "@types/debug", - "debug", + "debug@4.4.3", "decode-named-character-reference", "devlop", "micromark-core-commonmark", @@ -3274,13 +5443,24 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "tarball": "https://verdaccio.lossless.digital/mime-db/-/mime-db-1.52.0.tgz" }, + "mime-db@1.54.0": { + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "tarball": "https://verdaccio.lossless.digital/mime-db/-/mime-db-1.54.0.tgz" + }, "mime-types@2.1.35": { "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": [ - "mime-db" + "mime-db@1.52.0" ], "tarball": "https://verdaccio.lossless.digital/mime-types/-/mime-types-2.1.35.tgz" }, + "mime-types@3.0.2": { + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dependencies": [ + "mime-db@1.54.0" + ], + "tarball": "https://verdaccio.lossless.digital/mime-types/-/mime-types-3.0.2.tgz" + }, "mime@4.1.0": { "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", "bin": true, @@ -3297,6 +5477,13 @@ ], "tarball": "https://verdaccio.lossless.digital/minimatch/-/minimatch-10.2.4.tgz" }, + "minimatch@3.1.5": { + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dependencies": [ + "brace-expansion@1.1.12" + ], + "tarball": "https://verdaccio.lossless.digital/minimatch/-/minimatch-3.1.5.tgz" + }, "minimatch@9.0.9": { "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dependencies": [ @@ -3308,6 +5495,14 @@ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "tarball": "https://verdaccio.lossless.digital/minipass/-/minipass-7.1.3.tgz" }, + "monaco-editor@0.55.1": { + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "dependencies": [ + "dompurify", + "marked" + ], + "tarball": "https://verdaccio.lossless.digital/monaco-editor/-/monaco-editor-0.55.1.tgz" + }, "mongodb-connection-string-url@3.0.2": { "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", "dependencies": [ @@ -3329,7 +5524,7 @@ "dependencies": [ "async-mutex", "camelcase", - "debug", + "debug@4.4.3", "find-cache-dir", "follow-redirects", "https-proxy-agent", @@ -3373,22 +5568,56 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "tarball": "https://verdaccio.lossless.digital/ms/-/ms-2.1.3.tgz" }, + "mute-stream@1.0.0": { + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "tarball": "https://verdaccio.lossless.digital/mute-stream/-/mute-stream-1.0.0.tgz" + }, "nanoid@4.0.2": { "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", "bin": true, "tarball": "https://verdaccio.lossless.digital/nanoid/-/nanoid-4.0.2.tgz" }, + "negotiator@0.6.3": { + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "tarball": "https://verdaccio.lossless.digital/negotiator/-/negotiator-0.6.3.tgz" + }, + "negotiator@1.0.0": { + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "tarball": "https://verdaccio.lossless.digital/negotiator/-/negotiator-1.0.0.tgz" + }, "new-find-package-json@2.0.0": { "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", "dependencies": [ - "debug" + "debug@4.4.3" ], "tarball": "https://verdaccio.lossless.digital/new-find-package-json/-/new-find-package-json-2.0.0.tgz" }, + "no-case@2.3.2": { + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": [ + "lower-case" + ], + "tarball": "https://verdaccio.lossless.digital/no-case/-/no-case-2.3.2.tgz" + }, "node-forge@1.3.3": { "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "tarball": "https://verdaccio.lossless.digital/node-forge/-/node-forge-1.3.3.tgz" }, + "normalize-newline@4.1.0": { + "integrity": "sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==", + "dependencies": [ + "replace-buffer" + ], + "tarball": "https://verdaccio.lossless.digital/normalize-newline/-/normalize-newline-4.1.0.tgz" + }, + "object-assign@4.1.1": { + "integrity": "2109adc7965887cfc05cbbd442cac8bfbb360863", + "tarball": "https://verdaccio.lossless.digital/object-assign/-/object-assign-4.1.1.tgz" + }, + "object-inspect@1.13.4": { + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "tarball": "https://verdaccio.lossless.digital/object-inspect/-/object-inspect-1.13.4.tgz" + }, "object-keys@1.1.1": { "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "tarball": "https://verdaccio.lossless.digital/object-keys/-/object-keys-1.1.1.tgz" @@ -3397,6 +5626,41 @@ "integrity": "sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==", "tarball": "https://verdaccio.lossless.digital/oblivious-set/-/oblivious-set-2.0.0.tgz" }, + "observable-fns@0.6.1": { + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "tarball": "https://verdaccio.lossless.digital/observable-fns/-/observable-fns-0.6.1.tgz" + }, + "on-finished@2.4.1": { + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": [ + "ee-first" + ], + "tarball": "https://verdaccio.lossless.digital/on-finished/-/on-finished-2.4.1.tgz" + }, + "once@1.4.0": { + "integrity": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "dependencies": [ + "wrappy" + ], + "tarball": "https://verdaccio.lossless.digital/once/-/once-1.4.0.tgz" + }, + "open@8.4.2": { + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": [ + "define-lazy-prop", + "is-docker", + "is-wsl" + ], + "tarball": "https://verdaccio.lossless.digital/open/-/open-8.4.2.tgz" + }, + "orderedmap@2.1.1": { + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "tarball": "https://verdaccio.lossless.digital/orderedmap/-/orderedmap-2.1.1.tgz" + }, + "os-tmpdir@1.0.2": { + "integrity": "bbe67406c79aa85c5cfec766fe5734555dfa1274", + "tarball": "https://verdaccio.lossless.digital/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + }, "p-finally@1.0.0": { "integrity": "3fbcfb15b899a44123b34b6dcc18b724336a2cae", "tarball": "https://verdaccio.lossless.digital/p-finally/-/p-finally-1.0.0.tgz" @@ -3438,10 +5702,21 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "tarball": "https://verdaccio.lossless.digital/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" }, + "param-case@2.1.1": { + "integrity": "df94fd8cf6531ecf75e6bef9a0858fbc72be2247", + "dependencies": [ + "no-case" + ], + "tarball": "https://verdaccio.lossless.digital/param-case/-/param-case-2.1.1.tgz" + }, "parse-ms@4.0.0": { "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "tarball": "https://verdaccio.lossless.digital/parse-ms/-/parse-ms-4.0.0.tgz" }, + "parseurl@1.3.3": { + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "tarball": "https://verdaccio.lossless.digital/parseurl/-/parseurl-1.3.3.tgz" + }, "path-exists@4.0.0": { "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "tarball": "https://verdaccio.lossless.digital/path-exists/-/path-exists-4.0.0.tgz" @@ -3450,6 +5725,10 @@ "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", "tarball": "https://verdaccio.lossless.digital/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz" }, + "path-is-absolute@1.0.1": { + "integrity": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "tarball": "https://verdaccio.lossless.digital/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, "path-key@3.1.1": { "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "tarball": "https://verdaccio.lossless.digital/path-key/-/path-key-3.1.1.tgz" @@ -3466,6 +5745,13 @@ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "tarball": "https://verdaccio.lossless.digital/path-to-regexp/-/path-to-regexp-8.3.0.tgz" }, + "pdfjs-dist@4.10.38": { + "integrity": "sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==", + "optionalDependencies": [ + "@napi-rs/canvas" + ], + "tarball": "https://verdaccio.lossless.digital/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz" + }, "peek-readable@5.4.2": { "integrity": "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==", "tarball": "https://verdaccio.lossless.digital/peek-readable/-/peek-readable-5.4.2.tgz" @@ -3474,6 +5760,10 @@ "integrity": "7a57eb550a6783f9115331fcf4663d5c8e007a50", "tarball": "https://verdaccio.lossless.digital/pend/-/pend-1.2.0.tgz" }, + "picomatch@4.0.3": { + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "tarball": "https://verdaccio.lossless.digital/picomatch/-/picomatch-4.0.3.tgz" + }, "pkg-dir@4.2.0": { "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": [ @@ -3492,10 +5782,213 @@ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "tarball": "https://verdaccio.lossless.digital/property-information/-/property-information-7.1.0.tgz" }, + "prosemirror-changeset@2.4.0": { + "integrity": "sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==", + "dependencies": [ + "prosemirror-transform" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-changeset/-/prosemirror-changeset-2.4.0.tgz" + }, + "prosemirror-collab@1.3.1": { + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "dependencies": [ + "prosemirror-state" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz" + }, + "prosemirror-commands@1.7.1": { + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "dependencies": [ + "prosemirror-model", + "prosemirror-state", + "prosemirror-transform" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz" + }, + "prosemirror-dropcursor@1.8.2": { + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "dependencies": [ + "prosemirror-state", + "prosemirror-transform", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz" + }, + "prosemirror-gapcursor@1.4.1": { + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", + "dependencies": [ + "prosemirror-keymap", + "prosemirror-model", + "prosemirror-state", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz" + }, + "prosemirror-history@1.5.0": { + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "dependencies": [ + "prosemirror-state", + "prosemirror-transform", + "prosemirror-view", + "rope-sequence" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-history/-/prosemirror-history-1.5.0.tgz" + }, + "prosemirror-inputrules@1.5.1": { + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "dependencies": [ + "prosemirror-state", + "prosemirror-transform" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz" + }, + "prosemirror-keymap@1.2.3": { + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "dependencies": [ + "prosemirror-state", + "w3c-keyname" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz" + }, + "prosemirror-markdown@1.13.4": { + "integrity": "sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==", + "dependencies": [ + "@types/markdown-it", + "markdown-it", + "prosemirror-model" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-markdown/-/prosemirror-markdown-1.13.4.tgz" + }, + "prosemirror-menu@1.3.0": { + "integrity": "sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==", + "dependencies": [ + "crelt", + "prosemirror-commands", + "prosemirror-history", + "prosemirror-state" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-menu/-/prosemirror-menu-1.3.0.tgz" + }, + "prosemirror-model@1.25.4": { + "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", + "dependencies": [ + "orderedmap" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-model/-/prosemirror-model-1.25.4.tgz" + }, + "prosemirror-schema-basic@1.2.4": { + "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", + "dependencies": [ + "prosemirror-model" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz" + }, + "prosemirror-schema-list@1.5.1": { + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "dependencies": [ + "prosemirror-model", + "prosemirror-state", + "prosemirror-transform" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz" + }, + "prosemirror-state@1.4.4": { + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "dependencies": [ + "prosemirror-model", + "prosemirror-transform", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-state/-/prosemirror-state-1.4.4.tgz" + }, + "prosemirror-tables@1.8.5": { + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", + "dependencies": [ + "prosemirror-keymap", + "prosemirror-model", + "prosemirror-state", + "prosemirror-transform", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz" + }, + "prosemirror-trailing-node@3.0.0_prosemirror-model@1.25.4_prosemirror-state@1.4.4_prosemirror-view@1.41.6": { + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "dependencies": [ + "@remirror/core-constants", + "escape-string-regexp@4.0.0", + "prosemirror-model", + "prosemirror-state", + "prosemirror-view" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz" + }, + "prosemirror-transform@1.11.0": { + "integrity": "sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==", + "dependencies": [ + "prosemirror-model" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz" + }, + "prosemirror-view@1.41.6": { + "integrity": "sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==", + "dependencies": [ + "prosemirror-model", + "prosemirror-state", + "prosemirror-transform" + ], + "tarball": "https://verdaccio.lossless.digital/prosemirror-view/-/prosemirror-view-1.41.6.tgz" + }, + "proxy-addr@2.0.7": { + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": [ + "forwarded", + "ipaddr.js" + ], + "tarball": "https://verdaccio.lossless.digital/proxy-addr/-/proxy-addr-2.0.7.tgz" + }, + "punycode.js@2.3.1": { + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "tarball": "https://verdaccio.lossless.digital/punycode.js/-/punycode.js-2.3.1.tgz" + }, + "punycode@1.4.1": { + "integrity": "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e", + "tarball": "https://verdaccio.lossless.digital/punycode/-/punycode-1.4.1.tgz" + }, "punycode@2.3.1": { "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "tarball": "https://verdaccio.lossless.digital/punycode/-/punycode-2.3.1.tgz" }, + "qs@6.15.0": { + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dependencies": [ + "side-channel" + ], + "tarball": "https://verdaccio.lossless.digital/qs/-/qs-6.15.0.tgz" + }, + "randomatic@3.1.1": { + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dependencies": [ + "is-number", + "kind-of", + "math-random" + ], + "tarball": "https://verdaccio.lossless.digital/randomatic/-/randomatic-3.1.1.tgz" + }, + "range-parser@1.2.1": { + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "tarball": "https://verdaccio.lossless.digital/range-parser/-/range-parser-1.2.1.tgz" + }, + "raw-body@3.0.2": { + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dependencies": [ + "bytes", + "http-errors", + "iconv-lite@0.7.2", + "unpipe" + ], + "tarball": "https://verdaccio.lossless.digital/raw-body/-/raw-body-3.0.2.tgz" + }, "readable-stream@3.6.2": { "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": [ @@ -3505,6 +5998,14 @@ ], "tarball": "https://verdaccio.lossless.digital/readable-stream/-/readable-stream-3.6.2.tgz" }, + "readdirp@5.0.0": { + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "tarball": "https://verdaccio.lossless.digital/readdirp/-/readdirp-5.0.0.tgz" + }, + "relateurl@0.2.7": { + "integrity": "54dbf377e51440aca90a4cd274600d3ff2d888a9", + "tarball": "https://verdaccio.lossless.digital/relateurl/-/relateurl-0.2.7.tgz" + }, "remark-frontmatter@5.0.0": { "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", "dependencies": [ @@ -3557,9 +6058,65 @@ ], "tarball": "https://verdaccio.lossless.digital/remark-stringify/-/remark-stringify-11.0.0.tgz" }, - "require-directory@2.1.1": { - "integrity": "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", - "tarball": "https://verdaccio.lossless.digital/require-directory/-/require-directory-2.1.1.tgz" + "replace-buffer@1.2.1": { + "integrity": "sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==", + "tarball": "https://verdaccio.lossless.digital/replace-buffer/-/replace-buffer-1.2.1.tgz" + }, + "resolve-pkg-maps@1.0.0": { + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "tarball": "https://verdaccio.lossless.digital/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + }, + "rimraf@3.0.2": { + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": [ + "glob@7.2.3" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/rimraf/-/rimraf-3.0.2.tgz" + }, + "rolldown@1.0.0-beta.52": { + "integrity": "sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==", + "dependencies": [ + "@oxc-project/types", + "@rolldown/pluginutils" + ], + "optionalDependencies": [ + "@rolldown/binding-android-arm64", + "@rolldown/binding-darwin-arm64", + "@rolldown/binding-darwin-x64", + "@rolldown/binding-freebsd-x64", + "@rolldown/binding-linux-arm-gnueabihf", + "@rolldown/binding-linux-arm64-gnu", + "@rolldown/binding-linux-arm64-musl", + "@rolldown/binding-linux-x64-gnu", + "@rolldown/binding-linux-x64-musl", + "@rolldown/binding-openharmony-arm64", + "@rolldown/binding-wasm32-wasi", + "@rolldown/binding-win32-arm64-msvc", + "@rolldown/binding-win32-ia32-msvc", + "@rolldown/binding-win32-x64-msvc" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/rolldown/-/rolldown-1.0.0-beta.52.tgz" + }, + "rope-sequence@1.3.4": { + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "tarball": "https://verdaccio.lossless.digital/rope-sequence/-/rope-sequence-1.3.4.tgz" + }, + "router@2.2.0": { + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dependencies": [ + "debug@4.4.3", + "depd", + "is-promise", + "parseurl", + "path-to-regexp" + ], + "tarball": "https://verdaccio.lossless.digital/router/-/router-2.2.0.tgz" + }, + "run-async@3.0.0": { + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "tarball": "https://verdaccio.lossless.digital/run-async/-/run-async-3.0.0.tgz" }, "rxjs@7.8.2": { "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", @@ -3572,6 +6129,10 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "tarball": "https://verdaccio.lossless.digital/safe-buffer/-/safe-buffer-5.2.1.tgz" }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "tarball": "https://verdaccio.lossless.digital/safer-buffer/-/safer-buffer-2.1.2.tgz" + }, "semver@6.3.1": { "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": true, @@ -3582,6 +6143,33 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/semver/-/semver-7.7.4.tgz" }, + "send@1.2.1": { + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dependencies": [ + "debug@4.4.3", + "encodeurl", + "escape-html", + "etag", + "fresh", + "http-errors", + "mime-types@3.0.2", + "ms", + "on-finished", + "range-parser", + "statuses" + ], + "tarball": "https://verdaccio.lossless.digital/send/-/send-1.2.1.tgz" + }, + "serve-static@2.2.1": { + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dependencies": [ + "encodeurl", + "escape-html", + "parseurl", + "send" + ], + "tarball": "https://verdaccio.lossless.digital/serve-static/-/serve-static-2.2.1.tgz" + }, "set-function-length@1.2.2": { "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": [ @@ -3594,6 +6182,10 @@ ], "tarball": "https://verdaccio.lossless.digital/set-function-length/-/set-function-length-1.2.2.tgz" }, + "setprototypeof@1.2.0": { + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "tarball": "https://verdaccio.lossless.digital/setprototypeof/-/setprototypeof-1.2.0.tgz" + }, "shebang-command@2.0.0": { "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": [ @@ -3605,14 +6197,97 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "tarball": "https://verdaccio.lossless.digital/shebang-regex/-/shebang-regex-3.0.0.tgz" }, - "shell-quote@1.8.3": { - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "tarball": "https://verdaccio.lossless.digital/shell-quote/-/shell-quote-1.8.3.tgz" + "side-channel-list@1.0.0": { + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": [ + "es-errors", + "object-inspect" + ], + "tarball": "https://verdaccio.lossless.digital/side-channel-list/-/side-channel-list-1.0.0.tgz" + }, + "side-channel-map@1.0.1": { + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect" + ], + "tarball": "https://verdaccio.lossless.digital/side-channel-map/-/side-channel-map-1.0.1.tgz" + }, + "side-channel-weakmap@1.0.2": { + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect", + "side-channel-map" + ], + "tarball": "https://verdaccio.lossless.digital/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + }, + "side-channel@1.1.0": { + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": [ + "es-errors", + "object-inspect", + "side-channel-list", + "side-channel-map", + "side-channel-weakmap" + ], + "tarball": "https://verdaccio.lossless.digital/side-channel/-/side-channel-1.1.0.tgz" + }, + "signal-exit@3.0.7": { + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "tarball": "https://verdaccio.lossless.digital/signal-exit/-/signal-exit-3.0.7.tgz" }, "signal-exit@4.1.0": { "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "tarball": "https://verdaccio.lossless.digital/signal-exit/-/signal-exit-4.1.0.tgz" }, + "socket.io-adapter@2.5.6": { + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "dependencies": [ + "debug@4.4.3", + "ws@8.18.3" + ], + "tarball": "https://verdaccio.lossless.digital/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz" + }, + "socket.io-client@4.8.1": { + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "dependencies": [ + "@socket.io/component-emitter", + "debug@4.3.7", + "engine.io-client", + "socket.io-parser" + ], + "tarball": "https://verdaccio.lossless.digital/socket.io-client/-/socket.io-client-4.8.1.tgz" + }, + "socket.io-parser@4.2.5": { + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "dependencies": [ + "@socket.io/component-emitter", + "debug@4.4.3" + ], + "tarball": "https://verdaccio.lossless.digital/socket.io-parser/-/socket.io-parser-4.2.5.tgz" + }, + "socket.io@4.8.1": { + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dependencies": [ + "accepts@1.3.8", + "base64id", + "cors", + "debug@4.3.7", + "engine.io", + "socket.io-adapter", + "socket.io-parser" + ], + "tarball": "https://verdaccio.lossless.digital/socket.io/-/socket.io-4.8.1.tgz" + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "tarball": "https://verdaccio.lossless.digital/source-map/-/source-map-0.6.1.tgz" + }, "space-separated-tokens@2.0.2": { "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "tarball": "https://verdaccio.lossless.digital/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -3624,10 +6299,26 @@ ], "tarball": "https://verdaccio.lossless.digital/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" }, + "spawn-wrap@2.0.0": { + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dependencies": [ + "foreground-child@2.0.0", + "is-windows", + "make-dir", + "rimraf", + "signal-exit@3.0.7", + "which@2.0.2" + ], + "tarball": "https://verdaccio.lossless.digital/spawn-wrap/-/spawn-wrap-2.0.0.tgz" + }, "sprintf-js@1.0.3": { "integrity": "04e6926f662895354f3dd015203633b857297e2c", "tarball": "https://verdaccio.lossless.digital/sprintf-js/-/sprintf-js-1.0.3.tgz" }, + "statuses@2.0.2": { + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "tarball": "https://verdaccio.lossless.digital/statuses/-/statuses-2.0.2.tgz" + }, "streamx@2.25.0": { "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", "dependencies": [ @@ -3668,6 +6359,14 @@ ], "tarball": "https://verdaccio.lossless.digital/strip-ansi/-/strip-ansi-6.0.1.tgz" }, + "strip-indent@4.1.1": { + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", + "tarball": "https://verdaccio.lossless.digital/strip-indent/-/strip-indent-4.1.1.tgz" + }, + "strnum@1.1.2": { + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "tarball": "https://verdaccio.lossless.digital/strnum/-/strnum-1.1.2.tgz" + }, "strnum@2.2.1": { "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", "tarball": "https://verdaccio.lossless.digital/strnum/-/strnum-2.2.1.tgz" @@ -3680,20 +6379,6 @@ ], "tarball": "https://verdaccio.lossless.digital/strtok3/-/strtok3-9.1.1.tgz" }, - "supports-color@7.2.0": { - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": [ - "has-flag" - ], - "tarball": "https://verdaccio.lossless.digital/supports-color/-/supports-color-7.2.0.tgz" - }, - "supports-color@8.1.1": { - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": [ - "has-flag" - ], - "tarball": "https://verdaccio.lossless.digital/supports-color/-/supports-color-8.1.1.tgz" - }, "sweet-scroll@4.0.0": { "integrity": "sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==", "tarball": "https://verdaccio.lossless.digital/sweet-scroll/-/sweet-scroll-4.0.0.tgz" @@ -3730,6 +6415,19 @@ ], "tarball": "https://verdaccio.lossless.digital/text-decoder/-/text-decoder-1.2.7.tgz" }, + "threads@1.7.0": { + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "dependencies": [ + "callsites", + "debug@4.4.3", + "is-observable", + "observable-fns" + ], + "optionalDependencies": [ + "tiny-worker" + ], + "tarball": "https://verdaccio.lossless.digital/threads/-/threads-1.7.0.tgz" + }, "through2@4.0.2": { "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dependencies": [ @@ -3737,6 +6435,24 @@ ], "tarball": "https://verdaccio.lossless.digital/through2/-/through2-4.0.2.tgz" }, + "tiny-worker@2.3.0": { + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "dependencies": [ + "esm" + ], + "tarball": "https://verdaccio.lossless.digital/tiny-worker/-/tiny-worker-2.3.0.tgz" + }, + "tmp@0.0.33": { + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": [ + "os-tmpdir" + ], + "tarball": "https://verdaccio.lossless.digital/tmp/-/tmp-0.0.33.tgz" + }, + "toidentifier@1.0.1": { + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "tarball": "https://verdaccio.lossless.digital/toidentifier/-/toidentifier-1.0.1.tgz" + }, "token-types@6.1.2": { "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "dependencies": [ @@ -3749,15 +6465,10 @@ "tr46@5.1.1": { "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dependencies": [ - "punycode" + "punycode@2.3.1" ], "tarball": "https://verdaccio.lossless.digital/tr46/-/tr46-5.1.1.tgz" }, - "tree-kill@1.2.2": { - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": true, - "tarball": "https://verdaccio.lossless.digital/tree-kill/-/tree-kill-1.2.2.tgz" - }, "trim-lines@3.0.1": { "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "tarball": "https://verdaccio.lossless.digital/trim-lines/-/trim-lines-3.0.1.tgz" @@ -3770,6 +6481,18 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "tarball": "https://verdaccio.lossless.digital/tslib/-/tslib-2.8.1.tgz" }, + "tsx@4.21.0": { + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dependencies": [ + "esbuild", + "get-tsconfig" + ], + "optionalDependencies": [ + "fsevents" + ], + "bin": true, + "tarball": "https://verdaccio.lossless.digital/tsx/-/tsx-4.21.0.tgz" + }, "turndown-plugin-gfm@1.0.2": { "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", "tarball": "https://verdaccio.lossless.digital/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz" @@ -3781,6 +6504,14 @@ ], "tarball": "https://verdaccio.lossless.digital/turndown/-/turndown-7.2.2.tgz" }, + "type-fest@0.21.3": { + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "tarball": "https://verdaccio.lossless.digital/type-fest/-/type-fest-0.21.3.tgz" + }, + "type-fest@2.19.0": { + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "tarball": "https://verdaccio.lossless.digital/type-fest/-/type-fest-2.19.0.tgz" + }, "type-fest@4.41.0": { "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "tarball": "https://verdaccio.lossless.digital/type-fest/-/type-fest-4.41.0.tgz" @@ -3792,10 +6523,37 @@ ], "tarball": "https://verdaccio.lossless.digital/type-fest/-/type-fest-5.5.0.tgz" }, + "type-is@2.0.1": { + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dependencies": [ + "content-type", + "media-typer", + "mime-types@3.0.2" + ], + "tarball": "https://verdaccio.lossless.digital/type-is/-/type-is-2.0.1.tgz" + }, + "typescript@5.9.3": { + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/typescript/-/typescript-5.9.3.tgz" + }, + "uc.micro@2.1.0": { + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "tarball": "https://verdaccio.lossless.digital/uc.micro/-/uc.micro-2.1.0.tgz" + }, + "uglify-js@3.19.3": { + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/uglify-js/-/uglify-js-3.19.3.tgz" + }, "uint8array-extras@1.5.0": { "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "tarball": "https://verdaccio.lossless.digital/uint8array-extras/-/uint8array-extras-1.5.0.tgz" }, + "undici-types@6.21.0": { + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "tarball": "https://verdaccio.lossless.digital/undici-types/-/undici-types-6.21.0.tgz" + }, "undici-types@7.10.0": { "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "tarball": "https://verdaccio.lossless.digital/undici-types/-/undici-types-7.10.0.tgz" @@ -3859,6 +6617,22 @@ "integrity": "sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==", "tarball": "https://verdaccio.lossless.digital/unload/-/unload-2.4.1.tgz" }, + "unpipe@1.0.0": { + "integrity": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", + "tarball": "https://verdaccio.lossless.digital/unpipe/-/unpipe-1.0.0.tgz" + }, + "upper-case@1.1.3": { + "integrity": "f6b4501c2ec4cdd26ba78be7222961de77621598", + "tarball": "https://verdaccio.lossless.digital/upper-case/-/upper-case-1.1.3.tgz" + }, + "url@0.11.4": { + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": [ + "punycode@1.4.1", + "qs" + ], + "tarball": "https://verdaccio.lossless.digital/url/-/url-0.11.4.tgz" + }, "util-deprecate@1.0.2": { "integrity": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", "tarball": "https://verdaccio.lossless.digital/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -3868,6 +6642,10 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/uuid/-/uuid-9.0.1.tgz" }, + "vary@1.1.2": { + "integrity": "2299f02c6ded30d4a5961b0b9f74524a18f634fc", + "tarball": "https://verdaccio.lossless.digital/vary/-/vary-1.1.2.tgz" + }, "vfile-message@4.0.3": { "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dependencies": [ @@ -3884,10 +6662,18 @@ ], "tarball": "https://verdaccio.lossless.digital/vfile/-/vfile-6.0.3.tgz" }, + "w3c-keyname@2.2.8": { + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "tarball": "https://verdaccio.lossless.digital/w3c-keyname/-/w3c-keyname-2.2.8.tgz" + }, "webidl-conversions@7.0.0": { "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "tarball": "https://verdaccio.lossless.digital/webidl-conversions/-/webidl-conversions-7.0.0.tgz" }, + "whatwg-mimetype@3.0.0": { + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "tarball": "https://verdaccio.lossless.digital/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + }, "whatwg-url@14.2.0": { "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dependencies": [ @@ -3912,40 +6698,51 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/which/-/which-6.0.1.tgz" }, - "wrap-ansi@7.0.0": { - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "wrap-ansi@6.2.0": { + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": [ "ansi-styles", "string-width", "strip-ansi" ], - "tarball": "https://verdaccio.lossless.digital/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "tarball": "https://verdaccio.lossless.digital/wrap-ansi/-/wrap-ansi-6.2.0.tgz" }, - "y18n@5.0.8": { - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "tarball": "https://verdaccio.lossless.digital/y18n/-/y18n-5.0.8.tgz" + "wrappy@1.0.2": { + "integrity": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "tarball": "https://verdaccio.lossless.digital/wrappy/-/wrappy-1.0.2.tgz" }, - "yargs-parser@21.1.1": { - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "tarball": "https://verdaccio.lossless.digital/yargs-parser/-/yargs-parser-21.1.1.tgz" + "ws@8.17.1": { + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "tarball": "https://verdaccio.lossless.digital/ws/-/ws-8.17.1.tgz" + }, + "ws@8.18.3": { + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "tarball": "https://verdaccio.lossless.digital/ws/-/ws-8.18.3.tgz" + }, + "xmlhttprequest-ssl@2.1.2": { + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "tarball": "https://verdaccio.lossless.digital/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz" + }, + "xterm-addon-fit@0.8.0_xterm@5.3.0": { + "integrity": "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==", + "dependencies": [ + "xterm" + ], + "tarball": "https://verdaccio.lossless.digital/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz" + }, + "xterm@5.3.0": { + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "tarball": "https://verdaccio.lossless.digital/xterm/-/xterm-5.3.0.tgz" + }, + "yaml@2.8.2": { + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "bin": true, + "tarball": "https://verdaccio.lossless.digital/yaml/-/yaml-2.8.2.tgz" }, "yargs-parser@22.0.0": { "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "tarball": "https://verdaccio.lossless.digital/yargs-parser/-/yargs-parser-22.0.0.tgz" }, - "yargs@17.7.2": { - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": [ - "cliui", - "escalade", - "get-caller-file", - "require-directory", - "string-width", - "y18n", - "yargs-parser@21.1.1" - ], - "tarball": "https://verdaccio.lossless.digital/yargs/-/yargs-17.7.2.tgz" - }, "yauzl@3.2.1": { "integrity": "sha512-k1isifdbpNSFEHFJ1ZY4YDewv0IH9FR61lDetaRMD3j2ae3bIXGV+7c+LHCqtQGofSd8PIyV4X6+dHMAnSr60A==", "dependencies": [ @@ -3954,6 +6751,10 @@ ], "tarball": "https://verdaccio.lossless.digital/yauzl/-/yauzl-3.2.1.tgz" }, + "yoctocolors-cjs@2.1.3": { + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "tarball": "https://verdaccio.lossless.digital/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz" + }, "zwitch@2.0.4": { "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "tarball": "https://verdaccio.lossless.digital/zwitch/-/zwitch-2.0.4.tgz" @@ -3964,6 +6765,9 @@ "jsr:@std/fs@1", "jsr:@std/http@1", "jsr:@std/path@1", + "npm:@api.global/typedrequest-interfaces@^3.0.19", + "npm:@api.global/typedrequest@^3.1.10", + "npm:@api.global/typedserver@^3.0.53", "npm:@push.rocks/qenv@^6.1.3", "npm:@push.rocks/smartbucket@^4.5.1", "npm:@push.rocks/smartcli@^4.0.20", @@ -3971,6 +6775,7 @@ "npm:@push.rocks/smartdata@^7.1.0", "npm:@push.rocks/smartdelay@^3.0.5", "npm:@push.rocks/smartenv@6", + "npm:@push.rocks/smartguard@^3.1.0", "npm:@push.rocks/smartjwt@^2.2.1", "npm:@push.rocks/smartlog@^3.2.1", "npm:@push.rocks/smartpath@6", @@ -3983,8 +6788,15 @@ ], "packageJson": { "dependencies": [ + "npm:@api.global/typedrequest-interfaces@^3.0.19", + "npm:@api.global/typedrequest@^3.1.10", + "npm:@api.global/typedserver@^8.4.2", + "npm:@design.estate/dees-catalog@^3.43.0", + "npm:@design.estate/dees-element@^2.1.6", + "npm:@git.zone/tsbundle@^2.8.3", "npm:@git.zone/tsdeno@^1.2.0", - "npm:concurrently@^9.1.2" + "npm:@git.zone/tswatch@^3.1.0", + "npm:@push.rocks/smartguard@^3.1.0" ] } } diff --git a/design-system.md b/design-system.md index 3368f8e..9dd05d1 100644 --- a/design-system.md +++ b/design-system.md @@ -1,37 +1,38 @@ # Stack.Gallery Design System -Bloomberg terminal-inspired aesthetic with dark theme, sharp corners, and orange/green accent colors. +Bloomberg terminal-inspired aesthetic with dark theme, sharp corners, and orange/green accent +colors. ## Colors (HSL) ### Dark Theme (Default) -| Token | HSL | Hex | Usage | -|--------------------|---------------|---------|------------------------------------| -| background | 0 0% 0% | #000000 | Page background | -| foreground | 0 0% 100% | #FFFFFF | Primary text | -| primary | 33 100% 50% | #FF8000 | Bloomberg orange, CTAs, highlights | -| primary-foreground | 0 0% 0% | #000000 | Text on primary buttons | -| accent | 142 71% 45% | #22C55E | Terminal green, success states | -| accent-foreground | 0 0% 0% | #000000 | Text on accent | -| muted | 0 0% 8% | #141414 | Subtle backgrounds | -| muted-foreground | 0 0% 55% | #8C8C8C | Secondary text, labels | -| card | 0 0% 4% | #0A0A0A | Card backgrounds | -| border | 0 0% 15% | #262626 | All borders, dividers | -| destructive | 0 84% 60% | #EF4444 | Errors, terminal red dots | +| Token | HSL | Hex | Usage | +| ------------------ | ----------- | ------- | ---------------------------------- | +| background | 0 0% 0% | #000000 | Page background | +| foreground | 0 0% 100% | #FFFFFF | Primary text | +| primary | 33 100% 50% | #FF8000 | Bloomberg orange, CTAs, highlights | +| primary-foreground | 0 0% 0% | #000000 | Text on primary buttons | +| accent | 142 71% 45% | #22C55E | Terminal green, success states | +| accent-foreground | 0 0% 0% | #000000 | Text on accent | +| muted | 0 0% 8% | #141414 | Subtle backgrounds | +| muted-foreground | 0 0% 55% | #8C8C8C | Secondary text, labels | +| card | 0 0% 4% | #0A0A0A | Card backgrounds | +| border | 0 0% 15% | #262626 | All borders, dividers | +| destructive | 0 84% 60% | #EF4444 | Errors, terminal red dots | ### Light Theme -| Token | HSL | Hex | -|------------------|---------------|---------| -| background | 0 0% 100% | #FFFFFF | -| foreground | 0 0% 5% | #0D0D0D | -| primary | 33 100% 45% | #E67300 | -| accent | 142 71% 35% | #16A34A | -| muted | 0 0% 96% | #F5F5F5 | -| muted-foreground | 0 0% 40% | #666666 | -| card | 0 0% 98% | #FAFAFA | -| border | 0 0% 90% | #E5E5E5 | +| Token | HSL | Hex | +| ---------------- | ----------- | ------- | +| background | 0 0% 100% | #FFFFFF | +| foreground | 0 0% 5% | #0D0D0D | +| primary | 33 100% 45% | #E67300 | +| accent | 142 71% 35% | #16A34A | +| muted | 0 0% 96% | #F5F5F5 | +| muted-foreground | 0 0% 40% | #666666 | +| card | 0 0% 98% | #FAFAFA | +| border | 0 0% 90% | #E5E5E5 | --- @@ -52,7 +53,7 @@ Bloomberg terminal-inspired aesthetic with dark theme, sharp corners, and orange ### Font Sizes | Element | Size | Weight | Letter Spacing | -|-----------------|------------------------|--------|-----------------| +| --------------- | ---------------------- | ------ | --------------- | | H1 (Hero) | 3rem / 4rem (md) | 700 | -0.02em (tight) | | H2 (Section) | 1.5rem / 1.875rem (md) | 700 | -0.02em | | H3 (Card title) | 0.875rem | 600 | normal | @@ -72,7 +73,7 @@ Bloomberg terminal-inspired aesthetic with dark theme, sharp corners, and orange ### Border Radius ```css ---radius: 0px; /* All elements: sharp corners */ +--radius: 0px; /* All elements: sharp corners */ ``` ### Container diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..dadb014 --- /dev/null +++ b/html/index.html @@ -0,0 +1,33 @@ + + + + + + + Stack.Gallery Registry + + + + + + + + + diff --git a/npmextra.json b/npmextra.json index 2dcd0bd..4269968 100644 --- a/npmextra.json +++ b/npmextra.json @@ -64,5 +64,40 @@ } ] }, - "@ship.zone/szci": {} -} \ No newline at end of file + "@ship.zone/szci": {}, + "@git.zone/tsbundle": { + "bundles": [ + { + "from": "./ts_web/index.ts", + "to": "./ts_bundled/bundle.ts", + "outputMode": "base64ts", + "bundler": "esbuild", + "production": true, + "includeFiles": [{"from": "./html/index.html", "to": "index.html"}] + } + ] + }, + "@git.zone/tswatch": { + "bundles": [ + { + "from": "./ts_web/index.ts", + "to": "./ts_bundled/bundle.ts", + "outputMode": "base64ts", + "bundler": "esbuild", + "production": true, + "watchPatterns": ["./ts_web/**/*", "./html/**/*"], + "includeFiles": [{"from": "./html/index.html", "to": "index.html"}] + } + ], + "watchers": [ + { + "name": "backend", + "watch": ["./ts/**/*", "./ts_interfaces/**/*", "./ts_bundled/**/*"], + "command": "deno run --allow-all mod.ts server --ephemeral", + "restart": true, + "debounce": 500, + "runOnStart": true + } + ] + } +} diff --git a/package.json b/package.json index 5b492fc..7e72000 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "start": "deno run --allow-all mod.ts server", "dev": "deno run --allow-all --watch mod.ts server --ephemeral", - "watch": "concurrently --kill-others --names \"BACKEND,UI,BUNDLER\" --prefix-colors \"cyan,magenta,yellow\" \"deno run --allow-all --watch mod.ts server --ephemeral\" \"cd ui && pnpm run watch\" \"deno task bundle-ui:watch\"", + "watch": "tswatch", "build": "deno task check", "test": "deno task test", "lint": "deno task lint", @@ -26,9 +26,19 @@ ], "author": "Stack.Gallery", "license": "MIT", + "dependencies": { + "@api.global/typedrequest": "^3.1.10", + "@api.global/typedrequest-interfaces": "^3.0.19", + "@api.global/typedserver": "^8.4.2", + "@design.estate/dees-catalog": "^3.43.0", + "@design.estate/dees-element": "^2.1.6", + "@push.rocks/smartguard": "^3.1.0", + "@stack.gallery/catalog": "file:../catalog" + }, "devDependencies": { + "@git.zone/tsbundle": "^2.8.3", "@git.zone/tsdeno": "^1.2.0", - "concurrently": "^9.1.2" + "@git.zone/tswatch": "^3.1.0" }, "packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 591acf6..c464b4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,22 +7,58 @@ settings: importers: .: + dependencies: + '@api.global/typedrequest': + specifier: ^3.1.10 + version: 3.3.0 + '@api.global/typedrequest-interfaces': + specifier: ^3.0.19 + version: 3.0.19 + '@api.global/typedserver': + specifier: ^8.4.2 + version: 8.4.2(@tiptap/pm@2.27.2) + '@design.estate/dees-catalog': + specifier: ^3.43.0 + version: 3.49.0(@tiptap/pm@2.27.2) + '@design.estate/dees-element': + specifier: ^2.1.6 + version: 2.2.3 + '@push.rocks/smartguard': + specifier: ^3.1.0 + version: 3.1.0 + '@stack.gallery/catalog': + specifier: file:../catalog + version: file:../catalog(@tiptap/pm@2.27.2) devDependencies: + '@git.zone/tsbundle': + specifier: ^2.8.3 + version: 2.9.1 '@git.zone/tsdeno': specifier: ^1.2.0 version: 1.2.0 - concurrently: - specifier: ^9.1.2 - version: 9.2.1 + '@git.zone/tswatch': + specifier: ^3.1.0 + version: 3.3.0(@tiptap/pm@2.27.2) 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.3.0': resolution: {integrity: sha512-Jwobqla+9k2IBG0duwrCFtc6GU6wsvHS3f0gJJsxTrpapylBW1YSF7NnGHPGs7F9hbATsO6IoUBpR2ScoKyGJA==} + '@api.global/typedserver@8.4.2': + resolution: {integrity: sha512-eESOcWvrbqkshR4s4OeTX1AK74bNCeGgiRebKgjxIzJ+b0+rkPQyn2DOaMtyXjFZRNgRHyytLm5Iqj5fdazeqw==} + + '@api.global/typedsocket@4.1.2': + resolution: {integrity: sha512-fZFuJY9ucFCICjF4wi6OvK8drsv6UcwVVsfamOT1HxFj7OBOYw6QHOceQ+cAQ8IrWbX817sf8gzlesl+jlG8JA==} + peerDependencies: + '@push.rocks/smartserve': '>=1.1.0' + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -30,9 +66,18 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@cloudflare/workers-types@4.20260317.1': + resolution: {integrity: sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==} + '@configvault.io/interfaces@1.0.17': resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + '@design.estate/dees-catalog@3.49.0': + resolution: {integrity: sha512-ZtHroyBZekv+jVSDmtGOzoGVI+EA55kd5EcSsNmUByxN3UMcFFeg62QRNzm3RHpz01u1Zfynm0bN9E44pk6FDQ==} + '@design.estate/dees-comms@1.0.30': resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} @@ -42,10 +87,270 @@ packages: '@design.estate/dees-element@2.2.3': resolution: {integrity: sha512-MpAvJPrJDTDad8hUtdOzMgMFRE7n84O7INhvSlkTTLB3b84j8EKjwfUCMErGAo7Bq5zfw4LG7NnKhLYXXXjkXA==} + '@design.estate/dees-wcctools@3.8.0': + resolution: {integrity: sha512-CC14iVKUrguzD9jIrdPBd9fZ4egVJEZMxl5y8iy0l7WLumeoYvGsoXj5INVkRPLRVLqziIdi4Je1hXqHt2NU+g==} + + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-common-types@7.2.0': + resolution: {integrity: sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@7.2.0': + resolution: {integrity: sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==} + engines: {node: '>=6'} + + '@fortawesome/free-brands-svg-icons@7.2.0': + resolution: {integrity: sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@7.2.0': + resolution: {integrity: sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@7.2.0': + resolution: {integrity: sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==} + engines: {node: '>=6'} + + '@git.zone/tsbundle@2.9.1': + resolution: {integrity: sha512-JW1xjSv7UjAm2lwAQPxhCWs14wqs+UIq5FqIGUPuI6rrDBWIMT2d0gpP6iP6TqXqgm6XpBlfU4rHcHheUXzXbQ==} + hasBin: true + '@git.zone/tsdeno@1.2.0': resolution: {integrity: sha512-Kx/9NchzKRoBhgj44V/ymF3rtspMAO+U+x7d3CFfBAyHCzVCrFtzIdVb5JULSTSR89d9a0L4VJVyVUoRdz/MUA==} hasBin: true + '@git.zone/tsrun@2.0.1': + resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==} + hasBin: true + + '@git.zone/tswatch@3.3.0': + resolution: {integrity: sha512-2d5G4L6RpEGW7d16xz6Gg6P/JnrMncNRDy74WaFrNjdn2fe5yIPtqoiQ/9LTbxqk67snj0gN2xtlQTXiN+Xa/w==} + hasBin: true + + '@happy-dom/global-registrator@15.11.7': + resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} + engines: {node: '>=18.0.0'} + + '@inquirer/checkbox@3.0.1': + resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@4.0.1': + resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==} + engines: {node: '>=18'} + + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@3.0.1': + resolution: {integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==} + engines: {node: '>=18'} + + '@inquirer/expand@3.0.1': + resolution: {integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@3.0.1': + resolution: {integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==} + engines: {node: '>=18'} + + '@inquirer/number@2.0.1': + resolution: {integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==} + engines: {node: '>=18'} + + '@inquirer/password@3.0.1': + resolution: {integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==} + engines: {node: '>=18'} + + '@inquirer/prompts@6.0.1': + resolution: {integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==} + engines: {node: '>=18'} + + '@inquirer/rawlist@3.0.1': + resolution: {integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==} + engines: {node: '>=18'} + + '@inquirer/search@2.0.1': + resolution: {integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==} + engines: {node: '>=18'} + + '@inquirer/select@3.0.1': + resolution: {integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -59,12 +364,112 @@ packages: '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + + '@napi-rs/canvas-android-arm64@0.1.97': + resolution: {integrity: sha512-V1c/WVw+NzH8vk7ZK/O8/nyBSCQimU8sfMsB/9qeSvdkGKNU7+mxy/bIF0gTgeBFmHpj30S4E9WHMSrxXGQuVQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.97': + resolution: {integrity: sha512-ok+SCEF4YejcxuJ9Rm+WWunHHpf2HmiPxfz6z1a/NFQECGXtsY7A4B8XocK1LmT1D7P174MzwPF9Wy3AUAwEPw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.97': + resolution: {integrity: sha512-PUP6e6/UGlclUvAQNnuXCcnkpdUou6VYZfQOQxExLp86epOylmiwLkqXIvpFmjoTEDmPmXrI+coL/9EFU1gKPA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.97': + resolution: {integrity: sha512-XyXH2L/cic8eTNtbrXCcvqHtMX/nEOxN18+7rMrAM2XtLYC/EB5s0wnO1FsLMWmK+04ZSLN9FBGipo7kpIkcOw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.97': + resolution: {integrity: sha512-Kuq/M3djq0K8ktgz6nPlK7Ne5d4uWeDxPpyKWOjWDK2RIOhHVtLtyLiJw2fuldw7Vn4mhw05EZXCEr4Q76rs9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.97': + resolution: {integrity: sha512-kKmSkQVnWeqg7qdsiXvYxKhAFuHz3tkBjW/zyQv5YKUPhotpaVhpBGv5LqCngzyuRV85SXoe+OFj+Tv0a0QXkQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.97': + resolution: {integrity: sha512-Jc7I3A51jnEOIAXeLsN/M/+Z28LUeakcsXs07FLq9prXc0eYOtVwsDEv913Gr+06IRo34gJJVgT0TXvmz+N2VA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.97': + resolution: {integrity: sha512-iDUBe7AilfuBSRbSa8/IGX38Mf+iCSBqoVKLSQ5XaY2JLOaqz1TVyPFEyIck7wT6mRQhQt5sN6ogfjIDfi74tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.97': + resolution: {integrity: sha512-AKLFd/v0Z5fvgqBDqhvqtAdx+fHMJ5t9JcUNKq4FIZ5WH+iegGm8HPdj00NFlCSnm83Fp3Ln8I2f7uq1aIiWaA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-arm64-msvc@0.1.97': + resolution: {integrity: sha512-u883Yr6A6fO7Vpsy9YE4FVCIxzzo5sO+7pIUjjoDLjS3vQaNMkVzx5bdIpEL+ob+gU88WDK4VcxYMZ6nmnoX9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@0.1.97': + resolution: {integrity: sha512-sWtD2EE3fV0IzN+iiQUqr/Q1SwqWhs2O1FKItFlxtdDkikpEj5g7DKQpY3x55H/MAOnL8iomnlk3mcEeGiUMoQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.97': + resolution: {integrity: sha512-8cFniXvrIEnVwuNSRCW9wirRZbHvrD3JVujdS2P5n5xiJZNZMOZcfOvJ1pb66c7jXMKHHglJEDVJGbm8XWFcXQ==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + '@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==} @@ -80,6 +485,9 @@ packages: '@push.rocks/smartbuffer@3.0.5': resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} + '@push.rocks/smartcache@1.0.18': + resolution: {integrity: sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==} + '@push.rocks/smartcli@4.0.20': resolution: {integrity: sha512-gCo4ItvsPj8WoVAJw/6vkuoGA5FtIoACux2ktcCeH0nrFe7/xGR6waJ1aZcYAi7QN4gi52TlsgwuKz7BzXqhmQ==} @@ -95,15 +503,24 @@ packages: '@push.rocks/smartenv@6.0.0': resolution: {integrity: sha512-ktW5MqOFs0492sB4vrvl4lgRFQ/sQ4AyREgB+sCIzGqszHWGVvGXR95Y2a3z66jkLPYML2CUWHzmMlfv8fkG+A==} + '@push.rocks/smarterror@2.0.1': + resolution: {integrity: sha512-iCcH1D8tlDJgMFsaJ6lhdOTKhbU0KoprNv9MRP9o7691QOx4JEDXiHtr/lNtxVo8BUtdb9CF6kazaknO9KuORA==} + '@push.rocks/smartexit@2.0.3': resolution: {integrity: sha512-ZWpZ3Elorpv/rKtUcCUejUHG4BIE5B3QWysBAgb7lTcA7y0vGdFY32Y5/Q5tHpZM6PPxl/WTdUOYtSojQTq+pA==} + '@push.rocks/smartfeed@1.4.0': + resolution: {integrity: sha512-bvj/3cGQI6TbbjbqrgC1uufcqprd/VthefuIsS8KHiHyCqYD5Z6RTjrbQY9WOCsmub/dcuMavfXQZqe9g2+OrQ==} + '@push.rocks/smartfile-interfaces@1.0.7': resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} '@push.rocks/smartfile@11.2.7': resolution: {integrity: sha512-8Yp7/sAgPpWJBHohV92ogHWKzRomI5MEbSG6b5W2n18tqwfAmjMed0rQvsvGrSBlnEWCKgoOrYIIZbLO61+J0Q==} + '@push.rocks/smartfile@13.1.2': + resolution: {integrity: sha512-DaEhwmnGEpX4coeeToaw4cZe3pNBhH7CY1iGr+d3pIXihozREvzzAR9/0i2r7bUXXL5+Lgy8YYIk5ZS+fwxMKA==} + '@push.rocks/smartfs@1.5.0': resolution: {integrity: sha512-QwMD44HgX3d9PPxUwR0uS+0PEMtesKvKbZR+s4pezL2er6oPneKJMLkO6TJPvJ38nug6Lmlk9Bu7UrwR2kS3Vw==} @@ -113,15 +530,33 @@ packages: '@push.rocks/smarthash@3.2.6': resolution: {integrity: sha512-Mq/WNX0Tjjes3X1gHd/ZBwOOKSrAG/Z3Xoc0OcCm3P20WKpniihkMpsnlE7wGjvpHLi/ZRe/XkB3KC3d5r9X4g==} + '@push.rocks/smarti18n@1.0.4': + resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} + + '@push.rocks/smartinteract@2.0.16': + resolution: {integrity: sha512-eltvVRRUKBKd77DSFA4DPY2g4V4teZLNe8A93CDy/WglglYcUjxMoLY/b0DFTWCWKYT+yjk6Fe6p0FRrvX9Yvg==} + '@push.rocks/smartjson@5.2.0': resolution: {integrity: sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==} '@push.rocks/smartjson@6.0.0': resolution: {integrity: sha512-FYfJnmukt66WePn6xrVZ3BLmRQl9W82LcsICK3VU9sGW7kasig090jKXPm+yX8ibQcZAO/KyR/Q8tMIYZNxGew==} + '@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.2.1': resolution: {integrity: sha512-x9/P59pfzY6HOGYmYrhqmoRl/pliTVx44g2Vbb8dIr/0zA39cAJHlPze1+UGncn37XKGmutK2iLSsJLEsexD0A==} + '@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==} @@ -131,9 +566,15 @@ packages: '@push.rocks/smartmime@2.0.4': resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} + '@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@6.0.0': resolution: {integrity: sha512-r94u1MbBaIOSy+517PZp2P7SuZPSe9LkwJ8l3dXQKHeIOri/zDxk/RQPiFM+j4N9301ztkRyhvRj7xgUDroOsg==} @@ -146,6 +587,9 @@ packages: '@push.rocks/smartrequest@4.4.2': resolution: {integrity: sha512-Om4y1Ce4YdSu8VoXREz2SgFz9pDxcFEm0+SC1YYa3RXd0AH2Mknaj/1XfvfMqojnK9L7N2z1fY4xX8tO1IwqFQ==} + '@push.rocks/smartrequest@5.0.1': + resolution: {integrity: sha512-gZQQF6HVt3LwTBxaPh6hHObd4VF76PUYQcs5pHD7f0VXaEewmrNAQSnccoinOY7fi45+0dOf04PJOXu9MibPzQ==} + '@push.rocks/smartrouter@1.3.3': resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} @@ -155,9 +599,18 @@ packages: '@push.rocks/smartrx@3.0.10': resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} + '@push.rocks/smartserve@2.0.1': + resolution: {integrity: sha512-YQb2qexfCzCqOlLWBBXKMg6xG4zahCPAxomz/KEKAwHtW6wMTtuHKSTSkRTQ0vl9jssLMAmRz2OyafiL9XGJXQ==} + '@push.rocks/smartshell@3.3.8': resolution: {integrity: sha512-t9J/py0vnea4ZtOs7Anc9dc6lcvg6EDvYBw5eE1mB+KUWxMQf/ROIQwWMo6B9SMNY4JS2UwvfuJQJ8makP/7Tg==} + '@push.rocks/smartsitemap@2.0.4': + resolution: {integrity: sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==} + + '@push.rocks/smartspawn@3.0.3': + resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} + '@push.rocks/smartstate@2.2.1': resolution: {integrity: sha512-fLrilAJNI6QOs0hcBRD9eTwU2Rlo6NlDCKQo9N/zyp0VJ6AV1UVdEZcVIQILu1CO0RUHX9aBAbFunJrb2+Zrkg==} @@ -176,9 +629,19 @@ packages: '@push.rocks/smarturl@3.1.0': resolution: {integrity: sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==} + '@push.rocks/smartwatch@6.3.0': + resolution: {integrity: sha512-TeZ1PGBoBMpC4/CK8StIj5InEiFfKp7xWJSm3aYMjB/uaoeRP0vXqv1ORIC/TKYGJuEDuAXUsit8tZVjn0qT1Q==} + engines: {node: '>=20.0.0'} + + '@push.rocks/smartxml@2.0.0': + resolution: {integrity: sha512-1d06zYJX4Zt8s5w5qFOUg2LAEz9ykrh9d6CQPK4WAgOBIefb1xzVEWHc7yoxicc2OkzNgC3IBCEg3s6BncZKWw==} + '@push.rocks/smartyaml@2.0.5': resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} + '@push.rocks/smartyaml@3.0.4': + resolution: {integrity: sha512-1JRt+hnoc2zHw3AW+vXKlCdSVwqOmY/01fu+2HBviS0UDjoZCa+/rp6E3GaQb5lEEafKi8ENbffAfjXXp3N2xQ==} + '@push.rocks/taskbuffer@3.5.0': resolution: {integrity: sha512-Y9WwIEIyp6oVFdj06j84tfrZIvjhbMb3DF52rYxlTeYLk3W7RPhSg1bGPCbtkXWeKdBrSe37V90BkOG7Qq8Pqg==} @@ -194,17 +657,197 @@ packages: '@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/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/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@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/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/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 + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.52': + resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} + + '@rspack/binding-darwin-arm64@1.7.9': + resolution: {integrity: sha512-64dgstte0If5czi9bA/cpOe0ryY6wC9AIQRtyJ3DlOF6Tt+y9cKkmUoGu3V+WYaYIZRT7HNk8V7kL8amVjFTYw==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.9': + resolution: {integrity: sha512-2QSLs3w4rLy4UUGVnIlkt6IlIKOzR1e0RPsq2FYQW6s3p9JrwRCtOeHohyh7EJSqF54dtfhe9UZSAwba3LqH1Q==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.9': + resolution: {integrity: sha512-qhUGI/uVfvLmKWts4QkVHGL8yfUyJkblZs+OFD5Upa2y676EOsbQgWsCwX4xGB6Tv+TOzFP0SLh/UfO8ZfdE+w==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.7.9': + resolution: {integrity: sha512-VjfmR1hgO9n3L6MaE5KG+DXSrrLVqHHOkVcOtS2LMq3bjMTwbBywY7ycymcLnX5KJsol8d3ZGYep6IfSOt3lFA==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.7.9': + resolution: {integrity: sha512-0kldV+3WTs/VYDWzxJ7K40hCW26IHtnk8xPK3whKoo1649rgeXXa0EdsU5P7hG8Ef5SWQjHHHZ/fuHYSO3Y6HA==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.7.9': + resolution: {integrity: sha512-Gi4872cFtc2d83FKATR6Qcf2VBa/tFCqffI/IwRRl6Hx5FulEBqx+tH7gAuRVF693vrbXNxK+FQ+k4iEsEJxrw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.7.9': + resolution: {integrity: sha512-5QEzqo6EaolpuZmK6w/mgSueorgGnnzp7dJaAvBj6ECFIg/aLXhXXmWCWbxt7Ws2gKvG5/PgaxDqbUxYL51juA==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.9': + resolution: {integrity: sha512-MMqvcrIc8aOqTuHjWkjdzilvoZ3Hv07Od0Foogiyq3JMudsS3Wcmh7T1dFerGg19MOJcRUeEkrg2NQOMOQ6xDA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.9': + resolution: {integrity: sha512-4kYYS+NZ2CuNbKjq40yB/UEyB51o1PHj5wpr+Y943oOJXpEKWU2Q4vkF8VEohPEcnA9cKVotYCnqStme+02suA==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.9': + resolution: {integrity: sha512-1g+QyXXvs+838Un/4GaUvJfARDGHMCs15eXDYWBl5m/Skubyng8djWAgr6ag1+cVoJZXCPOvybTItcblWF3gbQ==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.9': + resolution: {integrity: sha512-A56e0NdfNwbOSJoilMkxzaPuVYaKCNn1shuiwWnCIBmhV9ix1n9S1XvquDjkGyv+gCdR1+zfJBOa5DMB7htLHw==} + + '@rspack/core@1.7.9': + resolution: {integrity: sha512-VHuSKvRkuv42Ya+TxEGO0LE0r9+8P4tKGokmomj4R1f/Nu2vtS3yoaIMfC4fR6VuHGd3MZ+KTI0cNNwHfFcskw==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@stack.gallery/catalog@file:../catalog': + resolution: {directory: ../catalog, type: directory} + '@tempfix/idb@8.0.3': resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} @@ -222,6 +865,141 @@ packages: vue: optional: true + '@tempfix/webcontainer__api@1.6.1': + resolution: {integrity: sha512-Hgn3cwy0vPzjrVBqeVnY0jNZLaOCW7d+dxBe7Jv9YGHAjJ8udUMS+KbTywSv5paAfld3A/RN/iolmMzOwZxLTA==} + + '@tiptap/core@2.27.2': + resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.2': + resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.2': + resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.2': + resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.2': + resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.2': + resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.2': + resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.2': + resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.2': + resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.2': + resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.2': + resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.2': + resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.2': + resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.2': + resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-link@2.27.2': + resolution: {integrity: sha512-bnP61qkr0Kj9Cgnop1hxn2zbOCBzNtmawxr92bVTOE31fJv6FhtCnQiD6tuPQVGMYhcmAj7eihtvuEMFfqEPcQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-list-item@2.27.2': + resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.2': + resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.2': + resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.2': + resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-align@2.27.2': + resolution: {integrity: sha512-0Pyks6Hu+Q/+9+5/osoSv0SP6jIerdWMYbi13aaZLsJoj3lBj5WNaE11JtAwSFN5sx0IbqhDSlp1zkvRnzgZ8g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.27.2': + resolution: {integrity: sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.2': + resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.27.2': + resolution: {integrity: sha512-NSyqDa8PlAZoVRfTWQuxueTZ6ftOD72EV7UKVpftf3C+Heme727mvwl1YHMnagOlqVoxBhFOrl9CnSs/q5uayQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-underline@2.27.2': + resolution: {integrity: sha512-gPOsbAcw1S07ezpAISwoO8f0RxpjcSH7VsHEFDVuXm4ODE32nhvSinvHQjv2icRLOXev+bnA7oIBu7Oy859gWQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.2': + resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} + + '@tiptap/starter-kit@2.27.2': + resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -231,6 +1009,15 @@ packages: '@tsclass/tsclass@9.5.0': resolution: {integrity: sha512-HwMVwkrBnEFMjwOsMkGwWN/q+XEczSpf4a/PBAXgkDdV6sXdxAMFXUH1tW8Y5ecuvXFYMvFry4X57MCCT7Dm8A==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/buffer-json@2.0.3': + resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} + + '@types/clean-css@4.2.11': + resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -240,6 +1027,9 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/html-minifier@4.0.6': + resolution: {integrity: sha512-1Dcf38DkVMYo8SIOkUka7GxI+0BztCVsnfiG2Sxb6G8ShHDQTWQb1WKps/eb3O074HNDCn8wU7LMl5N99nNG+Q==} + '@types/js-yaml@3.12.10': resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} @@ -249,9 +1039,18 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} @@ -261,9 +1060,21 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/randomatic@3.1.5': + resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} + + '@types/relateurl@0.2.33': + resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} + '@types/symbol-tree@3.2.5': resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} @@ -276,6 +1087,9 @@ packages: '@types/turndown@5.0.6': resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==} + '@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==} @@ -285,6 +1099,9 @@ packages: '@types/which@3.0.4': resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -296,6 +1113,10 @@ packages: resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} engines: {node: '>=0.10.0'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -304,6 +1125,9 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + apexcharts@5.10.4: + resolution: {integrity: sha512-gt0VUqZ2+mr25ScbUcKZgJr96jKYm4vjOcxEWCEh/E5F4dWqhyo3dBhPRvNNnkKiWxkMd2cBwj3ZYH3rK39fkA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -323,6 +1147,12 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -333,6 +1163,12 @@ packages: broadcast-channel@7.3.0: resolution: {integrity: sha512-UHPhLBQKfQ8OmMFMpmPfO5dRakyA1vsfiDGWTYNvChYol65tbuhivPEGgZZiuetorvExdvxaWiBy/ym1Ty08yA==} + buffer-json@2.0.0: + resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -341,13 +1177,20 @@ packages: 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=} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -357,9 +1200,24 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + 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'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -375,10 +1233,14 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - concurrently@9.2.1: - resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} - engines: {node: '>=18'} - hasBin: true + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} croner@10.0.1: resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} @@ -388,6 +1250,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-random-string@5.0.0: + resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} + engines: {node: '>=14.16'} + date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -410,6 +1276,10 @@ packages: 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'} @@ -425,6 +1295,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -432,6 +1305,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -448,14 +1325,23 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + + 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'} + 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'} @@ -467,16 +1353,35 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + fake-indexeddb@5.0.2: resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} engines: {node: '>=18'} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} + engines: {node: '>=18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + + fast-xml-parser@4.5.4: + resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} + hasBin: true + + fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + hasBin: true + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -484,6 +1389,10 @@ packages: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} + 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'} @@ -500,13 +1409,17 @@ packages: resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} + 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==} - 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'} @@ -519,11 +1432,17 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} 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'} @@ -531,9 +1450,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -559,18 +1478,50 @@ packages: 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 + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + 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==} humanize-ms@1.2.1: resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + ibantools@4.5.1: + resolution: {integrity: sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + inflight@1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inquirer@11.1.0: + resolution: {integrity: sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==} + engines: {node: '>=18'} + + 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'} @@ -579,6 +1530,14 @@ packages: 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'} @@ -587,6 +1546,14 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} 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'} + isexe@2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} @@ -598,6 +1565,9 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -609,6 +1579,16 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lit-element@4.2.2: resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} @@ -624,13 +1604,38 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lower-case@1.1.4: + resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} + lucide@0.577.0: + resolution: {integrity: sha512-PpC/m5eOItp/WU/GlQPFBXDOhq6HibL73KzYP37OX3LM7VmzWQF8voEj8QRWUFvy9FIKfeDQkWYoyS1D/MdWFA==} + + 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-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + matcher@5.0.0: resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -639,6 +1644,9 @@ packages: 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==} @@ -678,6 +1686,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -782,6 +1793,9 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -790,14 +1804,32 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + nanoid@4.0.2: resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} engines: {node: ^14 || ^16 || >=18} hasBin: true + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + normalize-newline@4.1.0: + resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} + engines: {node: '>=12'} + + 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'} @@ -806,6 +1838,23 @@ packages: resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==} engines: {node: '>=16'} + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + once@1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} + engines: {node: '>=0.10.0'} + p-finally@1.0.0: resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} engines: {node: '>=4'} @@ -821,10 +1870,21 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + param-case@2.1.1: + resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + path-expression-matcher@1.2.0: + resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + engines: {node: '>=14.0.0'} + + 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'} @@ -836,10 +1896,18 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pdfjs-dist@4.10.38: + resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} + engines: {node: '>=20'} + peek-readable@5.4.2: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -847,10 +1915,91 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + prosemirror-changeset@2.4.0: + resolution: {integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.1: + resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} + + prosemirror-menu@1.3.0: + resolution: {integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} + + prosemirror-view@1.41.7: + resolution: {integrity: sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + + qs@6.15.0: + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + engines: {node: '>=0.6'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + relateurl@0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} @@ -866,9 +2015,28 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - require-directory@2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} + replace-buffer@1.2.1: + resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rolldown@1.0.0-beta.52: + resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -876,6 +2044,13 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -888,17 +2063,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + 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'} + 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==} + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + sprintf-js@1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} @@ -916,18 +2114,20 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + strnum@2.2.1: + resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} + strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - sweet-scroll@4.0.0: resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} @@ -938,17 +2138,23 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} - 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==} @@ -958,12 +2164,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + turndown-plugin-gfm@1.0.2: resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} turndown@7.2.2: resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + 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'} @@ -972,10 +2191,26 @@ packages: resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + 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.5.0: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -1004,6 +2239,13 @@ packages: unload@2.4.1: resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + 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=} @@ -1017,6 +2259,17 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + 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'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1027,31 +2280,53 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + wrappy@1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + + xterm-addon-fit@0.8.0: + resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} + peerDependencies: + xterm: ^5.0.0 + + xterm@5.3.0: + resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true yargs-parser@22.0.0: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} 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.3.0': @@ -1066,14 +2341,112 @@ snapshots: '@push.rocks/webrequest': 4.0.5 '@push.rocks/webstream': 1.0.10 + '@api.global/typedserver@8.4.2(@tiptap/pm@2.27.2)': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 4.1.2(@push.rocks/smartserve@2.0.1) + '@cloudflare/workers-types': 4.20260317.1 + '@design.estate/dees-catalog': 3.49.0(@tiptap/pm@2.27.2) + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.2.1 + '@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': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 2.0.1 + '@push.rocks/smartsitemap': 2.0.4 + '@push.rocks/smartstream': 3.4.0 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 + '@push.rocks/webrequest': 4.0.5 + '@push.rocks/webstore': 2.0.20 + '@tsclass/tsclass': 9.5.0 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@api.global/typedsocket@4.1.2(@push.rocks/smartserve@2.0.1)': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 2.0.1 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarturl': 3.1.0 + '@babel/runtime@7.28.6': {} '@borewit/text-codec@0.2.2': {} + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/workers-types@4.20260317.1': {} + '@configvault.io/interfaces@1.0.17': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 + '@design.estate/dees-catalog@3.49.0(@tiptap/pm@2.27.2)': + dependencies: + '@design.estate/dees-domtools': 2.5.1 + '@design.estate/dees-element': 2.2.3 + '@design.estate/dees-wcctools': 3.8.0 + '@fortawesome/fontawesome-svg-core': 7.2.0 + '@fortawesome/free-brands-svg-icons': 7.2.0 + '@fortawesome/free-regular-svg-icons': 7.2.0 + '@fortawesome/free-solid-svg-icons': 7.2.0 + '@push.rocks/smarti18n': 1.0.4 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + '@tempfix/webcontainer__api': 1.6.1 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-link': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-text-align': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-typography': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/starter-kit': 2.27.2 + '@tsclass/tsclass': 9.5.0 + apexcharts: 5.10.4 + highlight.js: 11.11.1 + ibantools: 4.5.1 + lucide: 0.577.0 + monaco-editor: 0.55.1 + pdfjs-dist: 4.10.38 + xterm: 5.3.0 + xterm-addon-fit: 0.8.0(xterm@5.3.0) + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - react + - supports-color + - vue + '@design.estate/dees-comms@1.0.30': dependencies: '@api.global/typedrequest': 3.3.0 @@ -1119,6 +2492,156 @@ snapshots: - supports-color - vue + '@design.estate/dees-wcctools@3.8.0': + dependencies: + '@design.estate/dees-domtools': 2.5.1 + '@design.estate/dees-element': 2.2.3 + '@push.rocks/smartdelay': 3.0.5 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + + '@fortawesome/fontawesome-common-types@7.2.0': {} + + '@fortawesome/fontawesome-svg-core@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-brands-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-regular-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-solid-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@git.zone/tsbundle@2.9.1': + dependencies: + '@push.rocks/early': 4.0.4 + '@push.rocks/npmextra': 5.3.3 + '@push.rocks/smartcli': 4.0.20 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartinteract': 2.0.16 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartspawn': 3.0.3 + '@rspack/core': 1.7.9 + '@types/html-minifier': 4.0.6 + esbuild: 0.27.4 + html-minifier: 4.0.0 + rolldown: 1.0.0-beta.52 + typescript: 5.9.3 + transitivePeerDependencies: + - '@nuxt/kit' + - '@swc/helpers' + - react + - supports-color + - vue + '@git.zone/tsdeno@1.2.0': dependencies: '@push.rocks/early': 4.0.4 @@ -1132,6 +2655,139 @@ snapshots: - supports-color - vue + '@git.zone/tsrun@2.0.1': + dependencies: + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartshell': 3.3.8 + tsx: 4.21.0 + + '@git.zone/tswatch@3.3.0(@tiptap/pm@2.27.2)': + dependencies: + '@api.global/typedserver': 8.4.2(@tiptap/pm@2.27.2) + '@git.zone/tsbundle': 2.9.1 + '@git.zone/tsrun': 2.0.1 + '@push.rocks/early': 4.0.4 + '@push.rocks/lik': 6.3.1 + '@push.rocks/npmextra': 5.3.3 + '@push.rocks/smartcli': 4.0.20 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 2.0.3 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartinteract': 2.0.16 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartshell': 3.3.8 + '@push.rocks/smartwatch': 6.3.0 + transitivePeerDependencies: + - '@nuxt/kit' + - '@swc/helpers' + - '@tiptap/pm' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@happy-dom/global-registrator@15.11.7': + dependencies: + happy-dom: 15.11.7 + + '@inquirer/checkbox@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 + + '@inquirer/confirm@4.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.15 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.19.15 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/editor@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + external-editor: 3.1.0 + + '@inquirer/expand@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/number@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/password@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@6.0.1': + dependencies: + '@inquirer/checkbox': 3.0.1 + '@inquirer/confirm': 4.0.1 + '@inquirer/editor': 3.0.1 + '@inquirer/expand': 3.0.1 + '@inquirer/input': 3.0.1 + '@inquirer/number': 2.0.1 + '@inquirer/password': 3.0.1 + '@inquirer/rawlist': 3.0.1 + '@inquirer/search': 2.0.1 + '@inquirer/select': 3.0.1 + + '@inquirer/rawlist@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/search@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/select@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + '@isaacs/cliui@9.0.0': {} '@lit-labs/ssr-dom-shim@1.5.1': {} @@ -1142,6 +2798,95 @@ snapshots: '@mixmark-io/domino@2.2.0': {} + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@napi-rs/canvas-android-arm64@0.1.97': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.97': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.97': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.97': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.97': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.97': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.97': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.97': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.97': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@0.1.97': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.97': + optional: true + + '@napi-rs/canvas@0.1.97': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.97 + '@napi-rs/canvas-darwin-arm64': 0.1.97 + '@napi-rs/canvas-darwin-x64': 0.1.97 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.97 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.97 + '@napi-rs/canvas-linux-arm64-musl': 0.1.97 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.97 + '@napi-rs/canvas-linux-x64-gnu': 0.1.97 + '@napi-rs/canvas-linux-x64-musl': 0.1.97 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.97 + '@napi-rs/canvas-win32-x64-msvc': 0.1.97 + optional: true + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.99.0': {} + '@push.rocks/consolecolor@2.0.3': dependencies: ansi-256-colors: 1.1.0 @@ -1151,6 +2896,11 @@ snapshots: '@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/lik@6.3.1': @@ -1193,6 +2943,14 @@ snapshots: dependencies: uint8array-extras: 1.5.0 + '@push.rocks/smartcache@1.0.18': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smarterror': 2.0.1 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartcli@4.0.20': dependencies: '@push.rocks/lik': 6.3.1 @@ -1223,11 +2981,21 @@ snapshots: dependencies: '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarterror@2.0.1': + dependencies: + clean-stack: 1.3.0 + make-error-cause: 2.3.0 + '@push.rocks/smartexit@2.0.3': dependencies: '@push.rocks/lik': 6.3.1 '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartfeed@1.4.0': + dependencies: + '@tsclass/tsclass': 9.5.0 + fast-xml-parser: 4.5.4 + '@push.rocks/smartfile-interfaces@1.0.7': {} '@push.rocks/smartfile@11.2.7': @@ -1248,6 +3016,23 @@ snapshots: glob: 11.1.0 js-yaml: 4.1.1 + '@push.rocks/smartfile@13.1.2': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartstream': 3.4.0 + '@types/js-yaml': 4.0.9 + glob: 11.1.0 + js-yaml: 4.1.1 + '@push.rocks/smartfs@1.5.0': dependencies: '@push.rocks/smartpath': 6.0.0 @@ -1266,6 +3051,15 @@ snapshots: '@types/through2': 2.0.41 through2: 4.0.2 + '@push.rocks/smarti18n@1.0.4': {} + + '@push.rocks/smartinteract@2.0.16': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + inquirer: 11.1.0 + '@push.rocks/smartjson@5.2.0': dependencies: '@push.rocks/smartenv': 5.0.13 @@ -1280,6 +3074,21 @@ snapshots: 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.2.1': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 @@ -1293,6 +3102,8 @@ snapshots: '@push.rocks/webrequest': 4.0.5 '@tsclass/tsclass': 9.5.0 + '@push.rocks/smartmanifest@2.0.2': {} + '@push.rocks/smartmarkdown@3.0.3': dependencies: '@push.rocks/smartyaml': 2.0.5 @@ -1318,11 +3129,27 @@ snapshots: file-type: 19.6.0 mime: 4.1.0 + '@push.rocks/smartntml@2.0.8': + dependencies: + '@design.estate/dees-element': 2.2.3 + '@happy-dom/global-registrator': 15.11.7 + '@push.rocks/smartpromise': 4.2.3 + fake-indexeddb: 6.2.5 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + '@push.rocks/smartobject@1.0.12': dependencies: fast-deep-equal: 3.1.3 minimatch: 9.0.9 + '@push.rocks/smartopen@2.0.0': + dependencies: + open: 8.4.2 + '@push.rocks/smartpath@6.0.0': {} '@push.rocks/smartpromise@4.2.3': {} @@ -1343,6 +3170,15 @@ snapshots: agentkeepalive: 4.6.0 form-data: 4.0.5 + '@push.rocks/smartrequest@5.0.1': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@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.5 + '@push.rocks/smartrouter@1.3.3': dependencies: '@push.rocks/lik': 6.3.1 @@ -1358,6 +3194,19 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 rxjs: 7.8.2 + '@push.rocks/smartserve@2.0.1': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@cfworker/json-schema': 4.1.1 + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartpath': 6.0.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@push.rocks/smartshell@3.3.8': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -1366,6 +3215,24 @@ snapshots: '@types/which': 3.0.4 which: 6.0.1 + '@push.rocks/smartsitemap@2.0.4': + dependencies: + '@push.rocks/smartcache': 1.0.18 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartxml': 2.0.0 + '@push.rocks/smartyaml': 3.0.4 + '@push.rocks/webrequest': 4.0.5 + '@tsclass/tsclass': 9.5.0 + + '@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.2.1': dependencies: '@push.rocks/smarthash': 3.2.6 @@ -1404,11 +3271,28 @@ snapshots: '@push.rocks/smarturl@3.1.0': {} + '@push.rocks/smartwatch@6.3.0': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 5.0.0 + picomatch: 4.0.3 + + '@push.rocks/smartxml@2.0.0': + dependencies: + fast-xml-parser: 5.5.8 + '@push.rocks/smartyaml@2.0.5': dependencies: '@types/js-yaml': 3.12.10 js-yaml: 3.14.2 + '@push.rocks/smartyaml@3.0.4': + dependencies: + yaml: 2.8.2 + '@push.rocks/taskbuffer@3.5.0': dependencies: '@design.estate/dees-element': 2.2.3 @@ -1454,18 +3338,318 @@ snapshots: dependencies: '@push.rocks/smartenv': 5.0.13 + '@pushrocks/isounique@1.0.5': {} + '@pushrocks/smartdelay@3.0.1': dependencies: '@pushrocks/smartpromise': 4.0.2 + '@pushrocks/smartenv@5.0.5': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@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@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/smartpromise@3.1.10': {} + '@pushrocks/smartpromise@4.0.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.8 + normalize-newline: 4.1.0 + randomatic: 3.1.1 + strip-indent: 4.1.1 + url: 0.11.4 + + '@remirror/core-constants@3.0.0': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.52': {} + + '@rspack/binding-darwin-arm64@1.7.9': + optional: true + + '@rspack/binding-darwin-x64@1.7.9': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.9': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.9': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.9': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.9': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.9': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.9': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.9': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.9': + optional: true + + '@rspack/binding@1.7.9': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.9 + '@rspack/binding-darwin-x64': 1.7.9 + '@rspack/binding-linux-arm64-gnu': 1.7.9 + '@rspack/binding-linux-arm64-musl': 1.7.9 + '@rspack/binding-linux-x64-gnu': 1.7.9 + '@rspack/binding-linux-x64-musl': 1.7.9 + '@rspack/binding-wasm32-wasi': 1.7.9 + '@rspack/binding-win32-arm64-msvc': 1.7.9 + '@rspack/binding-win32-ia32-msvc': 1.7.9 + '@rspack/binding-win32-x64-msvc': 1.7.9 + + '@rspack/core@1.7.9': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.9 + '@rspack/lite-tapable': 1.1.0 + + '@rspack/lite-tapable@1.1.0': {} + '@sec-ant/readable-stream@0.4.1': {} + '@stack.gallery/catalog@file:../catalog(@tiptap/pm@2.27.2)': + dependencies: + '@design.estate/dees-catalog': 3.49.0(@tiptap/pm@2.27.2) + '@design.estate/dees-domtools': 2.5.1 + '@design.estate/dees-element': 2.2.3 + '@design.estate/dees-wcctools': 3.8.0 + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - react + - supports-color + - vue + '@tempfix/idb@8.0.3': {} '@tempfix/lenis@1.3.20': {} + '@tempfix/webcontainer__api@1.6.1': {} + + '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-link@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text-align@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text-style@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-typography@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-underline@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/pm@2.27.2': + dependencies: + prosemirror-changeset: 2.4.0 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.3.0 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.7) + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.7 + + '@tiptap/starter-kit@2.27.2': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/pm': 2.27.2 + '@tokenizer/token@0.3.0': {} '@tsclass/tsclass@4.4.4': @@ -1476,6 +3660,18 @@ snapshots: dependencies: type-fest: 5.5.0 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/buffer-json@2.0.3': {} + + '@types/clean-css@4.2.11': + dependencies: + '@types/node': 25.5.0 + source-map: 0.6.1 + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -1489,6 +3685,12 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/html-minifier@4.0.6': + dependencies: + '@types/clean-css': 4.2.11 + '@types/relateurl': 0.2.33 + '@types/uglify-js': 3.17.5 + '@types/js-yaml@3.12.10': {} '@types/js-yaml@4.0.9': {} @@ -1497,20 +3699,41 @@ snapshots: dependencies: '@types/node': 25.5.0 + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/mime-types@2.1.4': {} '@types/minimatch@5.1.2': {} '@types/ms@2.1.0': {} + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 25.5.0 + + '@types/node@22.19.15': + dependencies: + undici-types: 6.21.0 + '@types/node@25.5.0': dependencies: undici-types: 7.18.2 + '@types/randomatic@3.1.5': {} + + '@types/relateurl@0.2.33': {} + '@types/symbol-tree@3.2.5': {} '@types/through2@2.0.41': @@ -1521,12 +3744,18 @@ snapshots: '@types/turndown@5.0.6': {} + '@types/uglify-js@3.17.5': + dependencies: + source-map: 0.6.1 + '@types/unist@3.0.3': {} '@types/uuid@9.0.8': {} '@types/which@3.0.4': {} + '@types/wrap-ansi@3.0.0': {} + '@ungap/structured-clone@1.3.0': {} agentkeepalive@4.6.0: @@ -1535,12 +3764,18 @@ snapshots: ansi-256-colors@1.1.0: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + apexcharts@5.10.4: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -1555,6 +3790,13 @@ snapshots: balanced-match@4.0.4: {} + base64-js@1.5.1: {} + + 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 @@ -1570,6 +3812,13 @@ snapshots: p-queue: 6.6.2 unload: 2.4.1 + buffer-json@2.0.0: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1582,12 +3831,19 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 - ccount@2.0.1: {} - - chalk@4.1.2: + call-bound@1.0.4: dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + 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 + + ccount@2.0.1: {} character-entities-html4@2.1.0: {} @@ -1595,11 +3851,19 @@ snapshots: character-entities@2.0.2: {} - cliui@8.0.1: + chardet@0.7.0: {} + + chokidar@5.0.0: dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + readdirp: 5.0.0 + + clean-css@4.2.4: + dependencies: + source-map: 0.6.1 + + clean-stack@1.3.0: {} + + cli-width@4.1.0: {} color-convert@2.0.1: dependencies: @@ -1613,14 +3877,11 @@ snapshots: comma-separated-tokens@2.0.3: {} - concurrently@9.2.1: - dependencies: - chalk: 4.1.2 - rxjs: 7.8.2 - shell-quote: 1.8.3 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 + commander@2.20.3: {} + + concat-map@0.0.1: {} + + crelt@1.0.6: {} croner@10.0.1: {} @@ -1630,6 +3891,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-random-string@5.0.0: + dependencies: + type-fest: 2.19.0 + date-fns@4.1.0: {} dayjs@1.11.20: {} @@ -1648,6 +3913,8 @@ snapshots: 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 @@ -1662,6 +3929,10 @@ snapshots: dependencies: dequal: 2.0.3 + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1670,6 +3941,8 @@ snapshots: emoji-regex@8.0.0: {} + entities@4.5.0: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -1685,22 +3958,75 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - escalade@3.2.0: {} + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} + esm@3.2.25: {} + esprima@4.0.1: {} eventemitter3@4.0.7: {} extend@3.0.2: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + fake-indexeddb@5.0.2: {} + fake-indexeddb@6.2.5: {} + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.2.0 + + fast-xml-parser@4.5.4: + dependencies: + strnum: 1.1.2 + + fast-xml-parser@5.5.8: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.2.0 + strnum: 2.2.1 + fault@2.0.1: dependencies: format: 0.2.2 @@ -1712,6 +4038,11 @@ snapshots: token-types: 6.1.2 uint8array-extras: 1.5.0 + 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 @@ -1733,9 +4064,12 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - function-bind@1.1.2: {} + fs.realpath@1.0.0: {} - get-caller-file@2.0.5: {} + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} get-intrinsic@1.3.0: dependencies: @@ -1760,6 +4094,10 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -1769,11 +4107,24 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.2 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + gopd@1.2.0: {} graceful-fs@4.2.11: {} - has-flag@4.0.0: {} + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 has-property-descriptors@1.0.2: dependencies: @@ -1813,16 +4164,54 @@ snapshots: dependencies: '@types/hast': 3.0.4 + he@1.2.0: {} + + highlight.js@11.11.1: {} + + 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: {} humanize-ms@1.2.1: dependencies: ms: 2.1.3 + ibantools@4.5.1: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} + inquirer@11.1.0: + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/prompts': 6.0.1 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + ansi-escapes: 4.3.2 + mute-stream: 1.0.0 + run-async: 3.0.0 + rxjs: 7.8.2 + + is-docker@2.2.1: {} + is-fullwidth-code-point@3.0.0: {} is-nan@1.3.2: @@ -1830,10 +4219,20 @@ snapshots: 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-stream@4.0.1: {} + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + isexe@2.0.0: {} isexe@4.0.0: {} @@ -1842,6 +4241,8 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + js-base64@3.7.8: {} + js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -1857,6 +4258,14 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + kind-of@6.0.3: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 @@ -1877,16 +4286,43 @@ snapshots: longest-streak@3.1.0: {} + lower-case@1.1.4: {} + lru-cache@11.2.7: {} + lucide@0.577.0: {} + + 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-it@14.1.1: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} + marked@14.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 @@ -2012,6 +4448,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdurl@2.0.0: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -2222,20 +4660,57 @@ snapshots: dependencies: brace-expansion: 5.0.4 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 minipass@7.1.3: {} + monaco-editor@0.55.1: + dependencies: + dompurify: 3.2.7 + marked: 14.0.0 + ms@2.1.3: {} + mute-stream@1.0.0: {} + nanoid@4.0.2: {} + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + normalize-newline@4.1.0: + dependencies: + replace-buffer: 1.2.1 + + object-inspect@1.13.4: {} + object-keys@1.1.1: {} oblivious-set@2.0.0: {} + observable-fns@0.6.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + orderedmap@2.1.1: {} + + os-tmpdir@1.0.2: {} + p-finally@1.0.0: {} p-queue@6.6.2: @@ -2249,8 +4724,16 @@ snapshots: package-json-from-dist@1.0.1: {} + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + parse-ms@4.0.0: {} + path-expression-matcher@1.2.0: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@2.0.2: @@ -2260,20 +4743,147 @@ snapshots: path-to-regexp@8.3.0: {} + pdfjs-dist@4.10.38: + optionalDependencies: + '@napi-rs/canvas': 0.1.97 + peek-readable@5.4.2: {} + picomatch@4.0.3: {} + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 property-information@7.1.0: {} + prosemirror-changeset@2.4.0: + dependencies: + prosemirror-transform: 1.11.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.7 + + prosemirror-gapcursor@1.4.1: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.7 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.7 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.4: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.1 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.3.0: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.7 + + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.7 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.7): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.7 + + prosemirror-transform@1.11.0: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.7: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + punycode.js@2.3.1: {} + + punycode@1.4.1: {} + + qs@6.15.0: + dependencies: + side-channel: 1.1.0 + + randomatic@3.1.1: + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@5.0.0: {} + + relateurl@0.2.7: {} + remark-frontmatter@5.0.0: dependencies: '@types/mdast': 4.0.4 @@ -2317,7 +4927,37 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - require-directory@2.1.1: {} + replace-buffer@1.2.1: {} + + resolve-pkg-maps@1.0.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rolldown@1.0.0-beta.52: + dependencies: + '@oxc-project/types': 0.99.0 + '@rolldown/pluginutils': 1.0.0-beta.52 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-x64': 1.0.0-beta.52 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 + + rope-sequence@1.3.4: {} + + run-async@3.0.0: {} rxjs@7.8.2: dependencies: @@ -2325,6 +4965,10 @@ snapshots: safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -2340,12 +4984,51 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + 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: {} + source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + 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: {} string-width@4.2.3: @@ -2367,57 +5050,91 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-indent@4.1.1: {} + + strnum@1.1.2: {} + + strnum@2.2.1: {} + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - sweet-scroll@4.0.0: {} symbol-tree@3.2.4: {} tagged-tag@1.0.0: {} + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.4.3 + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + through2@4.0.2: dependencies: readable-stream: 3.6.2 + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.2 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} trough@2.2.0: {} tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + turndown-plugin-gfm@1.0.2: {} turndown@7.2.2: dependencies: '@mixmark-io/domino': 2.2.0 + type-fest@0.21.3: {} + + type-fest@2.19.0: {} + type-fest@4.41.0: {} type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + uglify-js@3.19.3: {} + uint8array-extras@1.5.0: {} + undici-types@6.21.0: {} + undici-types@7.18.2: {} unified@11.0.5: @@ -2457,6 +5174,13 @@ snapshots: unload@2.4.1: {} + upper-case@1.1.3: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.15.0 + util-deprecate@1.0.2: {} uuid@9.0.1: {} @@ -2471,6 +5195,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + w3c-keyname@2.2.8: {} + + webidl-conversions@7.0.0: {} + + whatwg-mimetype@3.0.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2479,26 +5209,26 @@ snapshots: dependencies: isexe: 4.0.0 - wrap-ansi@7.0.0: + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - y18n@5.0.8: {} + wrappy@1.0.2: {} - yargs-parser@21.1.1: {} + ws@8.19.0: {} + + xterm-addon-fit@0.8.0(xterm@5.3.0): + dependencies: + xterm: 5.3.0 + + xterm@5.3.0: {} + + yaml@2.8.2: {} yargs-parser@22.0.0: {} - 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 + yoctocolors-cjs@2.1.3: {} zwitch@2.0.4: {} diff --git a/readme.md b/readme.md index e5af38c..01b64b3 100644 --- a/readme.md +++ b/readme.md @@ -1,14 +1,21 @@ # @stack.gallery/registry 📦 -A self-hosted, multi-protocol package registry built with Deno and TypeScript. Run your own private **NPM**, **Docker/OCI**, **Maven**, **Cargo**, **PyPI**, **Composer**, and **RubyGems** registry — all behind a single binary with a modern web UI. +A self-hosted, multi-protocol package registry built with Deno and TypeScript. Run your own private +**NPM**, **Docker/OCI**, **Maven**, **Cargo**, **PyPI**, **Composer**, and **RubyGems** registry — +all behind a single binary with a modern web UI. ## Issue Reporting and Security -For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly. +For reporting bugs, issues, or security vulnerabilities, please visit +[community.foss.global/](https://community.foss.global/). This is the central community hub for all +issue reporting. Developers who sign and comply with our contribution agreement and go through +identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull +Requests directly. ## ✨ Features -- 🔌 **7 Protocol Support** — NPM, OCI/Docker, Maven, Cargo, PyPI, Composer, RubyGems via [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) +- 🔌 **7 Protocol Support** — NPM, OCI/Docker, Maven, Cargo, PyPI, Composer, RubyGems via + [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) - 🏢 **Organizations & Teams** — Hierarchical access control: orgs → teams → repositories - 🔐 **Flexible Authentication** — Local JWT auth, OAuth/OIDC, and LDAP with JIT user provisioning - 🎫 **Scoped API Tokens** — Per-protocol, per-scope tokens (`srg_` prefix) for CI/CD pipelines @@ -33,13 +40,14 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash # Install specific version -curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.3.0 +curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.4.0 # Install + set up systemd service curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --setup-service ``` The installer: + - Detects your platform (Linux/macOS, x64/ARM64) - Downloads the pre-compiled binary from Gitea releases - Installs to `/opt/stack-gallery-registry/` with a symlink in `/usr/local/bin/` @@ -63,24 +71,25 @@ The registry is available at `http://localhost:3000`. ## ⚙️ Configuration -Configuration is loaded from **environment variables** (production) or from **`.nogit/env.json`** when using the `--ephemeral` flag (development). +Configuration is loaded from **environment variables** (production) or from **`.nogit/env.json`** +when using the `--ephemeral` flag (development). -| Variable | Default | Description | -|----------|---------|-------------| -| `MONGODB_URL` | `mongodb://localhost:27017` | MongoDB connection string | -| `MONGODB_DB` | `stackgallery` | Database name | -| `S3_ENDPOINT` | `http://localhost:9000` | S3-compatible endpoint | -| `S3_ACCESS_KEY` | `minioadmin` | S3 access key | -| `S3_SECRET_KEY` | `minioadmin` | S3 secret key | -| `S3_BUCKET` | `registry` | S3 bucket name | -| `S3_REGION` | — | S3 region | -| `HOST` | `0.0.0.0` | Server bind address | -| `PORT` | `3000` | Server port | -| `JWT_SECRET` | `change-me-in-production` | JWT signing secret | -| `AUTH_ENCRYPTION_KEY` | *(ephemeral)* | 64-char hex for AES-256-GCM encryption of OAuth/LDAP secrets | -| `STORAGE_PATH` | `packages` | Base path in S3 for artifacts | -| `ENABLE_UPSTREAM_CACHE` | `true` | Cache packages from upstream registries | -| `UPSTREAM_CACHE_EXPIRY` | `24` | Cache TTL in hours | +| Variable | Default | Description | +| ----------------------- | --------------------------- | ------------------------------------------------------------ | +| `MONGODB_URL` | `mongodb://localhost:27017` | MongoDB connection string | +| `MONGODB_DB` | `stackgallery` | Database name | +| `S3_ENDPOINT` | `http://localhost:9000` | S3-compatible endpoint | +| `S3_ACCESS_KEY` | `minioadmin` | S3 access key | +| `S3_SECRET_KEY` | `minioadmin` | S3 secret key | +| `S3_BUCKET` | `registry` | S3 bucket name | +| `S3_REGION` | — | S3 region | +| `HOST` | `0.0.0.0` | Server bind address | +| `PORT` | `3000` | Server port | +| `JWT_SECRET` | `change-me-in-production` | JWT signing secret | +| `AUTH_ENCRYPTION_KEY` | _(ephemeral)_ | 64-char hex for AES-256-GCM encryption of OAuth/LDAP secrets | +| `STORAGE_PATH` | `packages` | Base path in S3 for artifacts | +| `ENABLE_UPSTREAM_CACHE` | `true` | Cache packages from upstream registries | +| `UPSTREAM_CACHE_EXPIRY` | `24` | Cache TTL in hours | **Example `.nogit/env.json`:** @@ -99,33 +108,39 @@ Configuration is loaded from **environment variables** (production) or from **`. ## 🔌 Protocol Endpoints -Each protocol is handled natively via [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry). Point your package manager at the registry: +Each protocol is handled natively via +[`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry). Point your package +manager at the registry: -| Protocol | Paths | Client Config Example | -|----------|-------|-----------------------| -| **NPM** | `/-/*`, `/@scope/*` | `npm config set registry http://registry:3000` | -| **OCI/Docker** | `/v2/*` | `docker login registry:3000` | -| **Maven** | `/maven2/*` | Add repository URL in `pom.xml` | -| **Cargo** | `/api/v1/crates/*` | Configure in `.cargo/config.toml` | -| **PyPI** | `/simple/*`, `/pypi/*` | `pip install --index-url http://registry:3000/simple/` | -| **Composer** | `/packages.json`, `/p/*` | Add repository in `composer.json` | -| **RubyGems** | `/api/v1/gems/*`, `/gems/*` | `gem sources -a http://registry:3000` | +| Protocol | Paths | Client Config Example | +| -------------- | --------------------------- | ------------------------------------------------------ | +| **NPM** | `/-/*`, `/@scope/*` | `npm config set registry http://registry:3000` | +| **OCI/Docker** | `/v2/*` | `docker login registry:3000` | +| **Maven** | `/maven2/*` | Add repository URL in `pom.xml` | +| **Cargo** | `/api/v1/crates/*` | Configure in `.cargo/config.toml` | +| **PyPI** | `/simple/*`, `/pypi/*` | `pip install --index-url http://registry:3000/simple/` | +| **Composer** | `/packages.json`, `/p/*` | Add repository in `composer.json` | +| **RubyGems** | `/api/v1/gems/*`, `/gems/*` | `gem sources -a http://registry:3000` | -Authentication works with **Bearer tokens** (API tokens prefixed `srg_`) and **Basic auth** (email:password or username:token). +Authentication works with **Bearer tokens** (API tokens prefixed `srg_`) and **Basic auth** +(email:password or username:token). ## 🔐 Authentication & Security ### Local Auth + - JWT-based with **15-minute access tokens** and **7-day refresh tokens** (HS256) - Session tracking — each login creates a session, tokens embed session IDs - Password hashing with PBKDF2 (10,000 rounds SHA-256 + random salt) ### External Auth (OAuth/OIDC & LDAP) + - **OAuth/OIDC** — Connect to any OIDC-compliant provider (Keycloak, Okta, Auth0, Azure AD, etc.) - **LDAP** — Bind + search authentication against Active Directory or OpenLDAP - **JIT Provisioning** — Users are auto-created on first external login - **Auto-linking** — External identities are linked to existing users by email match -- **Encrypted secrets** — Provider client secrets and bind passwords are stored AES-256-GCM encrypted +- **Encrypted secrets** — Provider client secrets and bind passwords are stored AES-256-GCM + encrypted ### RBAC Permissions @@ -143,6 +158,7 @@ Platform Admin (full access) ### Scoped API Tokens Tokens are prefixed with `srg_` and can be scoped to: + - Specific **protocols** (e.g., npm + oci only) - Specific **actions** (read / write / delete) - Specific **organizations** @@ -150,88 +166,98 @@ Tokens are prefixed with `srg_` and can be scoped to: ## 📡 REST API -All management endpoints live under `/api/v1/`. Authenticated via `Authorization: Bearer `. +All management endpoints live under `/api/v1/`. Authenticated via +`Authorization: Bearer `. ### Auth -| Method | Endpoint | Description | -|--------|----------|-------------| -| `POST` | `/api/v1/auth/login` | Login (email + password) | -| `POST` | `/api/v1/auth/refresh` | Refresh access token | -| `POST` | `/api/v1/auth/logout` | Logout (invalidate session) | -| `GET` | `/api/v1/auth/me` | Current user info | -| `GET` | `/api/v1/auth/providers` | List active external auth providers | -| `GET` | `/api/v1/auth/oauth/:id/authorize` | Initiate OAuth flow | -| `GET` | `/api/v1/auth/oauth/:id/callback` | OAuth callback | -| `POST` | `/api/v1/auth/ldap/:id/login` | LDAP login | + +| Method | Endpoint | Description | +| ------ | ---------------------------------- | ----------------------------------- | +| `POST` | `/api/v1/auth/login` | Login (email + password) | +| `POST` | `/api/v1/auth/refresh` | Refresh access token | +| `POST` | `/api/v1/auth/logout` | Logout (invalidate session) | +| `GET` | `/api/v1/auth/me` | Current user info | +| `GET` | `/api/v1/auth/providers` | List active external auth providers | +| `GET` | `/api/v1/auth/oauth/:id/authorize` | Initiate OAuth flow | +| `GET` | `/api/v1/auth/oauth/:id/callback` | OAuth callback | +| `POST` | `/api/v1/auth/ldap/:id/login` | LDAP login | ### Users -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/users` | List users | -| `POST` | `/api/v1/users` | Create user | -| `GET` | `/api/v1/users/:id` | Get user | -| `PUT` | `/api/v1/users/:id` | Update user | + +| Method | Endpoint | Description | +| -------- | ------------------- | ----------- | +| `GET` | `/api/v1/users` | List users | +| `POST` | `/api/v1/users` | Create user | +| `GET` | `/api/v1/users/:id` | Get user | +| `PUT` | `/api/v1/users/:id` | Update user | | `DELETE` | `/api/v1/users/:id` | Delete user | ### Organizations -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/organizations` | List organizations | -| `POST` | `/api/v1/organizations` | Create organization | -| `GET` | `/api/v1/organizations/:id` | Get organization | -| `PUT` | `/api/v1/organizations/:id` | Update organization | -| `DELETE` | `/api/v1/organizations/:id` | Delete organization | -| `GET` | `/api/v1/organizations/:id/members` | List members | -| `POST` | `/api/v1/organizations/:id/members` | Add member | -| `PUT` | `/api/v1/organizations/:id/members/:userId` | Update member role | -| `DELETE` | `/api/v1/organizations/:id/members/:userId` | Remove member | + +| Method | Endpoint | Description | +| -------- | ------------------------------------------- | ------------------- | +| `GET` | `/api/v1/organizations` | List organizations | +| `POST` | `/api/v1/organizations` | Create organization | +| `GET` | `/api/v1/organizations/:id` | Get organization | +| `PUT` | `/api/v1/organizations/:id` | Update organization | +| `DELETE` | `/api/v1/organizations/:id` | Delete organization | +| `GET` | `/api/v1/organizations/:id/members` | List members | +| `POST` | `/api/v1/organizations/:id/members` | Add member | +| `PUT` | `/api/v1/organizations/:id/members/:userId` | Update member role | +| `DELETE` | `/api/v1/organizations/:id/members/:userId` | Remove member | ### Repositories -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/organizations/:orgId/repositories` | List org repos | -| `POST` | `/api/v1/organizations/:orgId/repositories` | Create repo | -| `GET` | `/api/v1/repositories/:id` | Get repo | -| `PUT` | `/api/v1/repositories/:id` | Update repo | -| `DELETE` | `/api/v1/repositories/:id` | Delete repo | + +| Method | Endpoint | Description | +| -------- | ------------------------------------------- | -------------- | +| `GET` | `/api/v1/organizations/:orgId/repositories` | List org repos | +| `POST` | `/api/v1/organizations/:orgId/repositories` | Create repo | +| `GET` | `/api/v1/repositories/:id` | Get repo | +| `PUT` | `/api/v1/repositories/:id` | Update repo | +| `DELETE` | `/api/v1/repositories/:id` | Delete repo | ### Packages -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/packages` | Search packages | -| `GET` | `/api/v1/packages/:id` | Get package details | -| `GET` | `/api/v1/packages/:id/versions` | List versions | -| `DELETE` | `/api/v1/packages/:id` | Delete package | -| `DELETE` | `/api/v1/packages/:id/versions/:version` | Delete version | + +| Method | Endpoint | Description | +| -------- | ---------------------------------------- | ------------------- | +| `GET` | `/api/v1/packages` | Search packages | +| `GET` | `/api/v1/packages/:id` | Get package details | +| `GET` | `/api/v1/packages/:id/versions` | List versions | +| `DELETE` | `/api/v1/packages/:id` | Delete package | +| `DELETE` | `/api/v1/packages/:id/versions/:version` | Delete version | ### Tokens -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/tokens` | List your tokens | -| `POST` | `/api/v1/tokens` | Create token | -| `DELETE` | `/api/v1/tokens/:id` | Revoke token | + +| Method | Endpoint | Description | +| -------- | -------------------- | ---------------- | +| `GET` | `/api/v1/tokens` | List your tokens | +| `POST` | `/api/v1/tokens` | Create token | +| `DELETE` | `/api/v1/tokens/:id` | Revoke token | ### Audit -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/audit` | Query audit logs | + +| Method | Endpoint | Description | +| ------ | --------------- | ---------------- | +| `GET` | `/api/v1/audit` | Query audit logs | ### Admin (Platform Admins Only) -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/api/v1/admin/auth/providers` | List all auth providers | -| `POST` | `/api/v1/admin/auth/providers` | Create auth provider | -| `GET` | `/api/v1/admin/auth/providers/:id` | Get provider details | -| `PUT` | `/api/v1/admin/auth/providers/:id` | Update provider | -| `DELETE` | `/api/v1/admin/auth/providers/:id` | Disable provider | -| `POST` | `/api/v1/admin/auth/providers/:id/test` | Test provider connection | -| `GET` | `/api/v1/admin/auth/settings` | Get platform settings | -| `PUT` | `/api/v1/admin/auth/settings` | Update platform settings | + +| Method | Endpoint | Description | +| -------- | --------------------------------------- | ------------------------ | +| `GET` | `/api/v1/admin/auth/providers` | List all auth providers | +| `POST` | `/api/v1/admin/auth/providers` | Create auth provider | +| `GET` | `/api/v1/admin/auth/providers/:id` | Get provider details | +| `PUT` | `/api/v1/admin/auth/providers/:id` | Update provider | +| `DELETE` | `/api/v1/admin/auth/providers/:id` | Disable provider | +| `POST` | `/api/v1/admin/auth/providers/:id/test` | Test provider connection | +| `GET` | `/api/v1/admin/auth/settings` | Get platform settings | +| `PUT` | `/api/v1/admin/auth/settings` | Update platform settings | ### Health Check -| Method | Endpoint | Description | -|--------|----------|-------------| -| `GET` | `/health` or `/healthz` | Returns JSON status of MongoDB, S3, and registry | + +| Method | Endpoint | Description | +| ------ | ----------------------- | ------------------------------------------------ | +| `GET` | `/health` or `/healthz` | Returns JSON status of MongoDB, S3, and registry | ## 🏗️ Architecture @@ -268,6 +294,9 @@ registry/ │ │ ├── auth.provider.ts # IAuthProvider implementation │ │ └── storage.provider.ts # IStorageHooks for quota/audit │ └── interfaces/ # TypeScript interfaces & types +├── ts_interfaces/ # Shared API contract (TypedRequest interfaces) +│ ├── data/ # Data types (auth, org, repo, package, token, audit, admin) +│ └── requests/ # Request/response interfaces for all API endpoints └── ui/ # Angular 19 + Tailwind CSS frontend └── src/app/ ├── features/ # Login, dashboard, orgs, repos, packages, tokens, admin @@ -277,17 +306,17 @@ registry/ ## 🔧 Technology Stack -| Component | Technology | -|-----------|------------| -| **Runtime** | Deno 2.x | -| **Language** | TypeScript (strict mode) | -| **Database** | MongoDB via [`@push.rocks/smartdata`](https://code.foss.global/push.rocks/smartdata) | -| **Storage** | S3 via [`@push.rocks/smartbucket`](https://code.foss.global/push.rocks/smartbucket) | -| **Registry Core** | [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) | -| **Frontend** | Angular 19 (Signals, Zoneless) + Tailwind CSS | -| **Auth** | JWT (HS256) + OAuth/OIDC + LDAP | -| **Build** | [`@git.zone/tsdeno`](https://code.foss.global/git.zone/tsdeno) cross-compilation | -| **CI/CD** | Gitea Actions → binary releases | +| Component | Technology | +| ----------------- | ------------------------------------------------------------------------------------ | +| **Runtime** | Deno 2.x | +| **Language** | TypeScript (strict mode) | +| **Database** | MongoDB via [`@push.rocks/smartdata`](https://code.foss.global/push.rocks/smartdata) | +| **Storage** | S3 via [`@push.rocks/smartbucket`](https://code.foss.global/push.rocks/smartbucket) | +| **Registry Core** | [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) | +| **Frontend** | Angular 19 (Signals, Zoneless) + Tailwind CSS | +| **Auth** | JWT (HS256) + OAuth/OIDC + LDAP | +| **Build** | [`@git.zone/tsdeno`](https://code.foss.global/git.zone/tsdeno) cross-compilation | +| **CI/CD** | Gitea Actions → binary releases | ## 🛠️ Development @@ -327,7 +356,8 @@ Releases are automated via Gitea Actions (`.gitea/workflows/release.yml`): 1. Push a `v*` tag 2. CI builds the Angular UI and bundles it into TypeScript -3. `tsdeno compile` produces binaries for 4 platforms (linux-x64, linux-arm64, macos-x64, macos-arm64) +3. `tsdeno compile` produces binaries for 4 platforms (linux-x64, linux-arm64, macos-x64, + macos-arm64) 4. Binaries + SHA256 checksums are uploaded as Gitea release assets Compile targets are configured in `npmextra.json` under `@git.zone/tsdeno`. @@ -344,21 +374,31 @@ For example: `packages/npm/myorg/mypackage/1.0.0/mypackage-1.0.0.tgz` ## License and Legal Information -This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file. +This repository contains open-source code licensed under the MIT License. A copy of the license can +be found in the [LICENSE](./LICENSE) file. -**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. +**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 or third parties, and are not included within the scope of the MIT license granted herein. +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 or third parties, 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 or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar. +Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the +guidelines of the respective third-party owners, and any usage must be approved in writing. +Third-party trademarks used herein are the property of their respective owners and used only in a +descriptive manner, e.g. for an implementation of an API or similar. ### Company Information -Task Venture Capital GmbH -Registered at District Court Bremen HRB 35230 HB, Germany +Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany For any legal inquiries or 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. +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. diff --git a/scripts/bundle-ui.ts b/scripts/bundle-ui.ts deleted file mode 100644 index 734821e..0000000 --- a/scripts/bundle-ui.ts +++ /dev/null @@ -1,214 +0,0 @@ -#!/usr/bin/env -S deno run --allow-all -/** - * UI Bundler Script - * Encodes all files from ui/dist/registry-ui/browser/ as base64 - * and generates ts/embedded-ui.generated.ts - * - * Usage: - * deno task bundle-ui # One-time bundle - * deno task bundle-ui:watch # Watch mode for development - */ - -import { walk } from 'jsr:@std/fs@1/walk'; -import { extname, relative } from 'jsr:@std/path@1'; -import { encodeBase64 } from 'jsr:@std/encoding@1/base64'; - -const UI_DIST_PATH = './ui/dist/registry-ui/browser'; -const OUTPUT_PATH = './ts/embedded-ui.generated.ts'; - -const CONTENT_TYPES: Record = { - '.html': 'text/html', - '.js': 'application/javascript', - '.css': 'text/css', - '.json': 'application/json', - '.png': 'image/png', - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.gif': 'image/gif', - '.svg': 'image/svg+xml', - '.ico': 'image/x-icon', - '.woff': 'font/woff', - '.woff2': 'font/woff2', - '.ttf': 'font/ttf', - '.eot': 'application/vnd.ms-fontobject', - '.otf': 'font/otf', - '.map': 'application/json', - '.txt': 'text/plain', - '.xml': 'application/xml', - '.webp': 'image/webp', - '.webmanifest': 'application/manifest+json', -}; - -interface IEmbeddedFile { - path: string; - base64: string; - contentType: string; - size: number; -} - -async function bundleUI(): Promise { - console.log('[bundle-ui] Starting UI bundling...'); - console.log(`[bundle-ui] Source: ${UI_DIST_PATH}`); - console.log(`[bundle-ui] Output: ${OUTPUT_PATH}`); - - // Check if UI dist exists - try { - await Deno.stat(UI_DIST_PATH); - } catch { - console.error(`[bundle-ui] ERROR: UI dist not found at ${UI_DIST_PATH}`); - console.error('[bundle-ui] Run "deno task build" first to build the UI'); - Deno.exit(1); - } - - const files: IEmbeddedFile[] = []; - let totalSize = 0; - - // Walk through all files in the dist directory - for await (const entry of walk(UI_DIST_PATH, { includeFiles: true, includeDirs: false })) { - const relativePath = '/' + relative(UI_DIST_PATH, entry.path).replace(/\\/g, '/'); - const ext = extname(entry.path).toLowerCase(); - const contentType = CONTENT_TYPES[ext] || 'application/octet-stream'; - - // Read file and encode as base64 - const content = await Deno.readFile(entry.path); - const base64 = encodeBase64(content); - - files.push({ - path: relativePath, - base64, - contentType, - size: content.length, - }); - - totalSize += content.length; - console.log(`[bundle-ui] Encoded: ${relativePath} (${formatSize(content.length)})`); - } - - // Sort files for consistent output - files.sort((a, b) => a.path.localeCompare(b.path)); - - // Generate TypeScript module - const tsContent = generateTypeScript(files, totalSize); - - // Write output file - await Deno.writeTextFile(OUTPUT_PATH, tsContent); - - console.log(`[bundle-ui] Generated ${OUTPUT_PATH}`); - console.log(`[bundle-ui] Total files: ${files.length}`); - console.log(`[bundle-ui] Total size: ${formatSize(totalSize)}`); - console.log(`[bundle-ui] Bundling complete!`); -} - -function generateTypeScript(files: IEmbeddedFile[], totalSize: number): string { - const fileEntries = files - .map( - (f) => - ` ['${f.path}', { base64: '${f.base64}', contentType: '${f.contentType}' }]` - ) - .join(',\n'); - - return `// AUTO-GENERATED FILE - DO NOT EDIT -// Generated by scripts/bundle-ui.ts -// Total files: ${files.length} -// Total size: ${formatSize(totalSize)} -// Generated at: ${new Date().toISOString()} - -interface IEmbeddedFile { - base64: string; - contentType: string; -} - -const EMBEDDED_FILES: Map = new Map([ -${fileEntries} -]); - -/** - * Get an embedded file by path - * @param path - The file path (e.g., '/index.html') - * @returns The file data and content type, or null if not found - */ -export function getEmbeddedFile(path: string): { data: Uint8Array; contentType: string } | null { - const file = EMBEDDED_FILES.get(path); - if (!file) return null; - - // Decode base64 to Uint8Array - const binaryString = atob(file.base64); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - return { data: bytes, contentType: file.contentType }; -} - -/** - * Check if an embedded file exists - * @param path - The file path to check - */ -export function hasEmbeddedFile(path: string): boolean { - return EMBEDDED_FILES.has(path); -} - -/** - * List all embedded file paths - */ -export function listEmbeddedFiles(): string[] { - return Array.from(EMBEDDED_FILES.keys()); -} - -/** - * Get the total number of embedded files - */ -export function getEmbeddedFileCount(): number { - return EMBEDDED_FILES.size; -} -`; -} - -function formatSize(bytes: number): string { - if (bytes < 1024) return `${bytes} B`; - if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; - return `${(bytes / (1024 * 1024)).toFixed(2)} MB`; -} - -async function watchMode(): Promise { - console.log('[bundle-ui] Starting watch mode...'); - console.log(`[bundle-ui] Watching: ${UI_DIST_PATH}`); - console.log('[bundle-ui] Press Ctrl+C to stop'); - console.log(''); - - // Initial bundle - await bundleUI(); - - // Watch for changes - const watcher = Deno.watchFs(UI_DIST_PATH); - let debounceTimer: number | null = null; - - for await (const event of watcher) { - if (event.kind === 'modify' || event.kind === 'create' || event.kind === 'remove') { - // Debounce - wait 500ms after last change - if (debounceTimer) { - clearTimeout(debounceTimer); - } - debounceTimer = setTimeout(async () => { - console.log(''); - console.log(`[bundle-ui] Change detected: ${event.kind}`); - try { - await bundleUI(); - } catch (error) { - console.error('[bundle-ui] Error during rebundle:', error); - } - }, 500); - } - } -} - -// Main entry point -const args = Deno.args; -const isWatch = args.includes('--watch') || args.includes('-w'); - -if (isWatch) { - await watchMode(); -} else { - await bundleUI(); -} diff --git a/test/docker-compose.test.yml b/test/docker-compose.test.yml index e5858dd..e3d9dfe 100644 --- a/test/docker-compose.test.yml +++ b/test/docker-compose.test.yml @@ -1,18 +1,18 @@ -version: "3.8" +version: '3.8' services: mongodb-test: image: mongo:7 container_name: stack-gallery-test-mongo ports: - - "27117:27017" + - '27117:27017' environment: MONGO_INITDB_ROOT_USERNAME: testadmin MONGO_INITDB_ROOT_PASSWORD: testpass tmpfs: - /data/db healthcheck: - test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] + test: ['CMD', 'mongosh', '--eval', "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 @@ -21,8 +21,8 @@ services: image: minio/minio:latest container_name: stack-gallery-test-minio ports: - - "9100:9000" - - "9101:9001" + - '9100:9000' + - '9101:9001' environment: MINIO_ROOT_USER: testadmin MINIO_ROOT_PASSWORD: testpassword @@ -30,7 +30,7 @@ services: tmpfs: - /data healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live'] interval: 5s timeout: 5s retries: 5 diff --git a/test/e2e/npm.e2e.test.ts b/test/e2e/npm.e2e.test.ts index e486961..b120aa5 100644 --- a/test/e2e/npm.e2e.test.ts +++ b/test/e2e/npm.e2e.test.ts @@ -6,25 +6,25 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import * as path from '@std/path'; import { - setupTestDb, - teardownTestDb, cleanupTestDb, - createTestUser, - createOrgWithOwner, - createTestRepository, - createTestApiToken, clients, - skipIfMissing, + createOrgWithOwner, + createTestApiToken, + createTestRepository, + createTestUser, runCommand, + setupTestDb, + skipIfMissing, + teardownTestDb, testConfig, } from '../helpers/index.ts'; const FIXTURE_DIR = path.join( path.dirname(path.fromFileUrl(import.meta.url)), - '../fixtures/npm/@stack-test/demo-package' + '../fixtures/npm/@stack-test/demo-package', ); describe('NPM E2E: Full lifecycle', () => { @@ -98,7 +98,7 @@ describe('NPM E2E: Full lifecycle', () => { const result = await clients.npm.publish( FIXTURE_DIR, `${registryUrl}/-/npm/${testOrgName}/`, - apiToken + apiToken, ); assertEquals(result.success, true, `npm publish failed: ${result.stderr}`); @@ -120,20 +120,28 @@ describe('NPM E2E: Full lifecycle', () => { // First publish const npmrcPath = path.join(FIXTURE_DIR, '.npmrc'); - const npmrcContent = `//${new URL(registryUrl).host}/-/npm/${testOrgName}/:_authToken=${apiToken}`; + const npmrcContent = `//${ + new URL(registryUrl).host + }/-/npm/${testOrgName}/:_authToken=${apiToken}`; await Deno.writeTextFile(npmrcPath, npmrcContent); try { await clients.npm.publish( FIXTURE_DIR, `${registryUrl}/-/npm/${testOrgName}/`, - apiToken + apiToken, ); // Fetch metadata via npm view const viewResult = await runCommand( - ['npm', 'view', '@stack-test/demo-package', '--registry', `${registryUrl}/-/npm/${testOrgName}/`], - { env: { npm_config__authToken: apiToken } } + [ + 'npm', + 'view', + '@stack-test/demo-package', + '--registry', + `${registryUrl}/-/npm/${testOrgName}/`, + ], + { env: { npm_config__authToken: apiToken } }, ); assertEquals(viewResult.success, true, `npm view failed: ${viewResult.stderr}`); @@ -159,32 +167,36 @@ describe('NPM E2E: Full lifecycle', () => { try { // First publish const npmrcPath = path.join(FIXTURE_DIR, '.npmrc'); - const npmrcContent = `//${new URL(registryUrl).host}/-/npm/${testOrgName}/:_authToken=${apiToken}`; + const npmrcContent = `//${ + new URL(registryUrl).host + }/-/npm/${testOrgName}/:_authToken=${apiToken}`; await Deno.writeTextFile(npmrcPath, npmrcContent); await clients.npm.publish( FIXTURE_DIR, `${registryUrl}/-/npm/${testOrgName}/`, - apiToken + apiToken, ); // Create package.json in temp dir await Deno.writeTextFile( path.join(tempDir, 'package.json'), - JSON.stringify({ name: 'test-install', version: '1.0.0' }) + JSON.stringify({ name: 'test-install', version: '1.0.0' }), ); // Create .npmrc in temp dir await Deno.writeTextFile( path.join(tempDir, '.npmrc'), - `@stack-test:registry=${registryUrl}/-/npm/${testOrgName}/\n//${new URL(registryUrl).host}/-/npm/${testOrgName}/:_authToken=${apiToken}` + `@stack-test:registry=${registryUrl}/-/npm/${testOrgName}/\n//${ + new URL(registryUrl).host + }/-/npm/${testOrgName}/:_authToken=${apiToken}`, ); // Install const installResult = await clients.npm.install( '@stack-test/demo-package@1.0.0', `${registryUrl}/-/npm/${testOrgName}/`, - tempDir + tempDir, ); assertEquals(installResult.success, true, `npm install failed: ${installResult.stderr}`); @@ -213,33 +225,41 @@ describe('NPM E2E: Full lifecycle', () => { // First publish const npmrcPath = path.join(FIXTURE_DIR, '.npmrc'); - const npmrcContent = `//${new URL(registryUrl).host}/-/npm/${testOrgName}/:_authToken=${apiToken}`; + const npmrcContent = `//${ + new URL(registryUrl).host + }/-/npm/${testOrgName}/:_authToken=${apiToken}`; await Deno.writeTextFile(npmrcPath, npmrcContent); try { await clients.npm.publish( FIXTURE_DIR, `${registryUrl}/-/npm/${testOrgName}/`, - apiToken + apiToken, ); // Unpublish const unpublishResult = await clients.npm.unpublish( '@stack-test/demo-package@1.0.0', `${registryUrl}/-/npm/${testOrgName}/`, - apiToken + apiToken, ); assertEquals( unpublishResult.success, true, - `npm unpublish failed: ${unpublishResult.stderr}` + `npm unpublish failed: ${unpublishResult.stderr}`, ); // Verify package is gone const viewResult = await runCommand( - ['npm', 'view', '@stack-test/demo-package', '--registry', `${registryUrl}/-/npm/${testOrgName}/`], - { env: { npm_config__authToken: apiToken } } + [ + 'npm', + 'view', + '@stack-test/demo-package', + '--registry', + `${registryUrl}/-/npm/${testOrgName}/`, + ], + { env: { npm_config__authToken: apiToken } }, ); // Should fail since package was unpublished diff --git a/test/e2e/oci.e2e.test.ts b/test/e2e/oci.e2e.test.ts index edd28c1..de10087 100644 --- a/test/e2e/oci.e2e.test.ts +++ b/test/e2e/oci.e2e.test.ts @@ -6,24 +6,24 @@ */ import { assertEquals } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import * as path from '@std/path'; import { - setupTestDb, - teardownTestDb, cleanupTestDb, - createTestUser, - createOrgWithOwner, - createTestRepository, - createTestApiToken, clients, + createOrgWithOwner, + createTestApiToken, + createTestRepository, + createTestUser, + setupTestDb, skipIfMissing, + teardownTestDb, testConfig, } from '../helpers/index.ts'; const FIXTURE_DIR = path.join( path.dirname(path.fromFileUrl(import.meta.url)), - '../fixtures/oci' + '../fixtures/oci', ); describe('OCI E2E: Full lifecycle', () => { diff --git a/test/fixtures/composer/stacktest/demo-package/composer.json b/test/fixtures/composer/stacktest/demo-package/composer.json index 42bc75b..b76883e 100644 --- a/test/fixtures/composer/stacktest/demo-package/composer.json +++ b/test/fixtures/composer/stacktest/demo-package/composer.json @@ -1,21 +1,21 @@ { - "name": "stacktest/demo-package", - "description": "Demo package for Stack.Gallery Registry e2e tests", - "version": "1.0.0", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Stack.Gallery Test", - "email": "test@stack.gallery" - } - ], - "require": { - "php": ">=8.0" - }, - "autoload": { - "psr-4": { - "StackTest\\DemoPackage\\": "src/" - } + "name": "stacktest/demo-package", + "description": "Demo package for Stack.Gallery Registry e2e tests", + "version": "1.0.0", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Stack.Gallery Test", + "email": "test@stack.gallery" } + ], + "require": { + "php": ">=8.0" + }, + "autoload": { + "psr-4": { + "StackTest\\DemoPackage\\": "src/" + } + } } diff --git a/test/fixtures/maven/com/stacktest/demo-artifact/pom.xml b/test/fixtures/maven/com/stacktest/demo-artifact/pom.xml index bd46b36..82b59f5 100644 --- a/test/fixtures/maven/com/stacktest/demo-artifact/pom.xml +++ b/test/fixtures/maven/com/stacktest/demo-artifact/pom.xml @@ -1,34 +1,36 @@ - - 4.0.0 - com.stacktest - demo-artifact - 1.0.0 - jar - Stack.Gallery Demo Artifact - Demo Maven artifact for e2e tests - https://github.com/stack-gallery/demo-artifact + + 4.0.0 + com.stacktest + demo-artifact + 1.0.0 + jar + Stack.Gallery Demo Artifact + Demo Maven artifact for e2e tests + https://github.com/stack-gallery/demo-artifact - - - MIT License - https://opensource.org/licenses/MIT - - + + + MIT License + https://opensource.org/licenses/MIT + + - - - Stack.Gallery Test - test@stack.gallery - - + + + Stack.Gallery Test + test@stack.gallery + + - - 11 - 11 - UTF-8 - + + 11 + 11 + UTF-8 + diff --git a/test/fixtures/npm/@stack-test/demo-package/index.js b/test/fixtures/npm/@stack-test/demo-package/index.js index 5903d22..2d9065c 100644 --- a/test/fixtures/npm/@stack-test/demo-package/index.js +++ b/test/fixtures/npm/@stack-test/demo-package/index.js @@ -5,5 +5,5 @@ module.exports = { name: 'demo-package', greet: (name) => `Hello, ${name}!`, - version: () => require('./package.json').version + version: () => require('./package.json').version, }; diff --git a/test/helpers/auth.helper.ts b/test/helpers/auth.helper.ts index cbabbe9..14fbdf7 100644 --- a/test/helpers/auth.helper.ts +++ b/test/helpers/auth.helper.ts @@ -6,7 +6,11 @@ import { User } from '../../ts/models/user.ts'; import { ApiToken } from '../../ts/models/apitoken.ts'; import { AuthService } from '../../ts/services/auth.service.ts'; import { TokenService } from '../../ts/services/token.service.ts'; -import type { TRegistryProtocol, ITokenScope, TUserStatus } from '../../ts/interfaces/auth.interfaces.ts'; +import type { + ITokenScope, + TRegistryProtocol, + TUserStatus, +} from '../../ts/interfaces/auth.interfaces.ts'; import { testConfig } from '../test.config.ts'; const TEST_PASSWORD = 'TestPassword123!'; @@ -25,7 +29,7 @@ export interface ICreateTestUserOptions { * Create a test user with sensible defaults */ export async function createTestUser( - overrides: ICreateTestUserOptions = {} + overrides: ICreateTestUserOptions = {}, ): Promise<{ user: User; password: string }> { const uniqueId = crypto.randomUUID().slice(0, 8); const password = overrides.password || TEST_PASSWORD; @@ -61,7 +65,7 @@ export async function createAdminUser(): Promise<{ user: User; password: string */ export async function loginUser( email: string, - password: string + password: string, ): Promise<{ accessToken: string; refreshToken: string; sessionId: string }> { const authService = new AuthService({ jwtSecret: testConfig.jwt.secret, @@ -96,7 +100,7 @@ export interface ICreateTestApiTokenOptions { * Create test API token */ export async function createTestApiToken( - options: ICreateTestApiTokenOptions + options: ICreateTestApiTokenOptions, ): Promise<{ rawToken: string; token: ApiToken }> { const tokenService = new TokenService(); @@ -127,7 +131,7 @@ export function createAuthHeader(token: string): { Authorization: string } { */ export function createBasicAuthHeader( username: string, - password: string + password: string, ): { Authorization: string } { const credentials = btoa(`${username}:${password}`); return { Authorization: `Basic ${credentials}` }; diff --git a/test/helpers/db.helper.ts b/test/helpers/db.helper.ts index 07c3c53..a666009 100644 --- a/test/helpers/db.helper.ts +++ b/test/helpers/db.helper.ts @@ -15,7 +15,7 @@ let isConnected = false; // We need to patch the global db export since models reference it // This is done by re-initializing with the test config -import { initDb, closeDb } from '../../ts/models/db.ts'; +import { closeDb, initDb } from '../../ts/models/db.ts'; /** * Initialize test database with unique name per test run diff --git a/test/helpers/factory.helper.ts b/test/helpers/factory.helper.ts index 4b9fe48..b59bfe3 100644 --- a/test/helpers/factory.helper.ts +++ b/test/helpers/factory.helper.ts @@ -11,10 +11,10 @@ import { Package } from '../../ts/models/package.ts'; import { RepositoryPermission } from '../../ts/models/repository.permission.ts'; import type { TOrganizationRole, - TTeamRole, + TRegistryProtocol, TRepositoryRole, TRepositoryVisibility, - TRegistryProtocol, + TTeamRole, } from '../../ts/interfaces/auth.interfaces.ts'; export interface ICreateTestOrganizationOptions { @@ -29,7 +29,7 @@ export interface ICreateTestOrganizationOptions { * Create test organization */ export async function createTestOrganization( - options: ICreateTestOrganizationOptions + options: ICreateTestOrganizationOptions, ): Promise { const uniqueId = crypto.randomUUID().slice(0, 8); @@ -53,7 +53,7 @@ export async function createTestOrganization( */ export async function createOrgWithOwner( ownerId: string, - orgOptions?: Partial + orgOptions?: Partial, ): Promise<{ organization: Organization; membership: OrganizationMember; @@ -82,7 +82,7 @@ export async function addOrgMember( organizationId: string, userId: string, role: TOrganizationRole = 'member', - invitedBy?: string + invitedBy?: string, ): Promise { const membership = await OrganizationMember.addMember({ organizationId, @@ -113,7 +113,7 @@ export interface ICreateTestRepositoryOptions { * Create test repository */ export async function createTestRepository( - options: ICreateTestRepositoryOptions + options: ICreateTestRepositoryOptions, ): Promise { const uniqueId = crypto.randomUUID().slice(0, 8); @@ -152,7 +152,7 @@ export async function createTestTeam(options: ICreateTestTeamOptions): Promise { const member = new TeamMember(); member.id = await TeamMember.getNewId(); @@ -176,7 +176,7 @@ export interface IGrantRepoPermissionOptions { * Grant repository permission */ export async function grantRepoPermission( - options: IGrantRepoPermissionOptions + options: IGrantRepoPermissionOptions, ): Promise { const perm = new RepositoryPermission(); perm.id = await RepositoryPermission.getNewId(); diff --git a/test/helpers/http.helper.ts b/test/helpers/http.helper.ts index 5d13001..ccdf5f4 100644 --- a/test/helpers/http.helper.ts +++ b/test/helpers/http.helper.ts @@ -75,7 +75,7 @@ export const del = (path: string, headers?: Record) => export function assertStatus(response: ITestResponse, expected: number): void { if (response.status !== expected) { throw new Error( - `Expected status ${expected} but got ${response.status}: ${JSON.stringify(response.body)}` + `Expected status ${expected} but got ${response.status}: ${JSON.stringify(response.body)}`, ); } } @@ -98,7 +98,7 @@ export function assertBodyHas(response: ITestResponse, keys: string[]): void { export function assertSuccess(response: ITestResponse): void { if (response.status < 200 || response.status >= 300) { throw new Error( - `Expected successful response but got ${response.status}: ${JSON.stringify(response.body)}` + `Expected successful response but got ${response.status}: ${JSON.stringify(response.body)}`, ); } } diff --git a/test/helpers/index.ts b/test/helpers/index.ts index 951d26f..cd64dc1 100644 --- a/test/helpers/index.ts +++ b/test/helpers/index.ts @@ -4,82 +4,82 @@ // Database helpers export { - setupTestDb, cleanupTestDb, - teardownTestDb, clearCollections, - getTestDbName, getTestDb, + getTestDbName, + setupTestDb, + teardownTestDb, } from './db.helper.ts'; // Auth helpers export { - createTestUser, createAdminUser, - loginUser, - createTestApiToken, createAuthHeader, createBasicAuthHeader, + createTestApiToken, + createTestUser, getTestPassword, - type ICreateTestUserOptions, type ICreateTestApiTokenOptions, + type ICreateTestUserOptions, + loginUser, } from './auth.helper.ts'; // Factory helpers export { - createTestOrganization, - createOrgWithOwner, addOrgMember, + addTeamMember, + createFullTestScenario, + createOrgWithOwner, + createTestOrganization, + createTestPackage, createTestRepository, createTestTeam, - addTeamMember, grantRepoPermission, - createTestPackage, - createFullTestScenario, type ICreateTestOrganizationOptions, + type ICreateTestPackageOptions, type ICreateTestRepositoryOptions, type ICreateTestTeamOptions, type IGrantRepoPermissionOptions, - type ICreateTestPackageOptions, } from './factory.helper.ts'; // HTTP helpers export { - testRequest, - get, - post, - put, - patch, - del, - assertStatus, assertBodyHas, - assertSuccess, assertError, + assertStatus, + assertSuccess, + del, + get, type ITestRequest, type ITestResponse, + patch, + post, + put, + testRequest, } from './http.helper.ts'; // Subprocess helpers export { - runCommand, - commandExists, clients, - skipIfMissing, - type ICommandResult, + commandExists, type ICommandOptions, + type ICommandResult, + runCommand, + skipIfMissing, } from './subprocess.helper.ts'; // Storage helpers export { - setupTestStorage, checkStorageAvailable, - objectExists, - listObjects, + cleanupTestStorage, deleteObject, deletePrefix, - cleanupTestStorage, isStorageAvailable, + listObjects, + objectExists, + setupTestStorage, } from './storage.helper.ts'; // Re-export test config -export { testConfig, getTestConfig } from '../test.config.ts'; +export { getTestConfig, testConfig } from '../test.config.ts'; diff --git a/test/helpers/subprocess.helper.ts b/test/helpers/subprocess.helper.ts index 4b1d400..013e62d 100644 --- a/test/helpers/subprocess.helper.ts +++ b/test/helpers/subprocess.helper.ts @@ -22,7 +22,7 @@ export interface ICommandOptions { */ export async function runCommand( cmd: string[], - options: ICommandOptions = {} + options: ICommandOptions = {}, ): Promise { const { cwd, env, timeout = 60000, stdin } = options; @@ -116,7 +116,7 @@ export const clients = { publish: (dir: string, registry: string, token: string) => runCommand( ['cargo', 'publish', '--registry', 'stack-test', '--token', token, '--allow-dirty'], - { cwd: dir } + { cwd: dir }, ), yank: (crate: string, version: string, token: string) => runCommand([ @@ -164,7 +164,7 @@ export const clients = { '--repository', JSON.stringify({ type: 'composer', url: repository }), ], - { cwd: dir } + { cwd: dir }, ), }, @@ -190,7 +190,7 @@ export const clients = { `-Dusername=${username}`, `-Dpassword=${password}`, ], - { cwd: dir } + { cwd: dir }, ), package: (dir: string) => runCommand(['mvn', 'package', '-DskipTests'], { cwd: dir }), }, diff --git a/test/integration/auth.test.ts b/test/integration/auth.test.ts index a69af67..a742a4a 100644 --- a/test/integration/auth.test.ts +++ b/test/integration/auth.test.ts @@ -4,16 +4,16 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import { + assertStatus, + cleanupTestDb, + createAuthHeader, + createTestUser, + get, + post, setupTestDb, teardownTestDb, - cleanupTestDb, - createTestUser, - post, - get, - assertStatus, - createAuthHeader, } from '../helpers/index.ts'; describe('Auth API Integration', () => { @@ -126,7 +126,7 @@ describe('Auth API Integration', () => { // Get current user const meResponse = await get( '/api/v1/auth/me', - createAuthHeader(loginBody.accessToken as string) + createAuthHeader(loginBody.accessToken as string), ); assertStatus(meResponse, 200); diff --git a/test/integration/organization.test.ts b/test/integration/organization.test.ts index 39500fe..e6404d4 100644 --- a/test/integration/organization.test.ts +++ b/test/integration/organization.test.ts @@ -4,19 +4,19 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import { - setupTestDb, - teardownTestDb, + assertStatus, cleanupTestDb, + createAuthHeader, createTestUser, + del, + get, loginUser, post, - get, put, - del, - assertStatus, - createAuthHeader, + setupTestDb, + teardownTestDb, } from '../helpers/index.ts'; describe('Organization API Integration', () => { @@ -48,7 +48,7 @@ describe('Organization API Integration', () => { displayName: 'My Organization', description: 'A test organization', }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 201); @@ -64,7 +64,7 @@ describe('Organization API Integration', () => { name: 'push.rocks', displayName: 'Push Rocks', }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 201); @@ -76,13 +76,13 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'duplicate', displayName: 'First' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await post( '/api/v1/organizations', { name: 'duplicate', displayName: 'Second' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 409); @@ -92,7 +92,7 @@ describe('Organization API Integration', () => { const response = await post( '/api/v1/organizations', { name: '.invalid', displayName: 'Invalid' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 400); @@ -105,12 +105,12 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'org1', displayName: 'Org 1' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); await post( '/api/v1/organizations', { name: 'org2', displayName: 'Org 2' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await get('/api/v1/organizations', createAuthHeader(accessToken)); @@ -126,7 +126,7 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'get-me', displayName: 'Get Me' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await get('/api/v1/organizations/get-me', createAuthHeader(accessToken)); @@ -139,7 +139,7 @@ describe('Organization API Integration', () => { it('should return 404 for non-existent org', async () => { const response = await get( '/api/v1/organizations/non-existent', - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 404); @@ -151,13 +151,13 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'update-me', displayName: 'Original' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await put( '/api/v1/organizations/update-me', { displayName: 'Updated', description: 'New description' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 200); @@ -172,7 +172,7 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'delete-me', displayName: 'Delete Me' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await del('/api/v1/organizations/delete-me', createAuthHeader(accessToken)); @@ -182,7 +182,7 @@ describe('Organization API Integration', () => { // Verify deleted const getResponse = await get( '/api/v1/organizations/delete-me', - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(getResponse, 404); }); @@ -193,12 +193,12 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'members-org', displayName: 'Members Org' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await get( '/api/v1/organizations/members-org/members', - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 200); @@ -213,13 +213,13 @@ describe('Organization API Integration', () => { await post( '/api/v1/organizations', { name: 'add-member-org', displayName: 'Add Member Org' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); const response = await post( '/api/v1/organizations/add-member-org/members', { userId: newUser.id, role: 'member' }, - createAuthHeader(accessToken) + createAuthHeader(accessToken), ); assertStatus(response, 201); diff --git a/test/test.config.ts b/test/test.config.ts index 885d051..49b8091 100644 --- a/test/test.config.ts +++ b/test/test.config.ts @@ -7,10 +7,10 @@ import { Qenv } from '@push.rocks/qenv'; const testQenv = new Qenv('./', '.nogit/', false); -const mongoUrl = await testQenv.getEnvVarOnDemand('MONGODB_URL') - || 'mongodb://testadmin:testpass@localhost:27117/test-registry?authSource=admin'; -const mongoName = await testQenv.getEnvVarOnDemand('MONGODB_NAME') - || 'test-registry'; +const mongoUrl = await testQenv.getEnvVarOnDemand('MONGODB_URL') || + 'mongodb://testadmin:testpass@localhost:27117/test-registry?authSource=admin'; +const mongoName = await testQenv.getEnvVarOnDemand('MONGODB_NAME') || + 'test-registry'; const s3Endpoint = await testQenv.getEnvVarOnDemand('S3_ENDPOINT') || 'localhost'; const s3Port = await testQenv.getEnvVarOnDemand('S3_PORT') || '9100'; diff --git a/test/unit/models/apitoken.test.ts b/test/unit/models/apitoken.test.ts index ba4c97f..beaa222 100644 --- a/test/unit/models/apitoken.test.ts +++ b/test/unit/models/apitoken.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb, createTestUser } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, createTestUser, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { ApiToken } from '../../../ts/models/apitoken.ts'; describe('ApiToken Model', () => { diff --git a/test/unit/models/organization.test.ts b/test/unit/models/organization.test.ts index b4fd689..9e345f3 100644 --- a/test/unit/models/organization.test.ts +++ b/test/unit/models/organization.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists, assertRejects } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb, createTestUser } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, createTestUser, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { Organization } from '../../../ts/models/organization.ts'; describe('Organization Model', () => { @@ -73,7 +73,7 @@ describe('Organization Model', () => { }); }, Error, - 'lowercase alphanumeric' + 'lowercase alphanumeric', ); }); @@ -87,7 +87,7 @@ describe('Organization Model', () => { }); }, Error, - 'lowercase alphanumeric' + 'lowercase alphanumeric', ); }); @@ -101,7 +101,7 @@ describe('Organization Model', () => { }); }, Error, - 'lowercase alphanumeric' + 'lowercase alphanumeric', ); }); @@ -115,7 +115,7 @@ describe('Organization Model', () => { }); }, Error, - 'lowercase alphanumeric' + 'lowercase alphanumeric', ); }); diff --git a/test/unit/models/package.test.ts b/test/unit/models/package.test.ts index def38bc..65fbda3 100644 --- a/test/unit/models/package.test.ts +++ b/test/unit/models/package.test.ts @@ -3,14 +3,14 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import { - setupTestDb, - teardownTestDb, cleanupTestDb, - createTestUser, createOrgWithOwner, createTestRepository, + createTestUser, + setupTestDb, + teardownTestDb, } from '../../helpers/index.ts'; import { Package } from '../../../ts/models/package.ts'; import type { IPackageVersion } from '../../../ts/interfaces/package.interfaces.ts'; diff --git a/test/unit/models/repository.test.ts b/test/unit/models/repository.test.ts index ff55985..ae9d28e 100644 --- a/test/unit/models/repository.test.ts +++ b/test/unit/models/repository.test.ts @@ -3,13 +3,13 @@ */ import { assertEquals, assertExists, assertRejects } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; import { + cleanupTestDb, + createOrgWithOwner, + createTestUser, setupTestDb, teardownTestDb, - cleanupTestDb, - createTestUser, - createOrgWithOwner, } from '../../helpers/index.ts'; import { Repository } from '../../../ts/models/repository.ts'; @@ -103,7 +103,7 @@ describe('Repository Model', () => { }); }, Error, - 'already exists' + 'already exists', ); }); @@ -137,7 +137,7 @@ describe('Repository Model', () => { }); }, Error, - 'lowercase alphanumeric' + 'lowercase alphanumeric', ); }); diff --git a/test/unit/models/session.test.ts b/test/unit/models/session.test.ts index 7746468..691f9cf 100644 --- a/test/unit/models/session.test.ts +++ b/test/unit/models/session.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb, createTestUser } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, createTestUser, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { Session } from '../../../ts/models/session.ts'; describe('Session Model', () => { @@ -70,9 +70,21 @@ describe('Session Model', () => { describe('getUserSessions', () => { it('should return all valid sessions for user', async () => { - await Session.createSession({ userId: testUserId, userAgent: 'Agent 1', ipAddress: '1.1.1.1' }); - await Session.createSession({ userId: testUserId, userAgent: 'Agent 2', ipAddress: '2.2.2.2' }); - await Session.createSession({ userId: testUserId, userAgent: 'Agent 3', ipAddress: '3.3.3.3' }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 1', + ipAddress: '1.1.1.1', + }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 2', + ipAddress: '2.2.2.2', + }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 3', + ipAddress: '3.3.3.3', + }); const sessions = await Session.getUserSessions(testUserId); assertEquals(sessions.length, 3); @@ -110,9 +122,21 @@ describe('Session Model', () => { describe('invalidateAllUserSessions', () => { it('should invalidate all user sessions', async () => { - await Session.createSession({ userId: testUserId, userAgent: 'Agent 1', ipAddress: '1.1.1.1' }); - await Session.createSession({ userId: testUserId, userAgent: 'Agent 2', ipAddress: '2.2.2.2' }); - await Session.createSession({ userId: testUserId, userAgent: 'Agent 3', ipAddress: '3.3.3.3' }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 1', + ipAddress: '1.1.1.1', + }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 2', + ipAddress: '2.2.2.2', + }); + await Session.createSession({ + userId: testUserId, + userAgent: 'Agent 3', + ipAddress: '3.3.3.3', + }); const count = await Session.invalidateAllUserSessions(testUserId, 'Security logout'); assertEquals(count, 3); diff --git a/test/unit/models/user.test.ts b/test/unit/models/user.test.ts index 91adce4..dcae538 100644 --- a/test/unit/models/user.test.ts +++ b/test/unit/models/user.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists, assertRejects } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { User } from '../../../ts/models/user.ts'; describe('User Model', () => { diff --git a/test/unit/services/auth.service.test.ts b/test/unit/services/auth.service.test.ts index 8b16e58..c58881c 100644 --- a/test/unit/services/auth.service.test.ts +++ b/test/unit/services/auth.service.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb, createTestUser } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, createTestUser, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { AuthService } from '../../../ts/services/auth.service.ts'; import { Session } from '../../../ts/models/session.ts'; import { testConfig } from '../../test.config.ts'; diff --git a/test/unit/services/token.service.test.ts b/test/unit/services/token.service.test.ts index 6706404..055ed21 100644 --- a/test/unit/services/token.service.test.ts +++ b/test/unit/services/token.service.test.ts @@ -3,8 +3,8 @@ */ import { assertEquals, assertExists, assertMatch } from 'jsr:@std/assert'; -import { describe, it, beforeAll, afterAll, beforeEach } from 'jsr:@std/testing/bdd'; -import { setupTestDb, teardownTestDb, cleanupTestDb, createTestUser } from '../../helpers/index.ts'; +import { afterAll, beforeAll, beforeEach, describe, it } from 'jsr:@std/testing/bdd'; +import { cleanupTestDb, createTestUser, setupTestDb, teardownTestDb } from '../../helpers/index.ts'; import { TokenService } from '../../../ts/services/token.service.ts'; import { ApiToken } from '../../../ts/models/apitoken.ts'; @@ -39,8 +39,8 @@ describe('TokenService', () => { assertExists(result.rawToken); assertExists(result.token); - // Check token format: srg_{prefix}_{random} - assertMatch(result.rawToken, /^srg_[a-z0-9]+_[a-z0-9]+$/); + // Check token format: srg_ + 64 hex chars + assertMatch(result.rawToken, /^srg_[a-f0-9]{64}$/); assertEquals(result.token.name, 'test-token'); assertEquals(result.token.protocols.includes('npm'), true); assertEquals(result.token.protocols.includes('oci'), true); @@ -111,13 +111,19 @@ describe('TokenService', () => { it('should reject invalid token format', async () => { const validation = await tokenService.validateToken('invalid-format', '127.0.0.1'); - assertEquals(validation, null); + assertEquals(validation.valid, false); + assertEquals(validation.errorCode, 'INVALID_TOKEN_FORMAT'); }); it('should reject non-existent token', async () => { - const validation = await tokenService.validateToken('srg_abc123_def456', '127.0.0.1'); + // Must match srg_ prefix + 64 hex chars = 68 total + const validation = await tokenService.validateToken( + 'srg_0000000000000000000000000000000000000000000000000000000000000000', + '127.0.0.1', + ); - assertEquals(validation, null); + assertEquals(validation.valid, false); + assertEquals(validation.errorCode, 'TOKEN_NOT_FOUND'); }); it('should reject revoked token', async () => { @@ -132,7 +138,9 @@ describe('TokenService', () => { const validation = await tokenService.validateToken(rawToken, '127.0.0.1'); - assertEquals(validation, null); + assertEquals(validation.valid, false); + // findByHash excludes revoked tokens, so the token is not found + assertEquals(validation.errorCode, 'TOKEN_NOT_FOUND'); }); it('should reject expired token', async () => { @@ -150,7 +158,8 @@ describe('TokenService', () => { const validation = await tokenService.validateToken(rawToken, '127.0.0.1'); - assertEquals(validation, null); + assertEquals(validation.valid, false); + assertEquals(validation.errorCode, 'TOKEN_EXPIRED'); }); it('should record usage on validation', async () => { diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 359fdf7..5b61d36 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@stack.gallery/registry', - version: '1.4.2', + version: '1.5.0', description: 'Enterprise-grade multi-protocol package registry' } diff --git a/ts/api/handlers/admin.auth.api.ts b/ts/api/handlers/admin.auth.api.ts index f02ff15..57d6568 100644 --- a/ts/api/handlers/admin.auth.api.ts +++ b/ts/api/handlers/admin.auth.api.ts @@ -113,7 +113,9 @@ export class AdminAuthApi { }); } else if (body.type === 'ldap' && body.ldapConfig) { // Encrypt bind password - const encryptedPassword = await cryptoService.encrypt(body.ldapConfig.bindPasswordEncrypted); + const encryptedPassword = await cryptoService.encrypt( + body.ldapConfig.bindPasswordEncrypted, + ); provider = await AuthProvider.createLdapProvider({ name: body.name, @@ -228,7 +230,7 @@ export class AdminAuthApi { !cryptoService.isEncrypted(body.oauthConfig.clientSecretEncrypted) ) { newOAuthConfig.clientSecretEncrypted = await cryptoService.encrypt( - body.oauthConfig.clientSecretEncrypted + body.oauthConfig.clientSecretEncrypted, ); } @@ -245,7 +247,7 @@ export class AdminAuthApi { !cryptoService.isEncrypted(body.ldapConfig.bindPasswordEncrypted) ) { newLdapConfig.bindPasswordEncrypted = await cryptoService.encrypt( - body.ldapConfig.bindPasswordEncrypted + body.ldapConfig.bindPasswordEncrypted, ); } diff --git a/ts/api/handlers/audit.api.ts b/ts/api/handlers/audit.api.ts index 3ef40d6..cabfdc1 100644 --- a/ts/api/handlers/audit.api.ts +++ b/ts/api/handlers/audit.api.ts @@ -26,7 +26,9 @@ export class AuditApi { // Parse query parameters const organizationId = ctx.url.searchParams.get('organizationId') || undefined; const repositoryId = ctx.url.searchParams.get('repositoryId') || undefined; - const resourceType = ctx.url.searchParams.get('resourceType') as TAuditResourceType | undefined; + const resourceType = ctx.url.searchParams.get('resourceType') as + | TAuditResourceType + | undefined; const actionsParam = ctx.url.searchParams.get('actions'); const actions = actionsParam ? (actionsParam.split(',') as TAuditAction[]) : undefined; const success = ctx.url.searchParams.has('success') @@ -54,7 +56,7 @@ export class AuditApi { // Check if user can manage this org const canManage = await this.permissionService.canManageOrganization( ctx.actor.userId, - organizationId + organizationId, ); if (!canManage) { // User can only see their own actions in this org diff --git a/ts/api/handlers/oauth.api.ts b/ts/api/handlers/oauth.api.ts index ad171fb..9bb2e59 100644 --- a/ts/api/handlers/oauth.api.ts +++ b/ts/api/handlers/oauth.api.ts @@ -93,7 +93,7 @@ export class OAuthApi { const result = await externalAuthService.handleOAuthCallback( { code, state }, - { ipAddress: ctx.ip, userAgent: ctx.userAgent } + { ipAddress: ctx.ip, userAgent: ctx.userAgent }, ); if (!result.success) { diff --git a/ts/api/handlers/organization.api.ts b/ts/api/handlers/organization.api.ts index 22e7265..85f2fc7 100644 --- a/ts/api/handlers/organization.api.ts +++ b/ts/api/handlers/organization.api.ts @@ -208,7 +208,10 @@ export class OrganizationApi { } // Check admin permission using org.id - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, org.id); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + org.id, + ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; } @@ -319,13 +322,13 @@ export class OrganizationApi { addedAt: m.joinedAt, user: user ? { - username: user.username, - displayName: user.displayName, - avatarUrl: user.avatarUrl, - } + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + } : null, }; - }) + }), ); return { @@ -356,7 +359,10 @@ export class OrganizationApi { } // Check admin permission - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, org.id); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + org.id, + ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; } @@ -431,7 +437,10 @@ export class OrganizationApi { } // Check admin permission - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, org.id); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + org.id, + ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; } @@ -492,7 +501,10 @@ export class OrganizationApi { // Users can remove themselves, admins can remove others if (userId !== ctx.actor.userId) { - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, org.id); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + org.id, + ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; } diff --git a/ts/api/handlers/package.api.ts b/ts/api/handlers/package.api.ts index 99ce84f..7b75cfd 100644 --- a/ts/api/handlers/package.api.ts +++ b/ts/api/handlers/package.api.ts @@ -50,7 +50,7 @@ export class PackageApi { ctx.actor.userId, pkg.organizationId, pkg.repositoryId, - 'read' + 'read', ); if (canAccess) { accessiblePackages.push(pkg); @@ -106,7 +106,7 @@ export class PackageApi { ctx.actor.userId, pkg.organizationId, pkg.repositoryId, - 'read' + 'read', ); if (!canAccess) { @@ -161,7 +161,7 @@ export class PackageApi { ctx.actor.userId, pkg.organizationId, pkg.repositoryId, - 'read' + 'read', ); if (!canAccess) { @@ -213,7 +213,7 @@ export class PackageApi { ctx.actor.userId, pkg.organizationId, pkg.repositoryId, - 'delete' + 'delete', ); if (!canDelete) { @@ -267,7 +267,7 @@ export class PackageApi { ctx.actor.userId, pkg.organizationId, pkg.repositoryId, - 'delete' + 'delete', ); if (!canDelete) { diff --git a/ts/api/handlers/repository.api.ts b/ts/api/handlers/repository.api.ts index 20b3b0a..505c9fa 100644 --- a/ts/api/handlers/repository.api.ts +++ b/ts/api/handlers/repository.api.ts @@ -5,7 +5,7 @@ import type { IApiContext, IApiResponse } from '../router.ts'; import { PermissionService } from '../../services/permission.service.ts'; import { AuditService } from '../../services/audit.service.ts'; -import { Repository, Organization } from '../../models/index.ts'; +import { Organization, Repository } from '../../models/index.ts'; import type { TRegistryProtocol, TRepositoryVisibility } from '../../interfaces/auth.interfaces.ts'; export class RepositoryApi { @@ -28,7 +28,7 @@ export class RepositoryApi { try { const repositories = await this.permissionService.getAccessibleRepositories( ctx.actor.userId, - orgId + orgId, ); return { @@ -131,7 +131,10 @@ export class RepositoryApi { if (!/^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$/.test(name)) { return { status: 400, - body: { error: 'Name must be lowercase alphanumeric with optional dots, hyphens, or underscores' }, + body: { + error: + 'Name must be lowercase alphanumeric with optional dots, hyphens, or underscores', + }, }; } @@ -198,7 +201,7 @@ export class RepositoryApi { const canManage = await this.permissionService.canManageRepository( ctx.actor.userId, repo.organizationId, - id + id, ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; @@ -252,7 +255,7 @@ export class RepositoryApi { const canManage = await this.permissionService.canManageRepository( ctx.actor.userId, repo.organizationId, - id + id, ); if (!canManage) { return { status: 403, body: { error: 'Admin access required' } }; diff --git a/ts/api/handlers/token.api.ts b/ts/api/handlers/token.api.ts index 14b150f..155b7c1 100644 --- a/ts/api/handlers/token.api.ts +++ b/ts/api/handlers/token.api.ts @@ -33,7 +33,10 @@ export class TokenApi { let tokens; if (organizationId) { // Check if user can manage org - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, organizationId); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + organizationId, + ); if (!canManage) { return { status: 403, body: { error: 'Not authorized to view organization tokens' } }; } @@ -119,7 +122,10 @@ export class TokenApi { // If creating org token, verify permission if (organizationId) { - const canManage = await this.permissionService.canManageOrganization(ctx.actor.userId, organizationId); + const canManage = await this.permissionService.canManageOrganization( + ctx.actor.userId, + organizationId, + ); if (!canManage) { return { status: 403, body: { error: 'Not authorized to create organization tokens' } }; } @@ -181,7 +187,7 @@ export class TokenApi { if (anyToken?.organizationId) { const canManage = await this.permissionService.canManageOrganization( ctx.actor.userId, - anyToken.organizationId + anyToken.organizationId, ); if (canManage) { token = anyToken; diff --git a/ts/api/router.ts b/ts/api/router.ts index 3872f9b..ed40c4e 100644 --- a/ts/api/router.ts +++ b/ts/api/router.ts @@ -104,24 +104,56 @@ export class ApiRouter { this.addRoute('POST', '/api/v1/organizations', (ctx) => this.organizationApi.create(ctx)); this.addRoute('PUT', '/api/v1/organizations/:id', (ctx) => this.organizationApi.update(ctx)); this.addRoute('DELETE', '/api/v1/organizations/:id', (ctx) => this.organizationApi.delete(ctx)); - this.addRoute('GET', '/api/v1/organizations/:id/members', (ctx) => this.organizationApi.listMembers(ctx)); - this.addRoute('POST', '/api/v1/organizations/:id/members', (ctx) => this.organizationApi.addMember(ctx)); - this.addRoute('PUT', '/api/v1/organizations/:id/members/:userId', (ctx) => this.organizationApi.updateMember(ctx)); - this.addRoute('DELETE', '/api/v1/organizations/:id/members/:userId', (ctx) => this.organizationApi.removeMember(ctx)); + this.addRoute( + 'GET', + '/api/v1/organizations/:id/members', + (ctx) => this.organizationApi.listMembers(ctx), + ); + this.addRoute( + 'POST', + '/api/v1/organizations/:id/members', + (ctx) => this.organizationApi.addMember(ctx), + ); + this.addRoute( + 'PUT', + '/api/v1/organizations/:id/members/:userId', + (ctx) => this.organizationApi.updateMember(ctx), + ); + this.addRoute( + 'DELETE', + '/api/v1/organizations/:id/members/:userId', + (ctx) => this.organizationApi.removeMember(ctx), + ); // Repository routes - this.addRoute('GET', '/api/v1/organizations/:orgId/repositories', (ctx) => this.repositoryApi.list(ctx)); + this.addRoute( + 'GET', + '/api/v1/organizations/:orgId/repositories', + (ctx) => this.repositoryApi.list(ctx), + ); this.addRoute('GET', '/api/v1/repositories/:id', (ctx) => this.repositoryApi.get(ctx)); - this.addRoute('POST', '/api/v1/organizations/:orgId/repositories', (ctx) => this.repositoryApi.create(ctx)); + this.addRoute( + 'POST', + '/api/v1/organizations/:orgId/repositories', + (ctx) => this.repositoryApi.create(ctx), + ); this.addRoute('PUT', '/api/v1/repositories/:id', (ctx) => this.repositoryApi.update(ctx)); this.addRoute('DELETE', '/api/v1/repositories/:id', (ctx) => this.repositoryApi.delete(ctx)); // Package routes this.addRoute('GET', '/api/v1/packages', (ctx) => this.packageApi.search(ctx)); this.addRoute('GET', '/api/v1/packages/:id', (ctx) => this.packageApi.get(ctx)); - this.addRoute('GET', '/api/v1/packages/:id/versions', (ctx) => this.packageApi.listVersions(ctx)); + this.addRoute( + 'GET', + '/api/v1/packages/:id/versions', + (ctx) => this.packageApi.listVersions(ctx), + ); this.addRoute('DELETE', '/api/v1/packages/:id', (ctx) => this.packageApi.delete(ctx)); - this.addRoute('DELETE', '/api/v1/packages/:id/versions/:version', (ctx) => this.packageApi.deleteVersion(ctx)); + this.addRoute( + 'DELETE', + '/api/v1/packages/:id/versions/:version', + (ctx) => this.packageApi.deleteVersion(ctx), + ); // Token routes this.addRoute('GET', '/api/v1/tokens', (ctx) => this.tokenApi.list(ctx)); @@ -138,14 +170,46 @@ export class ApiRouter { this.addRoute('POST', '/api/v1/auth/ldap/:id/login', (ctx) => this.oauthApi.ldapLogin(ctx)); // Admin auth routes (platform admin only) - this.addRoute('GET', '/api/v1/admin/auth/providers', (ctx) => this.adminAuthApi.listProviders(ctx)); - this.addRoute('POST', '/api/v1/admin/auth/providers', (ctx) => this.adminAuthApi.createProvider(ctx)); - this.addRoute('GET', '/api/v1/admin/auth/providers/:id', (ctx) => this.adminAuthApi.getProvider(ctx)); - this.addRoute('PUT', '/api/v1/admin/auth/providers/:id', (ctx) => this.adminAuthApi.updateProvider(ctx)); - this.addRoute('DELETE', '/api/v1/admin/auth/providers/:id', (ctx) => this.adminAuthApi.deleteProvider(ctx)); - this.addRoute('POST', '/api/v1/admin/auth/providers/:id/test', (ctx) => this.adminAuthApi.testProvider(ctx)); - this.addRoute('GET', '/api/v1/admin/auth/settings', (ctx) => this.adminAuthApi.getSettings(ctx)); - this.addRoute('PUT', '/api/v1/admin/auth/settings', (ctx) => this.adminAuthApi.updateSettings(ctx)); + this.addRoute( + 'GET', + '/api/v1/admin/auth/providers', + (ctx) => this.adminAuthApi.listProviders(ctx), + ); + this.addRoute( + 'POST', + '/api/v1/admin/auth/providers', + (ctx) => this.adminAuthApi.createProvider(ctx), + ); + this.addRoute( + 'GET', + '/api/v1/admin/auth/providers/:id', + (ctx) => this.adminAuthApi.getProvider(ctx), + ); + this.addRoute( + 'PUT', + '/api/v1/admin/auth/providers/:id', + (ctx) => this.adminAuthApi.updateProvider(ctx), + ); + this.addRoute( + 'DELETE', + '/api/v1/admin/auth/providers/:id', + (ctx) => this.adminAuthApi.deleteProvider(ctx), + ); + this.addRoute( + 'POST', + '/api/v1/admin/auth/providers/:id/test', + (ctx) => this.adminAuthApi.testProvider(ctx), + ); + this.addRoute( + 'GET', + '/api/v1/admin/auth/settings', + (ctx) => this.adminAuthApi.getSettings(ctx), + ); + this.addRoute( + 'PUT', + '/api/v1/admin/auth/settings', + (ctx) => this.adminAuthApi.updateSettings(ctx), + ); } /** diff --git a/ts/cli.ts b/ts/cli.ts index 65d9cdd..d64535e 100644 --- a/ts/cli.ts +++ b/ts/cli.ts @@ -3,9 +3,13 @@ */ import * as plugins from './plugins.ts'; -import { StackGalleryRegistry, createRegistryFromEnv, createRegistryFromEnvFile } from './registry.ts'; +import { + createRegistryFromEnv, + createRegistryFromEnvFile, + StackGalleryRegistry, +} from './registry.ts'; import { initDb } from './models/db.ts'; -import { User, Organization, OrganizationMember, Repository } from './models/index.ts'; +import { Organization, OrganizationMember, Repository, User } from './models/index.ts'; import { AuthService } from './services/auth.service.ts'; export async function runCli(): Promise { @@ -21,9 +25,7 @@ export async function runCli(): Promise { } // Use env file in ephemeral/dev mode, otherwise use environment variables - const registry = isEphemeral - ? await createRegistryFromEnvFile() - : createRegistryFromEnv(); + const registry = isEphemeral ? await createRegistryFromEnvFile() : createRegistryFromEnv(); await registry.start(); // Handle shutdown gracefully diff --git a/ts/interfaces/auth.interfaces.ts b/ts/interfaces/auth.interfaces.ts index 2a0a563..09b0f58 100644 --- a/ts/interfaces/auth.interfaces.ts +++ b/ts/interfaces/auth.interfaces.ts @@ -103,7 +103,14 @@ export interface ITeamMember { export type TRepositoryVisibility = 'public' | 'private' | 'internal'; export type TRepositoryRole = 'admin' | 'maintainer' | 'developer' | 'reader'; -export type TRegistryProtocol = 'oci' | 'npm' | 'maven' | 'cargo' | 'composer' | 'pypi' | 'rubygems'; +export type TRegistryProtocol = + | 'oci' + | 'npm' + | 'maven' + | 'cargo' + | 'composer' + | 'pypi' + | 'rubygems'; export interface IRepository { id: string; diff --git a/ts/models/apitoken.ts b/ts/models/apitoken.ts index 88fd28e..c15b5fe 100644 --- a/ts/models/apitoken.ts +++ b/ts/models/apitoken.ts @@ -7,7 +7,8 @@ import type { IApiToken, ITokenScope, TRegistryProtocol } from '../interfaces/au import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class ApiToken extends plugins.smartdata.SmartDataDbDoc implements IApiToken { +export class ApiToken extends plugins.smartdata.SmartDataDbDoc + implements IApiToken { @plugins.smartdata.unI() public id: string = ''; @@ -150,7 +151,7 @@ export class ApiToken extends plugins.smartdata.SmartDataDbDoc db) -export class AuditLog extends plugins.smartdata.SmartDataDbDoc implements IAuditLog { +export class AuditLog extends plugins.smartdata.SmartDataDbDoc + implements IAuditLog { @plugins.smartdata.unI() public id: string = ''; diff --git a/ts/models/auth.provider.ts b/ts/models/auth.provider.ts index 3931ba8..bf7c975 100644 --- a/ts/models/auth.provider.ts +++ b/ts/models/auth.provider.ts @@ -5,13 +5,13 @@ import * as plugins from '../plugins.ts'; import type { - IAuthProvider, - TAuthProviderType, - TAuthProviderStatus, - IOAuthConfig, - ILdapConfig, IAttributeMapping, + IAuthProvider, + ILdapConfig, + IOAuthConfig, IProvisioningSettings, + TAuthProviderStatus, + TAuthProviderType, } from '../interfaces/auth.interfaces.ts'; import { db } from './db.ts'; @@ -27,10 +27,8 @@ const DEFAULT_PROVISIONING: IProvisioningSettings = { }; @plugins.smartdata.Collection(() => db) -export class AuthProvider - extends plugins.smartdata.SmartDataDbDoc - implements IAuthProvider -{ +export class AuthProvider extends plugins.smartdata.SmartDataDbDoc + implements IAuthProvider { @plugins.smartdata.unI() public id: string = ''; diff --git a/ts/models/db.ts b/ts/models/db.ts index f227859..b44fa72 100644 --- a/ts/models/db.ts +++ b/ts/models/db.ts @@ -20,7 +20,7 @@ let isInitialized = false; */ export async function initDb( mongoDbUrl: string, - mongoDbName?: string + mongoDbName?: string, ): Promise { if (isInitialized && db) { return db; diff --git a/ts/models/external.identity.ts b/ts/models/external.identity.ts index e40274f..1b68d9d 100644 --- a/ts/models/external.identity.ts +++ b/ts/models/external.identity.ts @@ -10,8 +10,7 @@ import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) export class ExternalIdentity extends plugins.smartdata.SmartDataDbDoc - implements IExternalIdentity -{ + implements IExternalIdentity { @plugins.smartdata.unI() public id: string = ''; @@ -55,7 +54,7 @@ export class ExternalIdentity */ public static async findByExternalId( providerId: string, - externalId: string + externalId: string, ): Promise { return await ExternalIdentity.getInstance({ providerId, externalId }); } @@ -72,7 +71,7 @@ export class ExternalIdentity */ public static async findByUserAndProvider( userId: string, - providerId: string + providerId: string, ): Promise { return await ExternalIdentity.getInstance({ userId, providerId }); } diff --git a/ts/models/index.ts b/ts/models/index.ts index 3639fdd..aaa2b81 100644 --- a/ts/models/index.ts +++ b/ts/models/index.ts @@ -2,7 +2,7 @@ * Model exports */ -export { initDb, getDb, closeDb, isDbConnected } from './db.ts'; +export { closeDb, getDb, initDb, isDbConnected } from './db.ts'; export { User } from './user.ts'; export { Organization } from './organization.ts'; export { OrganizationMember } from './organization.member.ts'; diff --git a/ts/models/organization.member.ts b/ts/models/organization.member.ts index b9d2999..a4da400 100644 --- a/ts/models/organization.member.ts +++ b/ts/models/organization.member.ts @@ -7,7 +7,9 @@ import type { IOrganizationMember, TOrganizationRole } from '../interfaces/auth. import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class OrganizationMember extends plugins.smartdata.SmartDataDbDoc implements IOrganizationMember { +export class OrganizationMember + extends plugins.smartdata.SmartDataDbDoc + implements IOrganizationMember { @plugins.smartdata.unI() public id: string = ''; @@ -69,7 +71,7 @@ export class OrganizationMember extends plugins.smartdata.SmartDataDbDoc { return await OrganizationMember.getInstance({ organizationId, diff --git a/ts/models/organization.ts b/ts/models/organization.ts index eb218fd..7f04a2b 100644 --- a/ts/models/organization.ts +++ b/ts/models/organization.ts @@ -18,7 +18,8 @@ const DEFAULT_SETTINGS: IOrganizationSettings = { }; @plugins.smartdata.Collection(() => db) -export class Organization extends plugins.smartdata.SmartDataDbDoc implements IOrganization { +export class Organization extends plugins.smartdata.SmartDataDbDoc + implements IOrganization { @plugins.smartdata.unI() public id: string = ''; @@ -92,7 +93,7 @@ export class Organization extends plugins.smartdata.SmartDataDbDoc db) -export class Package extends plugins.smartdata.SmartDataDbDoc implements IPackage { +export class Package extends plugins.smartdata.SmartDataDbDoc + implements IPackage { @plugins.smartdata.unI() public id: string = ''; // {protocol}:{org}:{name} @@ -94,7 +95,7 @@ export class Package extends plugins.smartdata.SmartDataDbDoc public static async findByName( protocol: TRegistryProtocol, orgName: string, - name: string + name: string, ): Promise { const id = Package.generateId(protocol, orgName, name); return await Package.findById(id); @@ -118,7 +119,7 @@ export class Package extends plugins.smartdata.SmartDataDbDoc isPrivate?: boolean; limit?: number; offset?: number; - } + }, ): Promise { const filter: Record = {}; if (options?.protocol) filter.protocol = options.protocol; @@ -133,7 +134,7 @@ export class Package extends plugins.smartdata.SmartDataDbDoc const filtered = allPackages.filter( (pkg) => pkg.name.toLowerCase().includes(lowerQuery) || - pkg.description?.toLowerCase().includes(lowerQuery) + pkg.description?.toLowerCase().includes(lowerQuery), ); // Apply pagination diff --git a/ts/models/platform.settings.ts b/ts/models/platform.settings.ts index 0e92f49..d652a1b 100644 --- a/ts/models/platform.settings.ts +++ b/ts/models/platform.settings.ts @@ -4,7 +4,7 @@ */ import * as plugins from '../plugins.ts'; -import type { IPlatformSettings, IPlatformAuthSettings } from '../interfaces/auth.interfaces.ts'; +import type { IPlatformAuthSettings, IPlatformSettings } from '../interfaces/auth.interfaces.ts'; import { db } from './db.ts'; const DEFAULT_AUTH_SETTINGS: IPlatformAuthSettings = { @@ -16,8 +16,7 @@ const DEFAULT_AUTH_SETTINGS: IPlatformAuthSettings = { @plugins.smartdata.Collection(() => db) export class PlatformSettings extends plugins.smartdata.SmartDataDbDoc - implements IPlatformSettings -{ + implements IPlatformSettings { @plugins.smartdata.unI() public id: string = 'singleton'; @@ -51,7 +50,7 @@ export class PlatformSettings */ public async updateAuthSettings( settings: Partial, - updatedById?: string + updatedById?: string, ): Promise { this.auth = { ...this.auth, ...settings }; this.updatedAt = new Date(); diff --git a/ts/models/repository.permission.ts b/ts/models/repository.permission.ts index b19b7c2..1acd001 100644 --- a/ts/models/repository.permission.ts +++ b/ts/models/repository.permission.ts @@ -7,7 +7,9 @@ import type { IRepositoryPermission, TRepositoryRole } from '../interfaces/auth. import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class RepositoryPermission extends plugins.smartdata.SmartDataDbDoc implements IRepositoryPermission { +export class RepositoryPermission + extends plugins.smartdata.SmartDataDbDoc + implements IRepositoryPermission { @plugins.smartdata.unI() public id: string = ''; @@ -104,7 +106,7 @@ export class RepositoryPermission extends plugins.smartdata.SmartDataDbDoc { return await RepositoryPermission.getUserPermission(repositoryId, userId); } @@ -114,7 +116,7 @@ export class RepositoryPermission extends plugins.smartdata.SmartDataDbDoc { return await RepositoryPermission.getInstance({ repositoryId, @@ -127,7 +129,7 @@ export class RepositoryPermission extends plugins.smartdata.SmartDataDbDoc { return await RepositoryPermission.getInstance({ repositoryId, @@ -149,7 +151,7 @@ export class RepositoryPermission extends plugins.smartdata.SmartDataDbDoc { if (teamIds.length === 0) return []; return await RepositoryPermission.getInstances({ diff --git a/ts/models/repository.ts b/ts/models/repository.ts index 2ce03c3..2ff4b6b 100644 --- a/ts/models/repository.ts +++ b/ts/models/repository.ts @@ -3,11 +3,16 @@ */ import * as plugins from '../plugins.ts'; -import type { IRepository, TRepositoryVisibility, TRegistryProtocol } from '../interfaces/auth.interfaces.ts'; +import type { + IRepository, + TRegistryProtocol, + TRepositoryVisibility, +} from '../interfaces/auth.interfaces.ts'; import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class Repository extends plugins.smartdata.SmartDataDbDoc implements IRepository { +export class Repository extends plugins.smartdata.SmartDataDbDoc + implements IRepository { @plugins.smartdata.unI() public id: string = ''; @@ -70,7 +75,9 @@ export class Repository extends plugins.smartdata.SmartDataDbDoc { return await Repository.getInstance({ organizationId, diff --git a/ts/models/session.ts b/ts/models/session.ts index 9b6794d..68ad296 100644 --- a/ts/models/session.ts +++ b/ts/models/session.ts @@ -7,7 +7,8 @@ import type { ISession } from '../interfaces/auth.interfaces.ts'; import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class Session extends plugins.smartdata.SmartDataDbDoc implements ISession { +export class Session extends plugins.smartdata.SmartDataDbDoc + implements ISession { @plugins.smartdata.unI() public id: string = ''; @@ -94,7 +95,7 @@ export class Session extends plugins.smartdata.SmartDataDbDoc */ public static async invalidateAllUserSessions( userId: string, - reason: string = 'logout_all' + reason: string = 'logout_all', ): Promise { const sessions = await Session.getUserSessions(userId); for (const session of sessions) { diff --git a/ts/models/team.member.ts b/ts/models/team.member.ts index d1b06b2..1f9edc0 100644 --- a/ts/models/team.member.ts +++ b/ts/models/team.member.ts @@ -7,7 +7,8 @@ import type { ITeamMember, TTeamRole } from '../interfaces/auth.interfaces.ts'; import { db } from './db.ts'; @plugins.smartdata.Collection(() => db) -export class TeamMember extends plugins.smartdata.SmartDataDbDoc implements ITeamMember { +export class TeamMember extends plugins.smartdata.SmartDataDbDoc + implements ITeamMember { @plugins.smartdata.unI() public id: string = ''; diff --git a/ts/opsserver/classes.opsserver.ts b/ts/opsserver/classes.opsserver.ts new file mode 100644 index 0000000..6d94de1 --- /dev/null +++ b/ts/opsserver/classes.opsserver.ts @@ -0,0 +1,51 @@ +import * as plugins from '../plugins.ts'; +import type { StackGalleryRegistry } from '../registry.ts'; +import * as handlers from './handlers/index.ts'; + +export class OpsServer { + public registryRef: StackGalleryRegistry; + public typedrouter = new plugins.typedrequest.TypedRouter(); + + // Handler instances + public authHandler!: handlers.AuthHandler; + public organizationHandler!: handlers.OrganizationHandler; + public repositoryHandler!: handlers.RepositoryHandler; + public packageHandler!: handlers.PackageHandler; + public tokenHandler!: handlers.TokenHandler; + public auditHandler!: handlers.AuditHandler; + public adminHandler!: handlers.AdminHandler; + public oauthHandler!: handlers.OAuthHandler; + public userHandler!: handlers.UserHandler; + + constructor(registryRef: StackGalleryRegistry) { + this.registryRef = registryRef; + } + + /** + * Initialize all handlers. Must be called before routing requests. + */ + public async start(): Promise { + // AuthHandler must be initialized first (other handlers depend on its guards) + this.authHandler = new handlers.AuthHandler(this); + await this.authHandler.initialize(); + + // All other handlers self-register in their constructors + this.organizationHandler = new handlers.OrganizationHandler(this); + this.repositoryHandler = new handlers.RepositoryHandler(this); + this.packageHandler = new handlers.PackageHandler(this); + this.tokenHandler = new handlers.TokenHandler(this); + this.auditHandler = new handlers.AuditHandler(this); + this.adminHandler = new handlers.AdminHandler(this); + this.oauthHandler = new handlers.OAuthHandler(this); + this.userHandler = new handlers.UserHandler(this); + + console.log('[OpsServer] TypedRequest handlers initialized'); + } + + /** + * Cleanup resources + */ + public async stop(): Promise { + console.log('[OpsServer] Stopped'); + } +} diff --git a/ts/opsserver/handlers/admin.handler.ts b/ts/opsserver/handlers/admin.handler.ts new file mode 100644 index 0000000..c3cc962 --- /dev/null +++ b/ts/opsserver/handlers/admin.handler.ts @@ -0,0 +1,380 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireAdminIdentity } from '../helpers/guards.ts'; +import { AuthProvider, PlatformSettings } from '../../models/index.ts'; +import { cryptoService } from '../../services/crypto.service.ts'; +import { externalAuthService } from '../../services/external.auth.service.ts'; +import { AuditService } from '../../services/audit.service.ts'; + +export class AdminHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // Get Admin Providers + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getAdminProviders', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const providers = await AuthProvider.getAllProviders(); + return { + providers: providers.map((p) => p.toAdminInfo()), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list providers'); + } + }, + ), + ); + + // Create Admin Provider + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'createAdminProvider', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { name, displayName, type, oauthConfig, ldapConfig, attributeMapping, provisioning } = dataArg; + + // Validate required fields + if (!name || !displayName || !type) { + throw new plugins.typedrequest.TypedResponseError( + 'name, displayName, and type are required', + ); + } + + // Check name uniqueness + const existing = await AuthProvider.findByName(name); + if (existing) { + throw new plugins.typedrequest.TypedResponseError('Provider name already exists'); + } + + // Validate type-specific config + if (type === 'oidc' && !oauthConfig) { + throw new plugins.typedrequest.TypedResponseError( + 'oauthConfig is required for OIDC provider', + ); + } + if (type === 'ldap' && !ldapConfig) { + throw new plugins.typedrequest.TypedResponseError( + 'ldapConfig is required for LDAP provider', + ); + } + + let provider: AuthProvider; + + if (type === 'oidc' && oauthConfig) { + // Encrypt client secret + const encryptedSecret = await cryptoService.encrypt( + oauthConfig.clientSecretEncrypted, + ); + + provider = await AuthProvider.createOAuthProvider({ + name, + displayName, + oauthConfig: { + ...oauthConfig, + clientSecretEncrypted: encryptedSecret, + }, + attributeMapping, + provisioning, + createdById: dataArg.identity.userId, + }); + } else if (type === 'ldap' && ldapConfig) { + // Encrypt bind password + const encryptedPassword = await cryptoService.encrypt( + ldapConfig.bindPasswordEncrypted, + ); + + provider = await AuthProvider.createLdapProvider({ + name, + displayName, + ldapConfig: { + ...ldapConfig, + bindPasswordEncrypted: encryptedPassword, + }, + attributeMapping, + provisioning, + createdById: dataArg.identity.userId, + }); + } else { + throw new plugins.typedrequest.TypedResponseError('Invalid provider type'); + } + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).log('AUTH_PROVIDER_CREATED', 'auth_provider', { + resourceId: provider.id, + success: true, + metadata: { + providerName: provider.name, + providerType: provider.type, + }, + }); + + return { provider: provider.toAdminInfo() }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to create provider'); + } + }, + ), + ); + + // Get Admin Provider + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getAdminProvider', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const provider = await AuthProvider.findById(dataArg.providerId); + if (!provider) { + throw new plugins.typedrequest.TypedResponseError('Provider not found'); + } + + return { provider: provider.toAdminInfo() }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get provider'); + } + }, + ), + ); + + // Update Admin Provider + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updateAdminProvider', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const provider = await AuthProvider.findById(dataArg.providerId); + if (!provider) { + throw new plugins.typedrequest.TypedResponseError('Provider not found'); + } + + // Update basic fields + if (dataArg.displayName !== undefined) provider.displayName = dataArg.displayName; + if (dataArg.status !== undefined) provider.status = dataArg.status as any; + if (dataArg.priority !== undefined) provider.priority = dataArg.priority; + + // Update OAuth config + if (dataArg.oauthConfig && provider.oauthConfig) { + const newOAuthConfig = { ...provider.oauthConfig, ...dataArg.oauthConfig }; + + // Encrypt new client secret if provided and not already encrypted + if ( + dataArg.oauthConfig.clientSecretEncrypted && + !cryptoService.isEncrypted(dataArg.oauthConfig.clientSecretEncrypted) + ) { + newOAuthConfig.clientSecretEncrypted = await cryptoService.encrypt( + dataArg.oauthConfig.clientSecretEncrypted, + ); + } + + provider.oauthConfig = newOAuthConfig; + } + + // Update LDAP config + if (dataArg.ldapConfig && provider.ldapConfig) { + const newLdapConfig = { ...provider.ldapConfig, ...dataArg.ldapConfig }; + + // Encrypt new bind password if provided and not already encrypted + if ( + dataArg.ldapConfig.bindPasswordEncrypted && + !cryptoService.isEncrypted(dataArg.ldapConfig.bindPasswordEncrypted) + ) { + newLdapConfig.bindPasswordEncrypted = await cryptoService.encrypt( + dataArg.ldapConfig.bindPasswordEncrypted, + ); + } + + provider.ldapConfig = newLdapConfig; + } + + // Update attribute mapping + if (dataArg.attributeMapping) { + provider.attributeMapping = { + ...provider.attributeMapping, + ...dataArg.attributeMapping, + } as any; + } + + // Update provisioning settings + if (dataArg.provisioning) { + provider.provisioning = { + ...provider.provisioning, + ...dataArg.provisioning, + } as any; + } + + await provider.save(); + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).log('AUTH_PROVIDER_UPDATED', 'auth_provider', { + resourceId: provider.id, + success: true, + metadata: { providerName: provider.name }, + }); + + return { provider: provider.toAdminInfo() }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update provider'); + } + }, + ), + ); + + // Delete Admin Provider + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deleteAdminProvider', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const provider = await AuthProvider.findById(dataArg.providerId); + if (!provider) { + throw new plugins.typedrequest.TypedResponseError('Provider not found'); + } + + // Soft delete - disable instead of removing + provider.status = 'disabled'; + await provider.save(); + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).log('AUTH_PROVIDER_DELETED', 'auth_provider', { + resourceId: provider.id, + success: true, + metadata: { providerName: provider.name }, + }); + + return { message: 'Provider disabled' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete provider'); + } + }, + ), + ); + + // Test Admin Provider + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'testAdminProvider', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const result = await externalAuthService.testConnection(dataArg.providerId); + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).log('AUTH_PROVIDER_TESTED', 'auth_provider', { + resourceId: dataArg.providerId, + success: result.success, + metadata: { + result: result.success ? 'success' : 'failure', + latencyMs: result.latencyMs, + error: result.error, + }, + }); + + return { result }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to test provider'); + } + }, + ), + ); + + // Get Platform Settings + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getPlatformSettings', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const settings = await PlatformSettings.get(); + return { + settings: { + id: settings.id, + auth: settings.auth, + updatedAt: settings.updatedAt instanceof Date ? settings.updatedAt.toISOString() : String(settings.updatedAt), + updatedById: settings.updatedById, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get settings'); + } + }, + ), + ); + + // Update Platform Settings + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updatePlatformSettings', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const settings = await PlatformSettings.get(); + + if (dataArg.auth) { + await settings.updateAuthSettings(dataArg.auth as any, dataArg.identity.userId); + } + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).log('PLATFORM_SETTINGS_UPDATED', 'platform_settings', { + resourceId: 'platform-settings', + success: true, + }); + + return { + settings: { + id: settings.id, + auth: settings.auth, + updatedAt: settings.updatedAt instanceof Date ? settings.updatedAt.toISOString() : String(settings.updatedAt), + updatedById: settings.updatedById, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update settings'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/audit.handler.ts b/ts/opsserver/handlers/audit.handler.ts new file mode 100644 index 0000000..2cbb5c6 --- /dev/null +++ b/ts/opsserver/handlers/audit.handler.ts @@ -0,0 +1,105 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity } from '../helpers/guards.ts'; +import { AuditLog } from '../../models/auditlog.ts'; +import { PermissionService } from '../../services/permission.service.ts'; + +export class AuditHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private permissionService = new PermissionService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // Query Audit Logs + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'queryAudit', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { + organizationId, + repositoryId, + resourceType, + actions, + success, + startDate: startDateStr, + endDate: endDateStr, + limit: limitParam, + offset: offsetParam, + } = dataArg; + + const limit = limitParam || 100; + const offset = offsetParam || 0; + const startDate = startDateStr ? new Date(startDateStr) : undefined; + const endDate = endDateStr ? new Date(endDateStr) : undefined; + + // Determine actor filter based on permissions + let actorId: string | undefined; + + if (dataArg.identity.isSystemAdmin) { + // System admins can see all + actorId = dataArg.actorId; + } else if (organizationId) { + // Check if user can manage this org + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + organizationId, + ); + if (!canManage) { + // User can only see their own actions in this org + actorId = dataArg.identity.userId; + } + } else { + // Non-admins without org filter can only see their own actions + actorId = dataArg.identity.userId; + } + + const result = await AuditLog.query({ + actorId, + organizationId, + repositoryId, + resourceType: resourceType as any, + action: actions as any[], + success, + startDate, + endDate, + limit, + offset, + }); + + return { + logs: result.logs.map((log) => ({ + id: log.id, + actorId: log.actorId, + actorType: log.actorType as interfaces.data.IAuditEntry['actorType'], + action: log.action as interfaces.data.TAuditAction, + resourceType: log.resourceType as interfaces.data.TAuditResourceType, + resourceId: log.resourceId, + resourceName: log.resourceName, + organizationId: log.organizationId, + repositoryId: log.repositoryId, + success: log.success, + errorCode: log.errorCode, + timestamp: log.timestamp instanceof Date ? log.timestamp.toISOString() : String(log.timestamp), + metadata: log.metadata || {}, + })), + total: result.total, + limit, + offset, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to query audit logs'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/auth.handler.ts b/ts/opsserver/handlers/auth.handler.ts new file mode 100644 index 0000000..1b658b4 --- /dev/null +++ b/ts/opsserver/handlers/auth.handler.ts @@ -0,0 +1,263 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { AuthService } from '../../services/auth.service.ts'; +import { User } from '../../models/user.ts'; +import { AuthProvider, PlatformSettings } from '../../models/index.ts'; + +export class AuthHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private authService: AuthService; + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.authService = new AuthService(); + } + + /** + * Initialize auth handler - must be called after construction + */ + public async initialize(): Promise { + this.registerHandlers(); + } + + private registerHandlers(): void { + // Login + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'login', + async (dataArg) => { + try { + const { email, password } = dataArg; + + if (!email || !password) { + throw new plugins.typedrequest.TypedResponseError('Email and password are required'); + } + + const result = await this.authService.login(email, password); + + if (!result.success || !result.user || !result.accessToken || !result.refreshToken) { + return { + errorCode: result.errorCode, + errorMessage: result.errorMessage, + }; + } + + const user = result.user; + const expiresAt = Date.now() + 15 * 60 * 1000; // 15 minutes + + const identity: interfaces.data.IIdentity = { + jwt: result.accessToken, + refreshJwt: result.refreshToken, + userId: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + isSystemAdmin: user.isSystemAdmin, + expiresAt, + sessionId: result.sessionId!, + }; + + return { + identity, + user: { + id: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + isSystemAdmin: user.isSystemAdmin, + isActive: user.isActive, + createdAt: user.createdAt instanceof Date + ? user.createdAt.toISOString() + : String(user.createdAt), + lastLoginAt: user.lastLoginAt instanceof Date + ? user.lastLoginAt.toISOString() + : user.lastLoginAt + ? String(user.lastLoginAt) + : undefined, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Login failed'); + } + }, + ), + ); + + // Refresh Token + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'refreshToken', + async (dataArg) => { + try { + if (!dataArg.identity?.refreshJwt) { + throw new plugins.typedrequest.TypedResponseError('Refresh token is required'); + } + + const result = await this.authService.refresh(dataArg.identity.refreshJwt); + + if (!result.success || !result.user || !result.accessToken) { + throw new plugins.typedrequest.TypedResponseError( + result.errorMessage || 'Token refresh failed', + ); + } + + const user = result.user; + const expiresAt = Date.now() + 15 * 60 * 1000; + + return { + identity: { + jwt: result.accessToken, + refreshJwt: dataArg.identity.refreshJwt, + userId: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + isSystemAdmin: user.isSystemAdmin, + expiresAt, + sessionId: result.sessionId || dataArg.identity.sessionId, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Token refresh failed'); + } + }, + ), + ); + + // Logout + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'logout', + async (dataArg) => { + try { + if (!dataArg.identity?.jwt) { + throw new plugins.typedrequest.TypedResponseError('Identity required'); + } + + if (dataArg.all) { + const count = await this.authService.logoutAll(dataArg.identity.userId); + return { message: `Logged out from ${count} sessions` }; + } + + const sessionId = dataArg.sessionId || dataArg.identity.sessionId; + if (sessionId) { + await this.authService.logout(sessionId, { + userId: dataArg.identity.userId, + }); + } + + return { message: 'Logged out successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Logout failed'); + } + }, + ), + ); + + // Get Me + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getMe', + async (dataArg) => { + try { + if (!dataArg.identity?.jwt) { + throw new plugins.typedrequest.TypedResponseError('Identity required'); + } + + const validated = await this.authService.validateAccessToken(dataArg.identity.jwt); + if (!validated) { + throw new plugins.typedrequest.TypedResponseError('Invalid or expired token'); + } + + const user = validated.user; + return { + user: { + id: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + isSystemAdmin: user.isSystemAdmin, + isActive: user.isActive, + createdAt: user.createdAt instanceof Date + ? user.createdAt.toISOString() + : String(user.createdAt), + lastLoginAt: user.lastLoginAt instanceof Date + ? user.lastLoginAt.toISOString() + : user.lastLoginAt + ? String(user.lastLoginAt) + : undefined, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get user info'); + } + }, + ), + ); + + // Get Auth Providers (public) + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getAuthProviders', + async (_dataArg) => { + try { + const settings = await PlatformSettings.get(); + const providers = await AuthProvider.getActiveProviders(); + + return { + providers: providers.map((p) => p.toPublicInfo()), + localAuthEnabled: settings.auth.localAuthEnabled, + defaultProviderId: settings.auth.defaultProviderId, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get auth providers'); + } + }, + ), + ); + } + + // Guard for valid identity - validates JWT via AuthService + public validIdentityGuard = new plugins.smartguard.Guard<{ + identity: interfaces.data.IIdentity; + }>( + async (dataArg) => { + if (!dataArg.identity?.jwt) return false; + try { + const validated = await this.authService.validateAccessToken(dataArg.identity.jwt); + if (!validated) return false; + // Verify the userId matches the identity claim + if (dataArg.identity.userId !== validated.user.id) return false; + return true; + } catch { + return false; + } + }, + { failedHint: 'identity is not valid', name: 'validIdentityGuard' }, + ); + + // Guard for admin identity - validates JWT + checks isSystemAdmin + public adminIdentityGuard = new plugins.smartguard.Guard<{ + identity: interfaces.data.IIdentity; + }>( + async (dataArg) => { + const isValid = await this.validIdentityGuard.exec(dataArg); + if (!isValid) return false; + // Check isSystemAdmin claim from the identity + if (!dataArg.identity.isSystemAdmin) return false; + // Double-check from database + const user = await User.findById(dataArg.identity.userId); + if (!user || !user.isSystemAdmin) return false; + return true; + }, + { failedHint: 'user is not admin', name: 'adminIdentityGuard' }, + ); +} diff --git a/ts/opsserver/handlers/index.ts b/ts/opsserver/handlers/index.ts new file mode 100644 index 0000000..1b95a00 --- /dev/null +++ b/ts/opsserver/handlers/index.ts @@ -0,0 +1,9 @@ +export * from './auth.handler.ts'; +export * from './organization.handler.ts'; +export * from './repository.handler.ts'; +export * from './package.handler.ts'; +export * from './token.handler.ts'; +export * from './audit.handler.ts'; +export * from './admin.handler.ts'; +export * from './oauth.handler.ts'; +export * from './user.handler.ts'; diff --git a/ts/opsserver/handlers/oauth.handler.ts b/ts/opsserver/handlers/oauth.handler.ts new file mode 100644 index 0000000..448fb0b --- /dev/null +++ b/ts/opsserver/handlers/oauth.handler.ts @@ -0,0 +1,160 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { externalAuthService } from '../../services/external.auth.service.ts'; + +export class OAuthHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // OAuth Authorize - initiate OAuth flow + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'oauthAuthorize', + async (dataArg) => { + try { + const { providerId, returnUrl } = dataArg; + + const { authUrl } = await externalAuthService.initiateOAuth(providerId, returnUrl); + + return { redirectUrl: authUrl }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + const errorMessage = error instanceof Error ? error.message : 'Authorization failed'; + throw new plugins.typedrequest.TypedResponseError(errorMessage); + } + }, + ), + ); + + // OAuth Callback - handle provider callback + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'oauthCallback', + async (dataArg) => { + try { + const { code, state } = dataArg; + + if (!code || !state) { + return { + errorCode: 'MISSING_PARAMETERS', + errorMessage: 'Code and state are required', + }; + } + + const result = await externalAuthService.handleOAuthCallback( + { code, state }, + {}, + ); + + if (!result.success) { + return { + errorCode: result.errorCode, + errorMessage: result.errorMessage, + }; + } + + const user = result.user!; + const expiresAt = Date.now() + 15 * 60 * 1000; + + return { + identity: { + jwt: result.accessToken!, + refreshJwt: result.refreshToken!, + userId: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + isSystemAdmin: user.isSystemAdmin, + expiresAt, + sessionId: result.sessionId!, + }, + user: { + id: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + isSystemAdmin: user.isSystemAdmin, + isActive: user.isActive, + createdAt: user.createdAt instanceof Date ? user.createdAt.toISOString() : String(user.createdAt), + lastLoginAt: user.lastLoginAt instanceof Date ? user.lastLoginAt.toISOString() : user.lastLoginAt ? String(user.lastLoginAt) : undefined, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('OAuth callback failed'); + } + }, + ), + ); + + // LDAP Login + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'ldapLogin', + async (dataArg) => { + try { + const { providerId, username, password } = dataArg; + + if (!username || !password) { + throw new plugins.typedrequest.TypedResponseError( + 'Username and password are required', + ); + } + + const result = await externalAuthService.authenticateLdap( + providerId, + username, + password, + {}, + ); + + if (!result.success) { + return { + errorCode: result.errorCode, + errorMessage: result.errorMessage, + }; + } + + const user = result.user!; + const expiresAt = Date.now() + 15 * 60 * 1000; + + return { + identity: { + jwt: result.accessToken!, + refreshJwt: result.refreshToken!, + userId: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + isSystemAdmin: user.isSystemAdmin, + expiresAt, + sessionId: result.sessionId!, + }, + user: { + id: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + isSystemAdmin: user.isSystemAdmin, + isActive: user.isActive, + createdAt: user.createdAt instanceof Date ? user.createdAt.toISOString() : String(user.createdAt), + lastLoginAt: user.lastLoginAt instanceof Date ? user.lastLoginAt.toISOString() : user.lastLoginAt ? String(user.lastLoginAt) : undefined, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('LDAP login failed'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/organization.handler.ts b/ts/opsserver/handlers/organization.handler.ts new file mode 100644 index 0000000..2c08367 --- /dev/null +++ b/ts/opsserver/handlers/organization.handler.ts @@ -0,0 +1,548 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity } from '../helpers/guards.ts'; +import { Organization, OrganizationMember, User } from '../../models/index.ts'; +import { PermissionService } from '../../services/permission.service.ts'; +import { AuditService } from '../../services/audit.service.ts'; + +export class OrganizationHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private permissionService = new PermissionService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + /** + * Helper to resolve organization by ID or name + */ + private async resolveOrganization(idOrName: string): Promise { + return idOrName.startsWith('Organization:') + ? await Organization.findById(idOrName) + : await Organization.findByName(idOrName); + } + + private registerHandlers(): void { + // Get Organizations + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getOrganizations', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const userId = dataArg.identity.userId; + let organizations: Organization[]; + + if (dataArg.identity.isSystemAdmin) { + organizations = await Organization.getInstances({}); + } else { + const memberships = await OrganizationMember.getUserOrganizations(userId); + const orgs: Organization[] = []; + for (const m of memberships) { + const org = await Organization.findById(m.organizationId); + if (org) orgs.push(org); + } + organizations = orgs; + } + + return { + organizations: organizations.map((org) => ({ + id: org.id, + name: org.name, + displayName: org.displayName, + description: org.description, + avatarUrl: org.avatarUrl, + website: org.website, + isPublic: org.isPublic, + memberCount: org.memberCount, + plan: (org as any).plan || 'free', + usedStorageBytes: org.usedStorageBytes || 0, + storageQuotaBytes: (org as any).storageQuotaBytes || 0, + createdAt: org.createdAt instanceof Date + ? org.createdAt.toISOString() + : String(org.createdAt), + })), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list organizations'); + } + }, + ), + ); + + // Get Organization + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getOrganization', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Check access - public orgs visible to all, private requires membership + if (!org.isPublic) { + const isMember = await OrganizationMember.findMembership( + org.id, + dataArg.identity.userId, + ); + if (!isMember && !dataArg.identity.isSystemAdmin) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + } + + const orgData: interfaces.data.IOrganizationDetail = { + id: org.id, + name: org.name, + displayName: org.displayName, + description: org.description, + avatarUrl: org.avatarUrl, + website: org.website, + isPublic: org.isPublic, + memberCount: org.memberCount, + plan: (org as any).plan || 'free', + usedStorageBytes: org.usedStorageBytes || 0, + storageQuotaBytes: (org as any).storageQuotaBytes || 0, + createdAt: org.createdAt instanceof Date + ? org.createdAt.toISOString() + : String(org.createdAt), + }; + + // Include settings for admins + if (dataArg.identity.isSystemAdmin && org.settings) { + orgData.settings = org.settings as any; + } + + return { organization: orgData }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get organization'); + } + }, + ), + ); + + // Create Organization + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'createOrganization', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { name, displayName, description, isPublic } = dataArg; + + if (!name) { + throw new plugins.typedrequest.TypedResponseError('Organization name is required'); + } + + // Validate name format + if (!/^[a-z0-9]([a-z0-9.-]*[a-z0-9])?$/.test(name)) { + throw new plugins.typedrequest.TypedResponseError( + 'Name must be lowercase alphanumeric with optional hyphens and dots', + ); + } + + // Check uniqueness + const existing = await Organization.findByName(name); + if (existing) { + throw new plugins.typedrequest.TypedResponseError('Organization name already taken'); + } + + // Create organization + const org = new Organization(); + org.id = await Organization.getNewId(); + org.name = name; + org.displayName = displayName || name; + org.description = description; + org.isPublic = isPublic ?? false; + org.memberCount = 1; + org.createdAt = new Date(); + org.createdById = dataArg.identity.userId; + + await org.save(); + + // Add creator as owner + const membership = new OrganizationMember(); + membership.id = await OrganizationMember.getNewId(); + membership.organizationId = org.id; + membership.userId = dataArg.identity.userId; + membership.role = 'owner'; + membership.invitedBy = dataArg.identity.userId; + membership.joinedAt = new Date(); + + await membership.save(); + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + }).logOrganizationCreated(org.id, org.name); + + return { + organization: { + id: org.id, + name: org.name, + displayName: org.displayName, + description: org.description, + isPublic: org.isPublic, + memberCount: org.memberCount, + plan: (org as any).plan || 'free', + usedStorageBytes: org.usedStorageBytes || 0, + storageQuotaBytes: (org as any).storageQuotaBytes || 0, + createdAt: org.createdAt instanceof Date + ? org.createdAt.toISOString() + : String(org.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to create organization'); + } + }, + ), + ); + + // Update Organization + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updateOrganization', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Check admin permission + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + org.id, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + if (dataArg.displayName !== undefined) org.displayName = dataArg.displayName; + if (dataArg.description !== undefined) org.description = dataArg.description; + if (dataArg.avatarUrl !== undefined) org.avatarUrl = dataArg.avatarUrl; + if (dataArg.website !== undefined) org.website = dataArg.website; + if (dataArg.isPublic !== undefined) org.isPublic = dataArg.isPublic; + + // Only system admins can change settings + if (dataArg.settings && dataArg.identity.isSystemAdmin) { + org.settings = { ...org.settings, ...dataArg.settings } as any; + } + + await org.save(); + + return { + organization: { + id: org.id, + name: org.name, + displayName: org.displayName, + description: org.description, + avatarUrl: org.avatarUrl, + website: org.website, + isPublic: org.isPublic, + memberCount: org.memberCount, + plan: (org as any).plan || 'free', + usedStorageBytes: org.usedStorageBytes || 0, + storageQuotaBytes: (org as any).storageQuotaBytes || 0, + createdAt: org.createdAt instanceof Date + ? org.createdAt.toISOString() + : String(org.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update organization'); + } + }, + ), + ); + + // Delete Organization + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deleteOrganization', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Only owners and system admins can delete + const membership = await OrganizationMember.findMembership( + org.id, + dataArg.identity.userId, + ); + if (membership?.role !== 'owner' && !dataArg.identity.isSystemAdmin) { + throw new plugins.typedrequest.TypedResponseError('Owner access required'); + } + + await org.delete(); + + return { message: 'Organization deleted successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete organization'); + } + }, + ), + ); + + // Get Organization Members + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getOrganizationMembers', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Check membership + const isMember = await OrganizationMember.findMembership( + org.id, + dataArg.identity.userId, + ); + if (!isMember && !dataArg.identity.isSystemAdmin) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + + const members = await OrganizationMember.getOrgMembers(org.id); + + const membersWithUsers = await Promise.all( + members.map(async (m) => { + const user = await User.findById(m.userId); + return { + userId: m.userId, + role: m.role as interfaces.data.TOrganizationRole, + addedAt: m.joinedAt instanceof Date + ? m.joinedAt.toISOString() + : String(m.joinedAt), + user: user + ? { + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + } + : null, + }; + }), + ); + + return { members: membersWithUsers }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list members'); + } + }, + ), + ); + + // Add Organization Member + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'addOrganizationMember', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Check admin permission + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + org.id, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + const { userId, role } = dataArg; + + if (!userId || !role) { + throw new plugins.typedrequest.TypedResponseError('userId and role are required'); + } + + if (!['owner', 'admin', 'member'].includes(role)) { + throw new plugins.typedrequest.TypedResponseError('Invalid role'); + } + + // Check user exists + const user = await User.findById(userId); + if (!user) { + throw new plugins.typedrequest.TypedResponseError('User not found'); + } + + // Check if already a member + const existing = await OrganizationMember.findMembership(org.id, userId); + if (existing) { + throw new plugins.typedrequest.TypedResponseError('User is already a member'); + } + + // Add member + const membership = new OrganizationMember(); + membership.id = await OrganizationMember.getNewId(); + membership.organizationId = org.id; + membership.userId = userId; + membership.role = role; + membership.invitedBy = dataArg.identity.userId; + membership.joinedAt = new Date(); + + await membership.save(); + + // Update member count + org.memberCount += 1; + await org.save(); + + return { + member: { + userId: membership.userId, + role: membership.role as interfaces.data.TOrganizationRole, + addedAt: membership.joinedAt instanceof Date + ? membership.joinedAt.toISOString() + : String(membership.joinedAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to add member'); + } + }, + ), + ); + + // Update Organization Member + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updateOrganizationMember', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Check admin permission + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + org.id, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + const { userId, role } = dataArg; + + if (!role || !['owner', 'admin', 'member'].includes(role)) { + throw new plugins.typedrequest.TypedResponseError('Valid role is required'); + } + + const membership = await OrganizationMember.findMembership(org.id, userId); + if (!membership) { + throw new plugins.typedrequest.TypedResponseError('Member not found'); + } + + // Cannot change last owner + if (membership.role === 'owner' && role !== 'owner') { + const members = await OrganizationMember.getOrgMembers(org.id); + const ownerCount = members.filter((m) => m.role === 'owner').length; + if (ownerCount <= 1) { + throw new plugins.typedrequest.TypedResponseError('Cannot remove the last owner'); + } + } + + membership.role = role; + await membership.save(); + + return { + member: { + userId: membership.userId, + role: membership.role as interfaces.data.TOrganizationRole, + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update member'); + } + }, + ), + ); + + // Remove Organization Member + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'removeOrganizationMember', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const org = await this.resolveOrganization(dataArg.organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Users can remove themselves, admins can remove others + if (dataArg.userId !== dataArg.identity.userId) { + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + org.id, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + } + + const membership = await OrganizationMember.findMembership(org.id, dataArg.userId); + if (!membership) { + throw new plugins.typedrequest.TypedResponseError('Member not found'); + } + + // Cannot remove last owner + if (membership.role === 'owner') { + const members = await OrganizationMember.getOrgMembers(org.id); + const ownerCount = members.filter((m) => m.role === 'owner').length; + if (ownerCount <= 1) { + throw new plugins.typedrequest.TypedResponseError('Cannot remove the last owner'); + } + } + + await membership.delete(); + + // Update member count + org.memberCount = Math.max(0, org.memberCount - 1); + await org.save(); + + return { message: 'Member removed successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to remove member'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/package.handler.ts b/ts/opsserver/handlers/package.handler.ts new file mode 100644 index 0000000..ce3404b --- /dev/null +++ b/ts/opsserver/handlers/package.handler.ts @@ -0,0 +1,315 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity } from '../helpers/guards.ts'; +import { Package, Repository } from '../../models/index.ts'; +import { PermissionService } from '../../services/permission.service.ts'; + +export class PackageHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private permissionService = new PermissionService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // Search Packages + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'searchPackages', + async (dataArg) => { + try { + const query = dataArg.query || ''; + const protocol = dataArg.protocol; + const organizationId = dataArg.organizationId; + const limit = dataArg.limit || 50; + const offset = dataArg.offset || 0; + + // Determine visibility: anonymous users see only public packages + const hasIdentity = !!dataArg.identity?.jwt; + const isPrivate = hasIdentity ? undefined : false; + + const packages = await Package.searchPackages(query, { + protocol, + organizationId, + isPrivate, + limit, + offset, + }); + + // Filter out packages user doesn't have access to + const accessiblePackages: typeof packages = []; + for (const pkg of packages) { + if (!pkg.isPrivate) { + accessiblePackages.push(pkg); + continue; + } + + if (hasIdentity && dataArg.identity) { + const canAccess = await this.permissionService.canAccessPackage( + dataArg.identity.userId, + pkg.organizationId, + pkg.repositoryId, + 'read', + ); + if (canAccess) { + accessiblePackages.push(pkg); + } + } + } + + return { + packages: accessiblePackages.map((pkg) => ({ + id: pkg.id, + name: pkg.name, + description: pkg.description, + protocol: pkg.protocol as interfaces.data.TRegistryProtocol, + organizationId: pkg.organizationId, + repositoryId: pkg.repositoryId, + latestVersion: pkg.distTags?.['latest'], + isPrivate: pkg.isPrivate, + downloadCount: pkg.downloadCount || 0, + starCount: pkg.starCount || 0, + storageBytes: pkg.storageBytes || 0, + updatedAt: pkg.updatedAt instanceof Date ? pkg.updatedAt.toISOString() : String(pkg.updatedAt), + createdAt: pkg.createdAt instanceof Date ? pkg.createdAt.toISOString() : String(pkg.createdAt), + })), + total: accessiblePackages.length, + limit, + offset, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to search packages'); + } + }, + ), + ); + + // Get Package + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getPackage', + async (dataArg) => { + try { + const pkg = await Package.findById(dataArg.packageId); + if (!pkg) { + throw new plugins.typedrequest.TypedResponseError('Package not found'); + } + + // Check access for private packages + if (pkg.isPrivate) { + if (!dataArg.identity?.jwt) { + throw new plugins.typedrequest.TypedResponseError('Authentication required'); + } + + const canAccess = await this.permissionService.canAccessPackage( + dataArg.identity.userId, + pkg.organizationId, + pkg.repositoryId, + 'read', + ); + + if (!canAccess) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + } + + return { + package: { + id: pkg.id, + name: pkg.name, + description: pkg.description, + protocol: pkg.protocol as interfaces.data.TRegistryProtocol, + organizationId: pkg.organizationId, + repositoryId: pkg.repositoryId, + latestVersion: pkg.distTags?.['latest'], + isPrivate: pkg.isPrivate, + downloadCount: pkg.downloadCount || 0, + starCount: pkg.starCount || 0, + storageBytes: pkg.storageBytes || 0, + distTags: pkg.distTags || {}, + versions: Object.keys(pkg.versions || {}), + updatedAt: pkg.updatedAt instanceof Date ? pkg.updatedAt.toISOString() : String(pkg.updatedAt), + createdAt: pkg.createdAt instanceof Date ? pkg.createdAt.toISOString() : String(pkg.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get package'); + } + }, + ), + ); + + // Get Package Versions + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getPackageVersions', + async (dataArg) => { + try { + const pkg = await Package.findById(dataArg.packageId); + if (!pkg) { + throw new plugins.typedrequest.TypedResponseError('Package not found'); + } + + // Check access for private packages + if (pkg.isPrivate) { + if (!dataArg.identity?.jwt) { + throw new plugins.typedrequest.TypedResponseError('Authentication required'); + } + + const canAccess = await this.permissionService.canAccessPackage( + dataArg.identity.userId, + pkg.organizationId, + pkg.repositoryId, + 'read', + ); + + if (!canAccess) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + } + + const versions = Object.entries(pkg.versions || {}).map(([version, data]) => ({ + version, + publishedAt: data.publishedAt instanceof Date ? data.publishedAt.toISOString() : String(data.publishedAt || ''), + size: data.size || 0, + downloads: data.downloads || 0, + checksum: data.metadata?.checksum as interfaces.data.IPackageVersion['checksum'], + })); + + return { + packageId: pkg.id, + packageName: pkg.name, + distTags: pkg.distTags || {}, + versions, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list versions'); + } + }, + ), + ); + + // Delete Package + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deletePackage', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const pkg = await Package.findById(dataArg.packageId); + if (!pkg) { + throw new plugins.typedrequest.TypedResponseError('Package not found'); + } + + // Check delete permission + const canDelete = await this.permissionService.canAccessPackage( + dataArg.identity.userId, + pkg.organizationId, + pkg.repositoryId, + 'delete', + ); + + if (!canDelete) { + throw new plugins.typedrequest.TypedResponseError('Delete permission required'); + } + + // Update repository counts before deleting + const repo = await Repository.findById(pkg.repositoryId); + if (repo) { + repo.packageCount = Math.max(0, repo.packageCount - 1); + repo.storageBytes -= pkg.storageBytes; + await repo.save(); + } + + await pkg.delete(); + + return { message: 'Package deleted successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete package'); + } + }, + ), + ); + + // Delete Package Version + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deletePackageVersion', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const pkg = await Package.findById(dataArg.packageId); + if (!pkg) { + throw new plugins.typedrequest.TypedResponseError('Package not found'); + } + + const versionData = pkg.versions?.[dataArg.version]; + if (!versionData) { + throw new plugins.typedrequest.TypedResponseError('Version not found'); + } + + // Check delete permission + const canDelete = await this.permissionService.canAccessPackage( + dataArg.identity.userId, + pkg.organizationId, + pkg.repositoryId, + 'delete', + ); + + if (!canDelete) { + throw new plugins.typedrequest.TypedResponseError('Delete permission required'); + } + + // Check if this is the only version + if (Object.keys(pkg.versions).length === 1) { + throw new plugins.typedrequest.TypedResponseError( + 'Cannot delete the only version. Delete the entire package instead.', + ); + } + + // Remove version + const sizeReduction = versionData.size || 0; + delete pkg.versions[dataArg.version]; + pkg.storageBytes -= sizeReduction; + + // Update dist tags + for (const [tag, tagVersion] of Object.entries(pkg.distTags || {})) { + if (tagVersion === dataArg.version) { + delete pkg.distTags[tag]; + } + } + + // Set new latest if needed + if (!pkg.distTags['latest'] && Object.keys(pkg.versions).length > 0) { + const versions = Object.keys(pkg.versions).sort(); + pkg.distTags['latest'] = versions[versions.length - 1]; + } + + await pkg.save(); + + // Update repository storage + const repo = await Repository.findById(pkg.repositoryId); + if (repo) { + repo.storageBytes -= sizeReduction; + await repo.save(); + } + + return { message: 'Version deleted successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete version'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/repository.handler.ts b/ts/opsserver/handlers/repository.handler.ts new file mode 100644 index 0000000..8407951 --- /dev/null +++ b/ts/opsserver/handlers/repository.handler.ts @@ -0,0 +1,272 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity } from '../helpers/guards.ts'; +import { Organization, Repository } from '../../models/index.ts'; +import { PermissionService } from '../../services/permission.service.ts'; +import { AuditService } from '../../services/audit.service.ts'; + +export class RepositoryHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private permissionService = new PermissionService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // Get Repositories + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getRepositories', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const repositories = await this.permissionService.getAccessibleRepositories( + dataArg.identity.userId, + dataArg.organizationId, + ); + + return { + repositories: repositories.map((repo) => ({ + id: repo.id, + organizationId: repo.organizationId, + name: repo.name, + description: repo.description, + protocol: repo.protocol as interfaces.data.TRegistryProtocol, + visibility: repo.visibility as interfaces.data.TRepositoryVisibility, + isPublic: repo.isPublic, + packageCount: repo.packageCount, + storageBytes: repo.storageBytes || 0, + downloadCount: (repo as any).downloadCount || 0, + createdAt: repo.createdAt instanceof Date ? repo.createdAt.toISOString() : String(repo.createdAt), + })), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list repositories'); + } + }, + ), + ); + + // Get Repository + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getRepository', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const repo = await Repository.findById(dataArg.repositoryId); + if (!repo) { + throw new plugins.typedrequest.TypedResponseError('Repository not found'); + } + + // Check access + if (!repo.isPublic) { + const permissions = await this.permissionService.resolvePermissions({ + userId: dataArg.identity.userId, + organizationId: repo.organizationId, + repositoryId: repo.id, + }); + + if (!permissions.canRead) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + } + + return { + repository: { + id: repo.id, + organizationId: repo.organizationId, + name: repo.name, + description: repo.description, + protocol: repo.protocol as interfaces.data.TRegistryProtocol, + visibility: repo.visibility as interfaces.data.TRepositoryVisibility, + isPublic: repo.isPublic, + packageCount: repo.packageCount, + storageBytes: repo.storageBytes || 0, + downloadCount: (repo as any).downloadCount || 0, + createdAt: repo.createdAt instanceof Date ? repo.createdAt.toISOString() : String(repo.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get repository'); + } + }, + ), + ); + + // Create Repository + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'createRepository', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { organizationId, name, description, protocol, visibility } = dataArg; + + // Check admin permission + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + organizationId, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + if (!name) { + throw new plugins.typedrequest.TypedResponseError('Repository name is required'); + } + + // Validate name format + if (!/^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$/.test(name)) { + throw new plugins.typedrequest.TypedResponseError( + 'Name must be lowercase alphanumeric with optional dots, hyphens, or underscores', + ); + } + + // Check org exists + const org = await Organization.findById(organizationId); + if (!org) { + throw new plugins.typedrequest.TypedResponseError('Organization not found'); + } + + // Create repository + const repo = await Repository.createRepository({ + organizationId, + name, + description, + protocol: protocol || 'npm', + visibility: visibility || 'private', + createdById: dataArg.identity.userId, + }); + + // Audit log + await AuditService.withContext({ + actorId: dataArg.identity.userId, + actorType: 'user', + organizationId, + }).logRepositoryCreated(repo.id, repo.name, organizationId); + + return { + repository: { + id: repo.id, + organizationId: repo.organizationId, + name: repo.name, + description: repo.description, + protocol: repo.protocol as interfaces.data.TRegistryProtocol, + visibility: repo.visibility as interfaces.data.TRepositoryVisibility, + isPublic: repo.isPublic, + packageCount: repo.packageCount, + storageBytes: repo.storageBytes || 0, + downloadCount: 0, + createdAt: repo.createdAt instanceof Date ? repo.createdAt.toISOString() : String(repo.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to create repository'); + } + }, + ), + ); + + // Update Repository + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updateRepository', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const repo = await Repository.findById(dataArg.repositoryId); + if (!repo) { + throw new plugins.typedrequest.TypedResponseError('Repository not found'); + } + + // Check admin permission + const canManage = await this.permissionService.canManageRepository( + dataArg.identity.userId, + repo.organizationId, + dataArg.repositoryId, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + if (dataArg.description !== undefined) repo.description = dataArg.description; + if (dataArg.visibility !== undefined) repo.visibility = dataArg.visibility as any; + + await repo.save(); + + return { + repository: { + id: repo.id, + organizationId: repo.organizationId, + name: repo.name, + description: repo.description, + protocol: repo.protocol as interfaces.data.TRegistryProtocol, + visibility: repo.visibility as interfaces.data.TRepositoryVisibility, + isPublic: repo.isPublic, + packageCount: repo.packageCount, + storageBytes: repo.storageBytes || 0, + downloadCount: (repo as any).downloadCount || 0, + createdAt: repo.createdAt instanceof Date ? repo.createdAt.toISOString() : String(repo.createdAt), + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update repository'); + } + }, + ), + ); + + // Delete Repository + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deleteRepository', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const repo = await Repository.findById(dataArg.repositoryId); + if (!repo) { + throw new plugins.typedrequest.TypedResponseError('Repository not found'); + } + + // Check admin permission + const canManage = await this.permissionService.canManageRepository( + dataArg.identity.userId, + repo.organizationId, + dataArg.repositoryId, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } + + // Check for packages + if (repo.packageCount > 0) { + throw new plugins.typedrequest.TypedResponseError( + 'Cannot delete repository with packages. Remove all packages first.', + ); + } + + await repo.delete(); + + return { message: 'Repository deleted successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete repository'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/token.handler.ts b/ts/opsserver/handlers/token.handler.ts new file mode 100644 index 0000000..a1d0a4c --- /dev/null +++ b/ts/opsserver/handlers/token.handler.ts @@ -0,0 +1,198 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity } from '../helpers/guards.ts'; +import { ApiToken } from '../../models/index.ts'; +import { TokenService } from '../../services/token.service.ts'; +import { PermissionService } from '../../services/permission.service.ts'; + +export class TokenHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private tokenService = new TokenService(); + private permissionService = new PermissionService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + private registerHandlers(): void { + // Get Tokens + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getTokens', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + let tokens; + if (dataArg.organizationId) { + // Check if user can manage org + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + dataArg.organizationId, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError( + 'Not authorized to view organization tokens', + ); + } + tokens = await this.tokenService.getOrgTokens(dataArg.organizationId); + } else { + tokens = await this.tokenService.getUserTokens(dataArg.identity.userId); + } + + return { + tokens: tokens.map((t) => ({ + id: t.id, + name: t.name, + tokenPrefix: t.tokenPrefix, + protocols: t.protocols as interfaces.data.TRegistryProtocol[], + scopes: t.scopes as interfaces.data.ITokenScope[], + organizationId: t.organizationId, + createdById: t.createdById, + expiresAt: t.expiresAt instanceof Date ? t.expiresAt.toISOString() : t.expiresAt ? String(t.expiresAt) : undefined, + lastUsedAt: t.lastUsedAt instanceof Date ? t.lastUsedAt.toISOString() : t.lastUsedAt ? String(t.lastUsedAt) : undefined, + usageCount: t.usageCount, + createdAt: t.createdAt instanceof Date ? t.createdAt.toISOString() : String(t.createdAt), + })), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list tokens'); + } + }, + ), + ); + + // Create Token + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'createToken', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { name, organizationId, protocols, scopes, expiresInDays } = dataArg; + + if (!name) { + throw new plugins.typedrequest.TypedResponseError('Token name is required'); + } + + if (!protocols || protocols.length === 0) { + throw new plugins.typedrequest.TypedResponseError('At least one protocol is required'); + } + + if (!scopes || scopes.length === 0) { + throw new plugins.typedrequest.TypedResponseError('At least one scope is required'); + } + + // Validate protocols + const validProtocols = ['npm', 'oci', 'maven', 'cargo', 'composer', 'pypi', 'rubygems', '*']; + for (const protocol of protocols) { + if (!validProtocols.includes(protocol)) { + throw new plugins.typedrequest.TypedResponseError(`Invalid protocol: ${protocol}`); + } + } + + // Validate scopes + for (const scope of scopes) { + if (!scope.protocol || !scope.actions || scope.actions.length === 0) { + throw new plugins.typedrequest.TypedResponseError('Invalid scope configuration'); + } + } + + // If creating org token, verify permission + if (organizationId) { + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + organizationId, + ); + if (!canManage) { + throw new plugins.typedrequest.TypedResponseError( + 'Not authorized to create organization tokens', + ); + } + } + + const result = await this.tokenService.createToken({ + userId: dataArg.identity.userId, + organizationId, + createdById: dataArg.identity.userId, + name, + protocols: protocols as any[], + scopes: scopes as any[], + expiresInDays, + }); + + return { + token: { + id: result.token.id, + name: result.token.name, + token: result.rawToken, + tokenPrefix: result.token.tokenPrefix, + protocols: result.token.protocols as interfaces.data.TRegistryProtocol[], + scopes: result.token.scopes as interfaces.data.ITokenScope[], + organizationId: result.token.organizationId, + createdById: result.token.createdById, + expiresAt: result.token.expiresAt instanceof Date ? result.token.expiresAt.toISOString() : result.token.expiresAt ? String(result.token.expiresAt) : undefined, + usageCount: result.token.usageCount, + createdAt: result.token.createdAt instanceof Date ? result.token.createdAt.toISOString() : String(result.token.createdAt), + warning: 'Store this token securely. It will not be shown again.', + }, + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to create token'); + } + }, + ), + ); + + // Revoke Token + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'revokeToken', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { tokenId } = dataArg; + + // Check if it's a personal token + const userTokens = await this.tokenService.getUserTokens(dataArg.identity.userId); + let token = userTokens.find((t) => t.id === tokenId); + + if (!token) { + // Check if it's an org token the user can manage + const anyToken = await ApiToken.getInstance({ id: tokenId, isRevoked: false }); + if (anyToken?.organizationId) { + const canManage = await this.permissionService.canManageOrganization( + dataArg.identity.userId, + anyToken.organizationId, + ); + if (canManage) { + token = anyToken; + } + } + } + + if (!token) { + throw new plugins.typedrequest.TypedResponseError('Token not found'); + } + + const success = await this.tokenService.revokeToken(tokenId, 'user_revoked'); + if (!success) { + throw new plugins.typedrequest.TypedResponseError('Failed to revoke token'); + } + + return { message: 'Token revoked successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to revoke token'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/handlers/user.handler.ts b/ts/opsserver/handlers/user.handler.ts new file mode 100644 index 0000000..e2a5282 --- /dev/null +++ b/ts/opsserver/handlers/user.handler.ts @@ -0,0 +1,263 @@ +import * as plugins from '../../plugins.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; +import type { OpsServer } from '../classes.opsserver.ts'; +import { requireValidIdentity, requireAdminIdentity } from '../helpers/guards.ts'; +import { User } from '../../models/user.ts'; +import { Session } from '../../models/session.ts'; +import { AuthService } from '../../services/auth.service.ts'; + +export class UserHandler { + public typedrouter = new plugins.typedrequest.TypedRouter(); + private authService = new AuthService(); + + constructor(private opsServerRef: OpsServer) { + this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); + this.registerHandlers(); + } + + /** + * Helper to format user to IUser interface + */ + private formatUser(user: User): interfaces.data.IUser { + return { + id: user.id, + email: user.email, + username: user.username, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + isSystemAdmin: user.isSystemAdmin, + isActive: user.isActive, + createdAt: user.createdAt instanceof Date ? user.createdAt.toISOString() : String(user.createdAt), + lastLoginAt: user.lastLoginAt instanceof Date ? user.lastLoginAt.toISOString() : user.lastLoginAt ? String(user.lastLoginAt) : undefined, + }; + } + + private registerHandlers(): void { + // Get Users (admin only) + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getUsers', + async (dataArg) => { + await requireAdminIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const users = await User.getInstances({}); + return { + users: users.map((u) => this.formatUser(u)), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to list users'); + } + }, + ), + ); + + // Get User + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getUser', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { userId } = dataArg; + + // Users can view their own profile, admins can view any + if (userId !== dataArg.identity.userId && !dataArg.identity.isSystemAdmin) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + + const user = await User.findById(userId); + if (!user) { + throw new plugins.typedrequest.TypedResponseError('User not found'); + } + + return { user: this.formatUser(user) }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get user'); + } + }, + ), + ); + + // Update User + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'updateUser', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { userId, displayName, avatarUrl, password, isActive, isSystemAdmin } = dataArg; + + // Users can update their own profile, admins can update any + if (userId !== dataArg.identity.userId && !dataArg.identity.isSystemAdmin) { + throw new plugins.typedrequest.TypedResponseError('Access denied'); + } + + const user = await User.findById(userId); + if (!user) { + throw new plugins.typedrequest.TypedResponseError('User not found'); + } + + if (displayName !== undefined) user.displayName = displayName; + if (avatarUrl !== undefined) user.avatarUrl = avatarUrl; + + // Only admins can change these + if (dataArg.identity.isSystemAdmin) { + if (isActive !== undefined) user.status = isActive ? 'active' : 'suspended'; + if (isSystemAdmin !== undefined) user.isPlatformAdmin = isSystemAdmin; + } + + // Password change + if (password) { + user.passwordHash = await AuthService.hashPassword(password); + } + + await user.save(); + + return { user: this.formatUser(user) }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to update user'); + } + }, + ), + ); + + // Get User Sessions + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'getUserSessions', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const sessions = await Session.getUserSessions(dataArg.identity.userId); + + return { + sessions: sessions.map((s) => ({ + id: s.id, + userId: s.userId, + userAgent: s.userAgent, + ipAddress: s.ipAddress, + isValid: s.isValid, + lastActivityAt: s.lastActivityAt instanceof Date ? s.lastActivityAt.toISOString() : String(s.lastActivityAt), + createdAt: s.createdAt instanceof Date ? s.createdAt.toISOString() : String(s.createdAt), + })), + }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to get sessions'); + } + }, + ), + ); + + // Revoke Session + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'revokeSession', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + await this.authService.logout(dataArg.sessionId, { + userId: dataArg.identity.userId, + }); + + return { message: 'Session revoked successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to revoke session'); + } + }, + ), + ); + + // Change Password + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'changePassword', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { currentPassword, newPassword } = dataArg; + + if (!currentPassword || !newPassword) { + throw new plugins.typedrequest.TypedResponseError( + 'Current password and new password are required', + ); + } + + const user = await User.findById(dataArg.identity.userId); + if (!user) { + throw new plugins.typedrequest.TypedResponseError('User not found'); + } + + // Verify current password + const isValid = await user.verifyPassword(currentPassword); + if (!isValid) { + throw new plugins.typedrequest.TypedResponseError('Current password is incorrect'); + } + + // Hash and set new password + user.passwordHash = await AuthService.hashPassword(newPassword); + await user.save(); + + return { message: 'Password changed successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to change password'); + } + }, + ), + ); + + // Delete Account + this.typedrouter.addTypedHandler( + new plugins.typedrequest.TypedHandler( + 'deleteAccount', + async (dataArg) => { + await requireValidIdentity(this.opsServerRef.authHandler, dataArg); + + try { + const { password } = dataArg; + + if (!password) { + throw new plugins.typedrequest.TypedResponseError( + 'Password is required to delete account', + ); + } + + const user = await User.findById(dataArg.identity.userId); + if (!user) { + throw new plugins.typedrequest.TypedResponseError('User not found'); + } + + // Verify password + const isValid = await user.verifyPassword(password); + if (!isValid) { + throw new plugins.typedrequest.TypedResponseError('Password is incorrect'); + } + + // Soft delete - deactivate instead of removing + user.status = 'suspended'; + await user.save(); + + // Invalidate all sessions + await Session.invalidateAllUserSessions(user.id, 'account_deleted'); + + return { message: 'Account deactivated successfully' }; + } catch (error) { + if (error instanceof plugins.typedrequest.TypedResponseError) throw error; + throw new plugins.typedrequest.TypedResponseError('Failed to delete account'); + } + }, + ), + ); + } +} diff --git a/ts/opsserver/helpers/guards.ts b/ts/opsserver/helpers/guards.ts new file mode 100644 index 0000000..9147ebf --- /dev/null +++ b/ts/opsserver/helpers/guards.ts @@ -0,0 +1,29 @@ +import * as plugins from '../../plugins.ts'; +import type { AuthHandler } from '../handlers/auth.handler.ts'; +import * as interfaces from '../../../ts_interfaces/index.ts'; + +export async function requireValidIdentity( + authHandler: AuthHandler, + dataArg: T, +): Promise { + if (!dataArg.identity) { + throw new plugins.typedrequest.TypedResponseError('No identity provided'); + } + const passed = await authHandler.validIdentityGuard.exec({ identity: dataArg.identity }); + if (!passed) { + throw new plugins.typedrequest.TypedResponseError('Valid identity required'); + } +} + +export async function requireAdminIdentity( + authHandler: AuthHandler, + dataArg: T, +): Promise { + if (!dataArg.identity) { + throw new plugins.typedrequest.TypedResponseError('No identity provided'); + } + const passed = await authHandler.adminIdentityGuard.exec({ identity: dataArg.identity }); + if (!passed) { + throw new plugins.typedrequest.TypedResponseError('Admin access required'); + } +} diff --git a/ts/plugins.ts b/ts/plugins.ts index 4dfd44a..72f30ae 100644 --- a/ts/plugins.ts +++ b/ts/plugins.ts @@ -18,6 +18,10 @@ import * as smartunique from '@push.rocks/smartunique'; import * as smartdelay from '@push.rocks/smartdelay'; import * as smartrx from '@push.rocks/smartrx'; import * as smartcli from '@push.rocks/smartcli'; +import * as smartguard from '@push.rocks/smartguard'; + +// api.global packages +import * as typedrequest from '@api.global/typedrequest'; // tsclass types import * as tsclass from '@tsclass/tsclass'; @@ -28,25 +32,28 @@ import * as fs from '@std/fs'; import * as http from '@std/http'; export { - // Push.rocks - smartregistry, - smartdata, - smartbucket, - smartlog, - smartenv, - smartpath, - smartpromise, - smartstring, - smartcrypto, - smartjwt, - smartunique, - smartdelay, - smartrx, - smartcli, - // tsclass - tsclass, - // Deno std - path, fs, http, + // Deno std + path, + smartbucket, + smartcli, + smartcrypto, + smartdata, + smartdelay, + smartenv, + smartguard, + smartjwt, + smartlog, + smartpath, + smartpromise, + // Push.rocks + smartregistry, + smartrx, + smartstring, + smartunique, + // tsclass + tsclass, + // api.global + typedrequest, }; diff --git a/ts/providers/auth.provider.ts b/ts/providers/auth.provider.ts index e5c6c42..1984239 100644 --- a/ts/providers/auth.provider.ts +++ b/ts/providers/auth.provider.ts @@ -50,7 +50,7 @@ export class StackGalleryAuthProvider implements plugins.smartregistry.IAuthProv * Returns userId on success, null on failure */ public async authenticate( - credentials: plugins.smartregistry.ICredentials + credentials: plugins.smartregistry.ICredentials, ): Promise { const result = await this.authService.login(credentials.username, credentials.password); if (!result.success || !result.user) return null; @@ -62,7 +62,7 @@ export class StackGalleryAuthProvider implements plugins.smartregistry.IAuthProv */ public async validateToken( token: string, - protocol?: plugins.smartregistry.TRegistryProtocol + protocol?: plugins.smartregistry.TRegistryProtocol, ): Promise { // Try API token (srg_ prefix) if (token.startsWith('srg_')) { @@ -70,11 +70,10 @@ export class StackGalleryAuthProvider implements plugins.smartregistry.IAuthProv if (!result.valid || !result.token || !result.user) return null; return { - type: (protocol || result.token.protocols[0] || 'npm') as plugins.smartregistry.TRegistryProtocol, + type: (protocol || result.token.protocols[0] || + 'npm') as plugins.smartregistry.TRegistryProtocol, userId: result.user.id, - scopes: result.token.scopes.map((s) => - `${s.protocol}:${s.actions.join(',')}` - ), + scopes: result.token.scopes.map((s) => `${s.protocol}:${s.actions.join(',')}`), readonly: !result.token.scopes.some((s) => s.actions.includes('write') || s.actions.includes('*') ), @@ -98,7 +97,7 @@ export class StackGalleryAuthProvider implements plugins.smartregistry.IAuthProv public async createToken( userId: string, protocol: plugins.smartregistry.TRegistryProtocol, - options?: plugins.smartregistry.ITokenOptions + options?: plugins.smartregistry.ITokenOptions, ): Promise { const result = await this.tokenService.createToken({ userId, @@ -133,7 +132,7 @@ export class StackGalleryAuthProvider implements plugins.smartregistry.IAuthProv public async authorize( token: plugins.smartregistry.IAuthToken | null, resource: string, - action: string + action: string, ): Promise { // Anonymous access: only public reads if (!token) return false; diff --git a/ts/providers/index.ts b/ts/providers/index.ts index 169aecd..27302f1 100644 --- a/ts/providers/index.ts +++ b/ts/providers/index.ts @@ -2,5 +2,5 @@ * Provider exports */ -export { StackGalleryAuthProvider, type IStackGalleryActor } from './auth.provider.ts'; -export { StackGalleryStorageHooks, type IStorageConfig } from './storage.provider.ts'; +export { type IStackGalleryActor, StackGalleryAuthProvider } from './auth.provider.ts'; +export { type IStorageConfig, StackGalleryStorageHooks } from './storage.provider.ts'; diff --git a/ts/providers/storage.provider.ts b/ts/providers/storage.provider.ts index b97a4cb..c0479af 100644 --- a/ts/providers/storage.provider.ts +++ b/ts/providers/storage.provider.ts @@ -30,7 +30,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH * Called before a package is stored */ public async beforePut( - context: plugins.smartregistry.IStorageHookContext + context: plugins.smartregistry.IStorageHookContext, ): Promise { // Validate organization exists and has quota const orgId = context.actor?.orgId; @@ -54,7 +54,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH * Called after a package is successfully stored */ public async afterPut( - context: plugins.smartregistry.IStorageHookContext + context: plugins.smartregistry.IStorageHookContext, ): Promise { const protocol = context.protocol as TRegistryProtocol; const packageName = context.metadata?.packageName || context.key; @@ -115,7 +115,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH * Called after a package is fetched */ public async afterGet( - context: plugins.smartregistry.IStorageHookContext + context: plugins.smartregistry.IStorageHookContext, ): Promise { const protocol = context.protocol as TRegistryProtocol; const packageName = context.metadata?.packageName || context.key; @@ -134,7 +134,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH * Called before a package is deleted */ public async beforeDelete( - context: plugins.smartregistry.IStorageHookContext + context: plugins.smartregistry.IStorageHookContext, ): Promise { return { allowed: true }; } @@ -143,7 +143,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH * Called after a package is deleted */ public async afterDelete( - context: plugins.smartregistry.IStorageHookContext + context: plugins.smartregistry.IStorageHookContext, ): Promise { const protocol = context.protocol as TRegistryProtocol; const packageName = context.metadata?.packageName || context.key; @@ -216,7 +216,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH organizationName: string, packageName: string, version: string, - filename: string + filename: string, ): string { return `${this.config.basePath}/${protocol}/${organizationName}/${packageName}/${version}/${filename}`; } @@ -227,7 +227,7 @@ export class StackGalleryStorageHooks implements plugins.smartregistry.IStorageH public async storeArtifact( path: string, data: Uint8Array, - contentType?: string + contentType?: string, ): Promise { const bucket = await this.config.bucket.getBucketByName(this.config.bucketName); await bucket.fastPut({ diff --git a/ts/registry.ts b/ts/registry.ts index aab6bc9..c6d1055 100644 --- a/ts/registry.ts +++ b/ts/registry.ts @@ -4,12 +4,46 @@ */ import * as plugins from './plugins.ts'; -import { initDb, closeDb, isDbConnected } from './models/db.ts'; +import { closeDb, initDb, isDbConnected } from './models/db.ts'; import { StackGalleryAuthProvider } from './providers/auth.provider.ts'; import { StackGalleryStorageHooks } from './providers/storage.provider.ts'; -import { ApiRouter } from './api/router.ts'; -import { getEmbeddedFile } from './embedded-ui.generated.ts'; -import { ReloadSocketManager } from './reload-socket.ts'; +import { OpsServer } from './opsserver/classes.opsserver.ts'; + +// Bundled UI files (generated by tsbundle with base64ts output mode) +let bundledFileMap: Map | null = null; +try { + // @ts-ignore - generated file may not exist yet + const { files } = await import('../ts_bundled/bundle.ts'); + bundledFileMap = new Map(); + for (const file of files as Array<{ path: string; contentBase64: string }>) { + const binary = Uint8Array.from(atob(file.contentBase64), (c) => c.charCodeAt(0)); + const ext = file.path.split('.').pop() || ''; + bundledFileMap.set(`/${file.path}`, { data: binary, contentType: getContentType(ext) }); + } +} catch { + console.warn('[StackGalleryRegistry] No bundled UI found (ts_bundled/bundle.ts missing)'); +} + +function getContentType(ext: string): string { + const types: Record = { + html: 'text/html', + js: 'application/javascript', + css: 'text/css', + json: 'application/json', + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + svg: 'image/svg+xml', + ico: 'image/x-icon', + woff: 'font/woff', + woff2: 'font/woff2', + ttf: 'font/ttf', + eot: 'application/vnd.ms-fontobject', + map: 'application/json', + }; + return types[ext] || 'application/octet-stream'; +} export interface IRegistryConfig { // MongoDB configuration @@ -42,8 +76,7 @@ export class StackGalleryRegistry { private smartRegistry: plugins.smartregistry.SmartRegistry | null = null; private authProvider: StackGalleryAuthProvider | null = null; private storageHooks: StackGalleryStorageHooks | null = null; - private apiRouter: ApiRouter | null = null; - private reloadSocket: ReloadSocketManager | null = null; + private opsServer: OpsServer | null = null; private isInitialized = false; constructor(config: IRegistryConfig) { @@ -115,13 +148,11 @@ export class StackGalleryRegistry { }); console.log('[StackGalleryRegistry] smartregistry initialized'); - // Initialize API router - console.log('[StackGalleryRegistry] Initializing API router...'); - this.apiRouter = new ApiRouter(); - console.log('[StackGalleryRegistry] API router initialized'); - - // Initialize reload socket for hot reload - this.reloadSocket = new ReloadSocketManager(); + // Initialize OpsServer (TypedRequest handlers) + console.log('[StackGalleryRegistry] Initializing OpsServer...'); + this.opsServer = new OpsServer(this); + await this.opsServer.start(); + console.log('[StackGalleryRegistry] OpsServer initialized'); this.isInitialized = true; console.log('[StackGalleryRegistry] Initialization complete'); @@ -144,7 +175,7 @@ export class StackGalleryRegistry { { port, hostname: host }, async (request: Request): Promise => { return await this.handleRequest(request); - } + }, ); console.log(`[StackGalleryRegistry] Server running on http://${host}:${port}`); @@ -162,11 +193,14 @@ export class StackGalleryRegistry { return this.healthCheck(); } - // API endpoints (handled by REST API layer) - if (path.startsWith('/api/')) { - return await this.handleApiRequest(request); + // TypedRequest endpoint (handled by OpsServer TypedRouter) + if (path === '/typedrequest' && request.method === 'POST') { + return await this.handleTypedRequest(request); } + // Legacy REST API endpoints (keep for backwards compatibility during migration) + // TODO: Remove once frontend is fully migrated to TypedRequest + // Registry protocol endpoints (handled by smartregistry) const registryPaths = [ '/-/', @@ -180,8 +214,7 @@ export class StackGalleryRegistry { '/api/v1/gems/', '/gems/', ]; - const isRegistryPath = - registryPaths.some((p) => path.startsWith(p)) || + const isRegistryPath = registryPaths.some((p) => path.startsWith(p)) || (path.startsWith('/@') && !path.startsWith('/@stack')); if (this.smartRegistry && isRegistryPath) { @@ -199,11 +232,6 @@ export class StackGalleryRegistry { } } - // WebSocket upgrade for hot reload - if (path === '/ws/reload' && request.headers.get('upgrade') === 'websocket') { - return this.reloadSocket!.handleUpgrade(request); - } - // Serve static UI files return this.serveStaticFile(path); } @@ -212,7 +240,7 @@ export class StackGalleryRegistry { * Convert a Deno Request to smartregistry IRequestContext */ private async requestToContext( - request: Request + request: Request, ): Promise { const url = new URL(request.url); const headers: Record = {}; @@ -285,24 +313,28 @@ export class StackGalleryRegistry { } /** - * Serve static files from embedded UI + * Serve static files from bundled UI */ private serveStaticFile(path: string): Response { + if (!bundledFileMap) { + return new Response('UI not bundled. Run tsbundle first.', { status: 404 }); + } + const filePath = path === '/' ? '/index.html' : path; - // Get embedded file - const embeddedFile = getEmbeddedFile(filePath); - if (embeddedFile) { - return new Response(embeddedFile.data as unknown as BodyInit, { + // Get bundled file + const file = bundledFileMap.get(filePath); + if (file) { + return new Response(file.data, { status: 200, - headers: { 'Content-Type': embeddedFile.contentType }, + headers: { 'Content-Type': file.contentType }, }); } // SPA fallback: serve index.html for unknown paths - const indexFile = getEmbeddedFile('/index.html'); + const indexFile = bundledFileMap.get('/index.html'); if (indexFile) { - return new Response(indexFile.data as unknown as BodyInit, { + return new Response(indexFile.data, { status: 200, headers: { 'Content-Type': 'text/html' }, }); @@ -312,17 +344,34 @@ export class StackGalleryRegistry { } /** - * Handle API requests + * Handle TypedRequest calls */ - private async handleApiRequest(request: Request): Promise { - if (!this.apiRouter) { - return new Response(JSON.stringify({ error: 'API router not initialized' }), { + private async handleTypedRequest(request: Request): Promise { + if (!this.opsServer) { + return new Response(JSON.stringify({ error: 'OpsServer not initialized' }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } - return await this.apiRouter.handle(request); + try { + const body = await request.json(); + const result = await this.opsServer.typedrouter.routeAndAddResponse(body); + return new Response(JSON.stringify(result), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } catch (error) { + console.error('[StackGalleryRegistry] TypedRequest error:', error); + const message = error instanceof Error ? error.message : 'Internal server error'; + return new Response( + JSON.stringify({ error: message }), + { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }, + ); + } } /** @@ -352,6 +401,9 @@ export class StackGalleryRegistry { */ public async stop(): Promise { console.log('[StackGalleryRegistry] Shutting down...'); + if (this.opsServer) { + await this.opsServer.stop(); + } await closeDb(); this.isInitialized = false; console.log('[StackGalleryRegistry] Shutdown complete'); @@ -420,9 +472,10 @@ export async function createRegistryFromEnvFile(): Promise const s3Endpoint = `${s3Protocol}://${env.S3_HOST || 'localhost'}:${env.S3_PORT || '9000'}`; const config: IRegistryConfig = { - mongoUrl: - env.MONGODB_URL || - `mongodb://${env.MONGODB_USER}:${env.MONGODB_PASS}@${env.MONGODB_HOST || 'localhost'}:${env.MONGODB_PORT || '27017'}/${env.MONGODB_NAME}?authSource=admin`, + mongoUrl: env.MONGODB_URL || + `mongodb://${env.MONGODB_USER}:${env.MONGODB_PASS}@${env.MONGODB_HOST || 'localhost'}:${ + env.MONGODB_PORT || '27017' + }/${env.MONGODB_NAME}?authSource=admin`, mongoDb: env.MONGODB_NAME || 'stackgallery', s3Endpoint: s3Endpoint, s3AccessKey: env.S3_ACCESSKEY || env.S3_ACCESS_KEY || 'minioadmin', @@ -444,7 +497,7 @@ export async function createRegistryFromEnvFile(): Promise } else { console.warn( '[StackGalleryRegistry] Error reading .nogit/env.json, falling back to env vars:', - error + error, ); } return createRegistryFromEnv(); diff --git a/ts/reload-socket.ts b/ts/reload-socket.ts deleted file mode 100644 index f3379ed..0000000 --- a/ts/reload-socket.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * WebSocket manager for hot reload - * Generates a unique instance ID on startup and broadcasts it to connected clients. - * When the server restarts, clients detect the new ID and reload the page. - */ -export class ReloadSocketManager { - private instanceId: string; - private clients: Set = new Set(); - - constructor() { - this.instanceId = crypto.randomUUID(); - console.log(`[ReloadSocket] Instance ID: ${this.instanceId}`); - } - - /** - * Get the current instance ID - */ - getInstanceId(): string { - return this.instanceId; - } - - /** - * Handle WebSocket upgrade request - */ - handleUpgrade(request: Request): Response { - const { socket, response } = Deno.upgradeWebSocket(request); - - socket.onopen = () => { - this.clients.add(socket); - console.log(`[ReloadSocket] Client connected (${this.clients.size} total)`); - // Send instance ID immediately - socket.send(JSON.stringify({ type: 'instance', id: this.instanceId })); - }; - - socket.onclose = () => { - this.clients.delete(socket); - console.log(`[ReloadSocket] Client disconnected (${this.clients.size} remaining)`); - }; - - socket.onerror = (error) => { - console.error('[ReloadSocket] WebSocket error:', error); - }; - - return response; - } - - /** - * Broadcast a message to all connected clients - */ - broadcast(message: object): void { - const msg = JSON.stringify(message); - for (const client of this.clients) { - if (client.readyState === WebSocket.OPEN) { - client.send(msg); - } - } - } - - /** - * Get the number of connected clients - */ - getClientCount(): number { - return this.clients.size; - } -} diff --git a/ts/services/audit.service.ts b/ts/services/audit.service.ts index 66994ad..84ebf5c 100644 --- a/ts/services/audit.service.ts +++ b/ts/services/audit.service.ts @@ -45,7 +45,7 @@ export class AuditService { errorCode?: string; errorMessage?: string; durationMs?: number; - } = {} + } = {}, ): Promise { return await AuditLog.log({ actorId: this.context.actorId, @@ -75,7 +75,7 @@ export class AuditService { resourceType: TAuditResourceType, resourceId?: string, resourceName?: string, - metadata?: Record + metadata?: Record, ): Promise { return await this.log(action, resourceType, { resourceId, @@ -94,7 +94,7 @@ export class AuditService { errorCode: string, errorMessage: string, resourceId?: string, - metadata?: Record + metadata?: Record, ): Promise { return await this.log(action, resourceType, { resourceId, @@ -107,11 +107,21 @@ export class AuditService { // Convenience methods for common actions - public async logUserLogin(userId: string, success: boolean, errorMessage?: string): Promise { + public async logUserLogin( + userId: string, + success: boolean, + errorMessage?: string, + ): Promise { if (success) { return await this.logSuccess('AUTH_LOGIN', 'user', userId); } - return await this.logFailure('AUTH_LOGIN', 'user', 'LOGIN_FAILED', errorMessage || 'Login failed', userId); + return await this.logFailure( + 'AUTH_LOGIN', + 'user', + 'LOGIN_FAILED', + errorMessage || 'Login failed', + userId, + ); } public async logUserLogout(userId: string): Promise { @@ -131,7 +141,7 @@ export class AuditService { packageName: string, version: string, organizationId: string, - repositoryId: string + repositoryId: string, ): Promise { return await this.log('PACKAGE_PUSHED', 'package', { resourceId: packageId, @@ -148,7 +158,7 @@ export class AuditService { packageName: string, version: string, organizationId: string, - repositoryId: string + repositoryId: string, ): Promise { return await this.log('PACKAGE_PULLED', 'package', { resourceId: packageId, @@ -167,7 +177,7 @@ export class AuditService { public async logRepositoryCreated( repoId: string, repoName: string, - organizationId: string + organizationId: string, ): Promise { return await this.log('REPO_CREATED', 'repository', { resourceId: repoId, @@ -182,7 +192,7 @@ export class AuditService { resourceId: string, targetUserId: string, oldRole: string | null, - newRole: string | null + newRole: string | null, ): Promise { return await this.log('ORG_MEMBER_ROLE_CHANGED', resourceType, { resourceId, diff --git a/ts/services/auth.service.ts b/ts/services/auth.service.ts index 3a8a120..e392e6e 100644 --- a/ts/services/auth.service.ts +++ b/ts/services/auth.service.ts @@ -3,7 +3,7 @@ */ import * as plugins from '../plugins.ts'; -import { User, Session } from '../models/index.ts'; +import { Session, User } from '../models/index.ts'; import { AuditService } from './audit.service.ts'; export interface IJwtPayload { @@ -52,7 +52,7 @@ export class AuthService { public async login( email: string, password: string, - options: { userAgent?: string; ipAddress?: string } = {} + options: { userAgent?: string; ipAddress?: string } = {}, ): Promise { const auditContext = AuditService.withContext({ actorIp: options.ipAddress, @@ -195,7 +195,7 @@ export class AuthService { */ public async logout( sessionId: string, - options: { userId?: string; ipAddress?: string } = {} + options: { userId?: string; ipAddress?: string } = {}, ): Promise { const session = await Session.findValidSession(sessionId); if (!session) return false; @@ -218,7 +218,7 @@ export class AuthService { */ public async logoutAll( userId: string, - options: { ipAddress?: string } = {} + options: { ipAddress?: string } = {}, ): Promise { const count = await Session.invalidateAllUserSessions(userId, 'logout_all'); @@ -238,7 +238,9 @@ export class AuthService { /** * Validate access token and return user */ - public async validateAccessToken(accessToken: string): Promise<{ user: User; sessionId: string } | null> { + public async validateAccessToken( + accessToken: string, + ): Promise<{ user: User; sessionId: string } | null> { const payload = await this.verifyToken(accessToken); if (!payload || payload.type !== 'access') return null; @@ -339,7 +341,7 @@ export class AuthService { encoder.encode(this.config.jwtSecret), { name: 'HMAC', hash: 'SHA-256' }, false, - ['sign'] + ['sign'], ); const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(data)); diff --git a/ts/services/auth/strategies/auth.strategy.interface.ts b/ts/services/auth/strategies/auth.strategy.interface.ts index 01860e5..c99406b 100644 --- a/ts/services/auth/strategies/auth.strategy.interface.ts +++ b/ts/services/auth/strategies/auth.strategy.interface.ts @@ -4,8 +4,8 @@ */ import type { - IExternalUserInfo, IConnectionTestResult, + IExternalUserInfo, } from '../../../interfaces/auth.interfaces.ts'; export interface IOAuthCallbackData { diff --git a/ts/services/auth/strategies/ldap.strategy.ts b/ts/services/auth/strategies/ldap.strategy.ts index e27fefc..9fd7cd3 100644 --- a/ts/services/auth/strategies/ldap.strategy.ts +++ b/ts/services/auth/strategies/ldap.strategy.ts @@ -9,8 +9,8 @@ import type { AuthProvider } from '../../../models/auth.provider.ts'; import type { CryptoService } from '../../crypto.service.ts'; import type { - IExternalUserInfo, IConnectionTestResult, + IExternalUserInfo, } from '../../../interfaces/auth.interfaces.ts'; import type { IAuthStrategy } from './auth.strategy.interface.ts'; @@ -23,7 +23,7 @@ interface ILdapEntry { export class LdapStrategy implements IAuthStrategy { constructor( private provider: AuthProvider, - private cryptoService: CryptoService + private cryptoService: CryptoService, ) {} /** @@ -31,7 +31,7 @@ export class LdapStrategy implements IAuthStrategy { */ public async authenticateCredentials( username: string, - password: string + password: string, ): Promise { const config = this.provider.ldapConfig; if (!config) { @@ -55,7 +55,7 @@ export class LdapStrategy implements IAuthStrategy { bindPassword, config.baseDn, userFilter, - password + password, ); // Map LDAP attributes to user info @@ -86,7 +86,7 @@ export class LdapStrategy implements IAuthStrategy { config.serverUrl, config.bindDn, bindPassword, - config.baseDn + config.baseDn, ); return { @@ -129,7 +129,7 @@ export class LdapStrategy implements IAuthStrategy { bindPassword: string, baseDn: string, userFilter: string, - userPassword: string + userPassword: string, ): Promise { // In a real implementation, this would: // 1. Connect to LDAP server @@ -150,7 +150,7 @@ export class LdapStrategy implements IAuthStrategy { throw new Error( 'LDAP authentication is not yet fully implemented. ' + - 'Please integrate with a Deno-compatible LDAP library (e.g., ldapts via npm compatibility).' + 'Please integrate with a Deno-compatible LDAP library (e.g., ldapts via npm compatibility).', ); } @@ -161,7 +161,7 @@ export class LdapStrategy implements IAuthStrategy { serverUrl: string, bindDn: string, bindPassword: string, - baseDn: string + baseDn: string, ): Promise { // Similar to ldapBind, this is a placeholder // Would connect and bind with service account to verify connectivity @@ -185,7 +185,9 @@ export class LdapStrategy implements IAuthStrategy { // Return success for configuration validation // Actual connectivity test would happen with LDAP library - console.log('[LdapStrategy] LDAP configuration is valid (actual connection test requires LDAP library)'); + console.log( + '[LdapStrategy] LDAP configuration is valid (actual connection test requires LDAP library)', + ); } /** @@ -206,15 +208,9 @@ export class LdapStrategy implements IAuthStrategy { return { externalId, email, - username: entry[mapping.username] - ? String(entry[mapping.username]) - : undefined, - displayName: entry[mapping.displayName] - ? String(entry[mapping.displayName]) - : undefined, - groups: mapping.groups - ? this.parseGroups(entry[mapping.groups]) - : undefined, + username: entry[mapping.username] ? String(entry[mapping.username]) : undefined, + displayName: entry[mapping.displayName] ? String(entry[mapping.displayName]) : undefined, + groups: mapping.groups ? this.parseGroups(entry[mapping.groups]) : undefined, rawAttributes: entry as Record, }; } diff --git a/ts/services/auth/strategies/oauth.strategy.ts b/ts/services/auth/strategies/oauth.strategy.ts index fb17448..c69d4c3 100644 --- a/ts/services/auth/strategies/oauth.strategy.ts +++ b/ts/services/auth/strategies/oauth.strategy.ts @@ -6,8 +6,8 @@ import type { AuthProvider } from '../../../models/auth.provider.ts'; import type { CryptoService } from '../../crypto.service.ts'; import type { - IExternalUserInfo, IConnectionTestResult, + IExternalUserInfo, } from '../../../interfaces/auth.interfaces.ts'; import type { IAuthStrategy, IOAuthCallbackData } from './auth.strategy.interface.ts'; @@ -34,7 +34,7 @@ export class OAuthStrategy implements IAuthStrategy { constructor( private provider: AuthProvider, - private cryptoService: CryptoService + private cryptoService: CryptoService, ) {} /** @@ -243,19 +243,15 @@ export class OAuthStrategy implements IAuthStrategy { return { externalId, email, - username: rawInfo[mapping.username] - ? String(rawInfo[mapping.username]) - : undefined, - displayName: rawInfo[mapping.displayName] - ? String(rawInfo[mapping.displayName]) - : undefined, + username: rawInfo[mapping.username] ? String(rawInfo[mapping.username]) : undefined, + displayName: rawInfo[mapping.displayName] ? String(rawInfo[mapping.displayName]) : undefined, avatarUrl: mapping.avatarUrl && rawInfo[mapping.avatarUrl] ? String(rawInfo[mapping.avatarUrl]) : (rawInfo.picture ? String(rawInfo.picture) : undefined), groups: mapping.groups && rawInfo[mapping.groups] ? (Array.isArray(rawInfo[mapping.groups]) - ? (rawInfo[mapping.groups] as string[]) - : [String(rawInfo[mapping.groups])]) + ? (rawInfo[mapping.groups] as string[]) + : [String(rawInfo[mapping.groups])]) : undefined, rawAttributes: rawInfo, }; diff --git a/ts/services/crypto.service.ts b/ts/services/crypto.service.ts index 9b0d2d5..090d1f8 100644 --- a/ts/services/crypto.service.ts +++ b/ts/services/crypto.service.ts @@ -17,7 +17,7 @@ export class CryptoService { const keyHex = Deno.env.get('AUTH_ENCRYPTION_KEY'); if (!keyHex) { console.warn( - '[CryptoService] AUTH_ENCRYPTION_KEY not set. Generating ephemeral key (NOT for production!)' + '[CryptoService] AUTH_ENCRYPTION_KEY not set. Generating ephemeral key (NOT for production!)', ); const randomBytes = crypto.getRandomValues(new Uint8Array(32)); this.masterKey = await this.importKey(this.bytesToHex(randomBytes)); @@ -52,7 +52,7 @@ export class CryptoService { const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv: iv.buffer as ArrayBuffer }, this.masterKey, - encoded.buffer as ArrayBuffer + encoded.buffer as ArrayBuffer, ); // Format: iv:ciphertext (both base64) @@ -88,7 +88,7 @@ export class CryptoService { const decrypted = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: iv.buffer as ArrayBuffer }, this.masterKey, - encrypted.buffer as ArrayBuffer + encrypted.buffer as ArrayBuffer, ); // Decode to string @@ -123,7 +123,7 @@ export class CryptoService { keyBytes.buffer as ArrayBuffer, { name: 'AES-GCM' }, false, - ['encrypt', 'decrypt'] + ['encrypt', 'decrypt'], ); } diff --git a/ts/services/external.auth.service.ts b/ts/services/external.auth.service.ts index 0c90007..59a1263 100644 --- a/ts/services/external.auth.service.ts +++ b/ts/services/external.auth.service.ts @@ -3,12 +3,18 @@ * Orchestrates OAuth/OIDC and LDAP authentication flows */ -import { User, Session, AuthProvider, ExternalIdentity, PlatformSettings } from '../models/index.ts'; +import { + AuthProvider, + ExternalIdentity, + PlatformSettings, + Session, + User, +} from '../models/index.ts'; import { AuthService, type IAuthResult } from './auth.service.ts'; import { AuditService } from './audit.service.ts'; import { cryptoService } from './crypto.service.ts'; import { AuthStrategyFactory, type IOAuthCallbackData } from './auth/strategies/index.ts'; -import type { IExternalUserInfo, IConnectionTestResult } from '../interfaces/auth.interfaces.ts'; +import type { IConnectionTestResult, IExternalUserInfo } from '../interfaces/auth.interfaces.ts'; export interface IOAuthState { providerId: string; @@ -33,7 +39,7 @@ export class ExternalAuthService { */ public async initiateOAuth( providerId: string, - returnUrl?: string + returnUrl?: string, ): Promise<{ authUrl: string; state: string }> { const provider = await AuthProvider.findById(providerId); if (!provider) { @@ -67,7 +73,7 @@ export class ExternalAuthService { */ public async handleOAuthCallback( data: IOAuthCallbackData, - options: { ipAddress?: string; userAgent?: string } = {} + options: { ipAddress?: string; userAgent?: string } = {}, ): Promise { // Validate state const stateData = await this.validateState(data.state); @@ -170,7 +176,7 @@ export class ExternalAuthService { providerId: string, username: string, password: string, - options: { ipAddress?: string; userAgent?: string } = {} + options: { ipAddress?: string; userAgent?: string } = {}, ): Promise { const provider = await AuthProvider.findById(providerId); if (!provider || provider.status !== 'active' || provider.type !== 'ldap') { @@ -261,7 +267,7 @@ export class ExternalAuthService { public async linkProvider( userId: string, providerId: string, - externalUser: IExternalUserInfo + externalUser: IExternalUserInfo, ): Promise { // Check if this external ID is already linked to another user const existing = await ExternalIdentity.findByExternalId(providerId, externalUser.externalId); @@ -377,12 +383,12 @@ export class ExternalAuthService { private async findOrCreateUser( provider: AuthProvider, externalUser: IExternalUserInfo, - options: { ipAddress?: string } = {} + options: { ipAddress?: string } = {}, ): Promise<{ user: User; isNew: boolean }> { // 1. Check if external identity already exists const existingIdentity = await ExternalIdentity.findByExternalId( provider.id, - externalUser.externalId + externalUser.externalId, ); if (existingIdentity) { @@ -544,12 +550,12 @@ export class ExternalAuthService { encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, - ['sign'] + ['sign'], ); const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(data)); const encodedSignature = this.base64UrlEncode( - String.fromCharCode(...new Uint8Array(signature)) + String.fromCharCode(...new Uint8Array(signature)), ); return `${data}.${encodedSignature}`; diff --git a/ts/services/index.ts b/ts/services/index.ts index 290917d..86736f8 100644 --- a/ts/services/index.ts +++ b/ts/services/index.ts @@ -4,19 +4,19 @@ export { AuditService, type IAuditContext } from './audit.service.ts'; export { - TokenService, type ICreateTokenOptions, type ITokenValidationResult, + TokenService, } from './token.service.ts'; export { - PermissionService, - type TAction, type IPermissionContext, type IResolvedPermissions, + PermissionService, + type TAction, } from './permission.service.ts'; export { AuthService, - type IJwtPayload, - type IAuthResult, type IAuthConfig, + type IAuthResult, + type IJwtPayload, } from './auth.service.ts'; diff --git a/ts/services/permission.service.ts b/ts/services/permission.service.ts index 4722fba..76e2ee1 100644 --- a/ts/services/permission.service.ts +++ b/ts/services/permission.service.ts @@ -4,18 +4,18 @@ import type { TOrganizationRole, - TTeamRole, - TRepositoryRole, TRegistryProtocol, + TRepositoryRole, + TTeamRole, } from '../interfaces/auth.interfaces.ts'; import { - User, Organization, OrganizationMember, - Team, - TeamMember, Repository, RepositoryPermission, + Team, + TeamMember, + User, } from '../models/index.ts'; export type TAction = 'read' | 'write' | 'delete' | 'admin'; @@ -71,7 +71,10 @@ export class PermissionService { if (!context.organizationId) return result; // Get organization membership - const orgMember = await OrganizationMember.findMembership(context.organizationId, context.userId); + const orgMember = await OrganizationMember.findMembership( + context.organizationId, + context.userId, + ); if (orgMember) { result.organizationRole = orgMember.role; @@ -137,7 +140,10 @@ export class PermissionService { } // Get direct repository permission (highest priority) - const repoPerm = await RepositoryPermission.findPermission(context.repositoryId, context.userId); + const repoPerm = await RepositoryPermission.findPermission( + context.repositoryId, + context.userId, + ); if (repoPerm) { result.repositoryRole = repoPerm.role; this.applyRole(result, repoPerm.role); @@ -151,7 +157,7 @@ export class PermissionService { */ public async checkPermission( context: IPermissionContext, - action: TAction + action: TAction, ): Promise { const permissions = await this.resolvePermissions(context); @@ -176,11 +182,11 @@ export class PermissionService { userId: string, organizationId: string, repositoryId: string, - action: 'read' | 'write' | 'delete' + action: 'read' | 'write' | 'delete', ): Promise { return await this.checkPermission( { userId, organizationId, repositoryId }, - action + action, ); } @@ -202,7 +208,7 @@ export class PermissionService { public async canManageRepository( userId: string, organizationId: string, - repositoryId: string + repositoryId: string, ): Promise { const permissions = await this.resolvePermissions({ userId, @@ -217,7 +223,7 @@ export class PermissionService { */ public async getAccessibleRepositories( userId: string, - organizationId: string + organizationId: string, ): Promise { const user = await User.findById(userId); if (!user || !user.isActive) return []; diff --git a/ts/services/token.service.ts b/ts/services/token.service.ts index 85e39ce..244c3f8 100644 --- a/ts/services/token.service.ts +++ b/ts/services/token.service.ts @@ -37,7 +37,9 @@ export class TokenService { * Generate a new API token * Returns the raw token (only shown once) and the saved token record */ - public async createToken(options: ICreateTokenOptions): Promise<{ rawToken: string; token: ApiToken }> { + public async createToken( + options: ICreateTokenOptions, + ): Promise<{ rawToken: string; token: ApiToken }> { // Generate secure random token: srg_{64 hex chars} const randomBytes = new Uint8Array(32); crypto.getRandomValues(randomBytes); @@ -206,7 +208,7 @@ export class TokenService { protocol: TRegistryProtocol, organizationId?: string, repositoryId?: string, - action?: string + action?: string, ): boolean { if (!token.hasProtocol(protocol)) return false; return token.hasScope(protocol, organizationId, repositoryId, action); diff --git a/ts_interfaces/data/admin.ts b/ts_interfaces/data/admin.ts new file mode 100644 index 0000000..8c1a289 --- /dev/null +++ b/ts_interfaces/data/admin.ts @@ -0,0 +1,80 @@ +// ============================================================================ +// Admin Data Types +// ============================================================================ + +import type { TAuthProviderStatus, TAuthProviderType } from './auth.ts'; + +export interface IOAuthConfig { + clientId: string; + clientSecretEncrypted: string; + issuer: string; + authorizationUrl?: string; + tokenUrl?: string; + userInfoUrl?: string; + scopes: string[]; + callbackUrl: string; +} + +export interface ILdapConfig { + serverUrl: string; + bindDn: string; + bindPasswordEncrypted: string; + baseDn: string; + userSearchFilter: string; + tlsEnabled: boolean; + tlsCaCert?: string; +} + +export interface IAttributeMapping { + email: string; + username: string; + displayName: string; + avatarUrl?: string; + groups?: string; +} + +export interface IProvisioningSettings { + jitEnabled: boolean; + autoLinkByEmail: boolean; + allowedEmailDomains?: string[]; +} + +export interface IAuthProvider { + id: string; + name: string; + displayName: string; + type: TAuthProviderType; + status: TAuthProviderStatus; + priority: number; + oauthConfig?: IOAuthConfig; + ldapConfig?: ILdapConfig; + attributeMapping: IAttributeMapping; + provisioning: IProvisioningSettings; + createdAt: string; + updatedAt: string; + createdById: string; + lastTestedAt?: string; + lastTestResult?: 'success' | 'failure'; + lastTestError?: string; +} + +export interface IPlatformAuthSettings { + localAuthEnabled: boolean; + allowUserRegistration: boolean; + sessionDurationMinutes: number; + defaultProviderId?: string; +} + +export interface IPlatformSettings { + id: string; + auth: IPlatformAuthSettings; + updatedAt: string; + updatedById?: string; +} + +export interface IConnectionTestResult { + success: boolean; + latencyMs: number; + serverInfo?: Record; + error?: string; +} diff --git a/ts_interfaces/data/audit.ts b/ts_interfaces/data/audit.ts new file mode 100644 index 0000000..75d92f4 --- /dev/null +++ b/ts_interfaces/data/audit.ts @@ -0,0 +1,79 @@ +// ============================================================================ +// Audit Data Types +// ============================================================================ + +export type TAuditAction = + | 'AUTH_LOGIN' + | 'AUTH_LOGOUT' + | 'AUTH_FAILED' + | 'AUTH_MFA_ENABLED' + | 'AUTH_MFA_DISABLED' + | 'AUTH_PASSWORD_CHANGED' + | 'AUTH_PASSWORD_RESET' + | 'TOKEN_CREATED' + | 'TOKEN_USED' + | 'TOKEN_REVOKED' + | 'TOKEN_EXPIRED' + | 'USER_CREATED' + | 'USER_UPDATED' + | 'USER_DELETED' + | 'USER_SUSPENDED' + | 'USER_ACTIVATED' + | 'ORG_CREATED' + | 'ORG_UPDATED' + | 'ORG_DELETED' + | 'ORG_MEMBER_ADDED' + | 'ORG_MEMBER_REMOVED' + | 'ORG_MEMBER_ROLE_CHANGED' + | 'TEAM_CREATED' + | 'TEAM_UPDATED' + | 'TEAM_DELETED' + | 'TEAM_MEMBER_ADDED' + | 'TEAM_MEMBER_REMOVED' + | 'REPO_CREATED' + | 'REPO_UPDATED' + | 'REPO_DELETED' + | 'REPO_VISIBILITY_CHANGED' + | 'REPO_PERMISSION_GRANTED' + | 'REPO_PERMISSION_REVOKED' + | 'PACKAGE_PUSHED' + | 'PACKAGE_PULLED' + | 'PACKAGE_DELETED' + | 'PACKAGE_DEPRECATED' + | 'AUTH_PROVIDER_CREATED' + | 'AUTH_PROVIDER_UPDATED' + | 'AUTH_PROVIDER_DELETED' + | 'AUTH_PROVIDER_TESTED' + | 'PLATFORM_SETTINGS_UPDATED' + | 'SECURITY_SCAN_COMPLETED' + | 'SECURITY_VULNERABILITY_FOUND' + | 'SECURITY_IP_BLOCKED' + | 'SECURITY_RATE_LIMITED'; + +export type TAuditResourceType = + | 'user' + | 'organization' + | 'team' + | 'repository' + | 'package' + | 'api_token' + | 'session' + | 'auth_provider' + | 'platform_settings' + | 'system'; + +export interface IAuditEntry { + id: string; + actorId?: string; + actorType: 'user' | 'api_token' | 'system' | 'anonymous'; + action: TAuditAction; + resourceType: TAuditResourceType; + resourceId?: string; + resourceName?: string; + organizationId?: string; + repositoryId?: string; + success: boolean; + errorCode?: string; + timestamp: string; + metadata: Record; +} diff --git a/ts_interfaces/data/auth.ts b/ts_interfaces/data/auth.ts new file mode 100644 index 0000000..12f3009 --- /dev/null +++ b/ts_interfaces/data/auth.ts @@ -0,0 +1,49 @@ +// ============================================================================ +// Auth Data Types +// ============================================================================ + +export type TUserStatus = 'active' | 'suspended' | 'pending_verification'; + +export interface IIdentity { + jwt: string; + refreshJwt: string; + userId: string; + email: string; + username: string; + displayName: string; + isSystemAdmin: boolean; + expiresAt: number; + sessionId: string; +} + +export interface IUser { + id: string; + email: string; + username: string; + displayName: string; + avatarUrl?: string; + isSystemAdmin: boolean; + isActive: boolean; + createdAt: string; + lastLoginAt?: string; +} + +export interface ISession { + id: string; + userId: string; + userAgent: string; + ipAddress: string; + isValid: boolean; + lastActivityAt: string; + createdAt: string; +} + +export interface IPublicAuthProvider { + id: string; + name: string; + displayName: string; + type: TAuthProviderType; +} + +export type TAuthProviderType = 'oidc' | 'ldap'; +export type TAuthProviderStatus = 'active' | 'disabled' | 'testing'; diff --git a/ts_interfaces/data/index.ts b/ts_interfaces/data/index.ts new file mode 100644 index 0000000..8ae58aa --- /dev/null +++ b/ts_interfaces/data/index.ts @@ -0,0 +1,7 @@ +export * from './auth.ts'; +export * from './organization.ts'; +export * from './repository.ts'; +export * from './package.ts'; +export * from './token.ts'; +export * from './audit.ts'; +export * from './admin.ts'; diff --git a/ts_interfaces/data/organization.ts b/ts_interfaces/data/organization.ts new file mode 100644 index 0000000..c5bc9a1 --- /dev/null +++ b/ts_interfaces/data/organization.ts @@ -0,0 +1,48 @@ +// ============================================================================ +// Organization Data Types +// ============================================================================ + +export type TOrganizationPlan = 'free' | 'team' | 'enterprise'; +export type TOrganizationRole = 'owner' | 'admin' | 'member'; + +export interface IOrganization { + id: string; + name: string; + displayName: string; + description?: string; + avatarUrl?: string; + website?: string; + isPublic: boolean; + memberCount: number; + plan: TOrganizationPlan; + usedStorageBytes: number; + storageQuotaBytes: number; + createdAt: string; +} + +export interface IOrganizationDetail extends IOrganization { + settings?: IOrganizationSettings; +} + +export interface IOrganizationSettings { + requireMfa: boolean; + allowPublicRepositories: boolean; + defaultRepositoryVisibility: TRepositoryVisibility; + allowedProtocols: TRegistryProtocol[]; +} + +export interface IOrganizationMember { + userId: string; + role: TOrganizationRole; + addedAt: string; + user: { + username: string; + displayName: string; + avatarUrl?: string; + } | null; +} + +// Re-export types used by settings +import type { TRepositoryVisibility } from './repository.ts'; +import type { TRegistryProtocol } from './package.ts'; +export type { TRegistryProtocol, TRepositoryVisibility }; diff --git a/ts_interfaces/data/package.ts b/ts_interfaces/data/package.ts new file mode 100644 index 0000000..6fbc286 --- /dev/null +++ b/ts_interfaces/data/package.ts @@ -0,0 +1,53 @@ +// ============================================================================ +// Package Data Types +// ============================================================================ + +export type TRegistryProtocol = + | 'oci' + | 'npm' + | 'maven' + | 'cargo' + | 'composer' + | 'pypi' + | 'rubygems'; + +export interface IPackage { + id: string; + name: string; + description?: string; + protocol: TRegistryProtocol; + organizationId: string; + repositoryId: string; + latestVersion?: string; + isPrivate: boolean; + downloadCount: number; + starCount: number; + storageBytes: number; + updatedAt: string; + createdAt: string; +} + +export interface IPackageDetail extends IPackage { + distTags: Record; + versions: string[]; +} + +export interface IPackageVersion { + version: string; + publishedAt: string; + size: number; + downloads: number; + checksum?: { + sha256?: string; + sha512?: string; + md5?: string; + }; +} + +export interface IPackageSearchParams { + query?: string; + protocol?: TRegistryProtocol; + organizationId?: string; + limit?: number; + offset?: number; +} diff --git a/ts_interfaces/data/repository.ts b/ts_interfaces/data/repository.ts new file mode 100644 index 0000000..09b6e33 --- /dev/null +++ b/ts_interfaces/data/repository.ts @@ -0,0 +1,22 @@ +// ============================================================================ +// Repository Data Types +// ============================================================================ + +import type { TRegistryProtocol } from './package.ts'; + +export type TRepositoryVisibility = 'public' | 'private' | 'internal'; +export type TRepositoryRole = 'admin' | 'maintainer' | 'developer' | 'reader'; + +export interface IRepository { + id: string; + organizationId: string; + name: string; + description?: string; + protocol: TRegistryProtocol; + visibility: TRepositoryVisibility; + isPublic: boolean; + packageCount: number; + storageBytes: number; + downloadCount: number; + createdAt: string; +} diff --git a/ts_interfaces/data/token.ts b/ts_interfaces/data/token.ts new file mode 100644 index 0000000..47f5d90 --- /dev/null +++ b/ts_interfaces/data/token.ts @@ -0,0 +1,33 @@ +// ============================================================================ +// Token Data Types +// ============================================================================ + +import type { TRegistryProtocol } from './package.ts'; + +export type TTokenAction = 'read' | 'write' | 'delete' | '*'; + +export interface ITokenScope { + protocol: TRegistryProtocol | '*'; + organizationId?: string; + repositoryId?: string; + actions: TTokenAction[]; +} + +export interface IToken { + id: string; + name: string; + tokenPrefix: string; + protocols: TRegistryProtocol[]; + scopes: ITokenScope[]; + organizationId?: string; + createdById?: string; + expiresAt?: string; + lastUsedAt?: string; + usageCount: number; + createdAt: string; +} + +export interface ITokenCreateResult extends IToken { + token: string; + warning: string; +} diff --git a/ts_interfaces/index.ts b/ts_interfaces/index.ts new file mode 100644 index 0000000..e08d37f --- /dev/null +++ b/ts_interfaces/index.ts @@ -0,0 +1,5 @@ +import * as plugins from './plugins.ts'; +import * as data from './data/index.ts'; +import * as requests from './requests/index.ts'; + +export { data, plugins, requests }; diff --git a/ts_interfaces/plugins.ts b/ts_interfaces/plugins.ts new file mode 100644 index 0000000..b64432f --- /dev/null +++ b/ts_interfaces/plugins.ts @@ -0,0 +1,3 @@ +import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces'; + +export { typedrequestInterfaces }; diff --git a/ts_interfaces/requests/admin.ts b/ts_interfaces/requests/admin.ts new file mode 100644 index 0000000..27b271e --- /dev/null +++ b/ts_interfaces/requests/admin.ts @@ -0,0 +1,137 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Admin Requests +// ============================================================================ + +export interface IReq_GetAdminProviders extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetAdminProviders + > { + method: 'getAdminProviders'; + request: { + identity: data.IIdentity; + }; + response: { + providers: data.IAuthProvider[]; + }; +} + +export interface IReq_CreateAdminProvider extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_CreateAdminProvider + > { + method: 'createAdminProvider'; + request: { + identity: data.IIdentity; + name: string; + displayName: string; + type: data.TAuthProviderType; + oauthConfig?: data.IOAuthConfig; + ldapConfig?: data.ILdapConfig; + attributeMapping?: data.IAttributeMapping; + provisioning?: data.IProvisioningSettings; + }; + response: { + provider: data.IAuthProvider; + }; +} + +export interface IReq_GetAdminProvider extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetAdminProvider + > { + method: 'getAdminProvider'; + request: { + identity: data.IIdentity; + providerId: string; + }; + response: { + provider: data.IAuthProvider; + }; +} + +export interface IReq_UpdateAdminProvider extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdateAdminProvider + > { + method: 'updateAdminProvider'; + request: { + identity: data.IIdentity; + providerId: string; + displayName?: string; + status?: data.TAuthProviderStatus; + priority?: number; + oauthConfig?: Partial; + ldapConfig?: Partial; + attributeMapping?: Partial; + provisioning?: Partial; + }; + response: { + provider: data.IAuthProvider; + }; +} + +export interface IReq_DeleteAdminProvider extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeleteAdminProvider + > { + method: 'deleteAdminProvider'; + request: { + identity: data.IIdentity; + providerId: string; + }; + response: { + message: string; + }; +} + +export interface IReq_TestAdminProvider extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_TestAdminProvider + > { + method: 'testAdminProvider'; + request: { + identity: data.IIdentity; + providerId: string; + }; + response: { + result: data.IConnectionTestResult; + }; +} + +export interface IReq_GetPlatformSettings extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetPlatformSettings + > { + method: 'getPlatformSettings'; + request: { + identity: data.IIdentity; + }; + response: { + settings: data.IPlatformSettings; + }; +} + +export interface IReq_UpdatePlatformSettings extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdatePlatformSettings + > { + method: 'updatePlatformSettings'; + request: { + identity: data.IIdentity; + auth?: Partial; + }; + response: { + settings: data.IPlatformSettings; + }; +} diff --git a/ts_interfaces/requests/audit.ts b/ts_interfaces/requests/audit.ts new file mode 100644 index 0000000..2811abf --- /dev/null +++ b/ts_interfaces/requests/audit.ts @@ -0,0 +1,33 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Audit Requests +// ============================================================================ + +export interface IReq_QueryAudit extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_QueryAudit + > { + method: 'queryAudit'; + request: { + identity: data.IIdentity; + organizationId?: string; + repositoryId?: string; + resourceType?: data.TAuditResourceType; + actions?: data.TAuditAction[]; + success?: boolean; + startDate?: string; + endDate?: string; + actorId?: string; + limit?: number; + offset?: number; + }; + response: { + logs: data.IAuditEntry[]; + total: number; + limit: number; + offset: number; + }; +} diff --git a/ts_interfaces/requests/auth.ts b/ts_interfaces/requests/auth.ts new file mode 100644 index 0000000..7d333d0 --- /dev/null +++ b/ts_interfaces/requests/auth.ts @@ -0,0 +1,82 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Auth Requests +// ============================================================================ + +export interface IReq_Login extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_Login + > { + method: 'login'; + request: { + email: string; + password: string; + }; + response: { + identity?: data.IIdentity; + user?: data.IUser; + errorCode?: string; + errorMessage?: string; + }; +} + +export interface IReq_RefreshToken extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_RefreshToken + > { + method: 'refreshToken'; + request: { + identity: data.IIdentity; + }; + response: { + identity: data.IIdentity; + }; +} + +export interface IReq_Logout extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_Logout + > { + method: 'logout'; + request: { + identity: data.IIdentity; + sessionId?: string; + all?: boolean; + }; + response: { + message: string; + }; +} + +export interface IReq_GetMe extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetMe + > { + method: 'getMe'; + request: { + identity: data.IIdentity; + }; + response: { + user: data.IUser; + }; +} + +export interface IReq_GetAuthProviders extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetAuthProviders + > { + method: 'getAuthProviders'; + request: {}; + response: { + providers: data.IPublicAuthProvider[]; + localAuthEnabled: boolean; + defaultProviderId?: string; + }; +} diff --git a/ts_interfaces/requests/index.ts b/ts_interfaces/requests/index.ts new file mode 100644 index 0000000..7d049c5 --- /dev/null +++ b/ts_interfaces/requests/index.ts @@ -0,0 +1,9 @@ +export * from './auth.ts'; +export * from './oauth.ts'; +export * from './organizations.ts'; +export * from './repositories.ts'; +export * from './packages.ts'; +export * from './tokens.ts'; +export * from './audit.ts'; +export * from './admin.ts'; +export * from './users.ts'; diff --git a/ts_interfaces/requests/oauth.ts b/ts_interfaces/requests/oauth.ts new file mode 100644 index 0000000..7cc5d2b --- /dev/null +++ b/ts_interfaces/requests/oauth.ts @@ -0,0 +1,61 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// OAuth / External Auth Requests +// ============================================================================ + +export interface IReq_OAuthAuthorize extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_OAuthAuthorize + > { + method: 'oauthAuthorize'; + request: { + providerId: string; + returnUrl?: string; + }; + response: { + redirectUrl: string; + }; +} + +export interface IReq_OAuthCallback extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_OAuthCallback + > { + method: 'oauthCallback'; + request: { + providerId: string; + code: string; + state: string; + }; + response: { + identity?: data.IIdentity; + user?: data.IUser; + isNewUser?: boolean; + errorCode?: string; + errorMessage?: string; + }; +} + +export interface IReq_LdapLogin extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_LdapLogin + > { + method: 'ldapLogin'; + request: { + providerId: string; + username: string; + password: string; + }; + response: { + identity?: data.IIdentity; + user?: data.IUser; + isNewUser?: boolean; + errorCode?: string; + errorMessage?: string; + }; +} diff --git a/ts_interfaces/requests/organizations.ts b/ts_interfaces/requests/organizations.ts new file mode 100644 index 0000000..03fcc73 --- /dev/null +++ b/ts_interfaces/requests/organizations.ts @@ -0,0 +1,161 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Organization Requests +// ============================================================================ + +export interface IReq_GetOrganizations extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetOrganizations + > { + method: 'getOrganizations'; + request: { + identity: data.IIdentity; + }; + response: { + organizations: data.IOrganization[]; + }; +} + +export interface IReq_GetOrganization extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetOrganization + > { + method: 'getOrganization'; + request: { + identity: data.IIdentity; + organizationId: string; + }; + response: { + organization: data.IOrganizationDetail; + }; +} + +export interface IReq_CreateOrganization extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_CreateOrganization + > { + method: 'createOrganization'; + request: { + identity: data.IIdentity; + name: string; + displayName?: string; + description?: string; + isPublic?: boolean; + }; + response: { + organization: data.IOrganization; + }; +} + +export interface IReq_UpdateOrganization extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdateOrganization + > { + method: 'updateOrganization'; + request: { + identity: data.IIdentity; + organizationId: string; + displayName?: string; + description?: string; + avatarUrl?: string; + website?: string; + isPublic?: boolean; + settings?: Partial; + }; + response: { + organization: data.IOrganization; + }; +} + +export interface IReq_DeleteOrganization extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeleteOrganization + > { + method: 'deleteOrganization'; + request: { + identity: data.IIdentity; + organizationId: string; + }; + response: { + message: string; + }; +} + +export interface IReq_GetOrganizationMembers extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetOrganizationMembers + > { + method: 'getOrganizationMembers'; + request: { + identity: data.IIdentity; + organizationId: string; + }; + response: { + members: data.IOrganizationMember[]; + }; +} + +export interface IReq_AddOrganizationMember extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_AddOrganizationMember + > { + method: 'addOrganizationMember'; + request: { + identity: data.IIdentity; + organizationId: string; + userId: string; + role: data.TOrganizationRole; + }; + response: { + member: { + userId: string; + role: data.TOrganizationRole; + addedAt: string; + }; + }; +} + +export interface IReq_UpdateOrganizationMember extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdateOrganizationMember + > { + method: 'updateOrganizationMember'; + request: { + identity: data.IIdentity; + organizationId: string; + userId: string; + role: data.TOrganizationRole; + }; + response: { + member: { + userId: string; + role: data.TOrganizationRole; + }; + }; +} + +export interface IReq_RemoveOrganizationMember extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_RemoveOrganizationMember + > { + method: 'removeOrganizationMember'; + request: { + identity: data.IIdentity; + organizationId: string; + userId: string; + }; + response: { + message: string; + }; +} diff --git a/ts_interfaces/requests/packages.ts b/ts_interfaces/requests/packages.ts new file mode 100644 index 0000000..1e4b8fc --- /dev/null +++ b/ts_interfaces/requests/packages.ts @@ -0,0 +1,92 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Package Requests +// ============================================================================ + +export interface IReq_SearchPackages extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_SearchPackages + > { + method: 'searchPackages'; + request: { + identity?: data.IIdentity; + query?: string; + protocol?: data.TRegistryProtocol; + organizationId?: string; + limit?: number; + offset?: number; + }; + response: { + packages: data.IPackage[]; + total: number; + limit: number; + offset: number; + }; +} + +export interface IReq_GetPackage extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetPackage + > { + method: 'getPackage'; + request: { + identity?: data.IIdentity; + packageId: string; + }; + response: { + package: data.IPackageDetail; + }; +} + +export interface IReq_GetPackageVersions extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetPackageVersions + > { + method: 'getPackageVersions'; + request: { + identity?: data.IIdentity; + packageId: string; + }; + response: { + packageId: string; + packageName: string; + distTags: Record; + versions: data.IPackageVersion[]; + }; +} + +export interface IReq_DeletePackage extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeletePackage + > { + method: 'deletePackage'; + request: { + identity: data.IIdentity; + packageId: string; + }; + response: { + message: string; + }; +} + +export interface IReq_DeletePackageVersion extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeletePackageVersion + > { + method: 'deletePackageVersion'; + request: { + identity: data.IIdentity; + packageId: string; + version: string; + }; + response: { + message: string; + }; +} diff --git a/ts_interfaces/requests/repositories.ts b/ts_interfaces/requests/repositories.ts new file mode 100644 index 0000000..add49d3 --- /dev/null +++ b/ts_interfaces/requests/repositories.ts @@ -0,0 +1,87 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Repository Requests +// ============================================================================ + +export interface IReq_GetRepositories extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetRepositories + > { + method: 'getRepositories'; + request: { + identity: data.IIdentity; + organizationId: string; + }; + response: { + repositories: data.IRepository[]; + }; +} + +export interface IReq_GetRepository extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetRepository + > { + method: 'getRepository'; + request: { + identity: data.IIdentity; + repositoryId: string; + }; + response: { + repository: data.IRepository; + }; +} + +export interface IReq_CreateRepository extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_CreateRepository + > { + method: 'createRepository'; + request: { + identity: data.IIdentity; + organizationId: string; + name: string; + description?: string; + protocol?: data.TRegistryProtocol; + visibility?: data.TRepositoryVisibility; + }; + response: { + repository: data.IRepository; + }; +} + +export interface IReq_UpdateRepository extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdateRepository + > { + method: 'updateRepository'; + request: { + identity: data.IIdentity; + repositoryId: string; + description?: string; + visibility?: data.TRepositoryVisibility; + }; + response: { + repository: data.IRepository; + }; +} + +export interface IReq_DeleteRepository extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeleteRepository + > { + method: 'deleteRepository'; + request: { + identity: data.IIdentity; + repositoryId: string; + }; + response: { + message: string; + }; +} diff --git a/ts_interfaces/requests/tokens.ts b/ts_interfaces/requests/tokens.ts new file mode 100644 index 0000000..1c706e6 --- /dev/null +++ b/ts_interfaces/requests/tokens.ts @@ -0,0 +1,55 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// Token Requests +// ============================================================================ + +export interface IReq_GetTokens extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetTokens + > { + method: 'getTokens'; + request: { + identity: data.IIdentity; + organizationId?: string; + }; + response: { + tokens: data.IToken[]; + }; +} + +export interface IReq_CreateToken extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_CreateToken + > { + method: 'createToken'; + request: { + identity: data.IIdentity; + name: string; + organizationId?: string; + protocols: data.TRegistryProtocol[]; + scopes: data.ITokenScope[]; + expiresInDays?: number; + }; + response: { + token: data.ITokenCreateResult; + }; +} + +export interface IReq_RevokeToken extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_RevokeToken + > { + method: 'revokeToken'; + request: { + identity: data.IIdentity; + tokenId: string; + }; + response: { + message: string; + }; +} diff --git a/ts_interfaces/requests/users.ts b/ts_interfaces/requests/users.ts new file mode 100644 index 0000000..4e35d91 --- /dev/null +++ b/ts_interfaces/requests/users.ts @@ -0,0 +1,115 @@ +import * as plugins from '../plugins.ts'; +import * as data from '../data/index.ts'; + +// ============================================================================ +// User Requests +// ============================================================================ + +export interface IReq_GetUsers extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetUsers + > { + method: 'getUsers'; + request: { + identity: data.IIdentity; + }; + response: { + users: data.IUser[]; + }; +} + +export interface IReq_GetUser extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetUser + > { + method: 'getUser'; + request: { + identity: data.IIdentity; + userId: string; + }; + response: { + user: data.IUser; + }; +} + +export interface IReq_UpdateUser extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_UpdateUser + > { + method: 'updateUser'; + request: { + identity: data.IIdentity; + userId: string; + displayName?: string; + avatarUrl?: string; + password?: string; + isActive?: boolean; + isSystemAdmin?: boolean; + }; + response: { + user: data.IUser; + }; +} + +export interface IReq_GetUserSessions extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_GetUserSessions + > { + method: 'getUserSessions'; + request: { + identity: data.IIdentity; + }; + response: { + sessions: data.ISession[]; + }; +} + +export interface IReq_RevokeSession extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_RevokeSession + > { + method: 'revokeSession'; + request: { + identity: data.IIdentity; + sessionId: string; + }; + response: { + message: string; + }; +} + +export interface IReq_ChangePassword extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_ChangePassword + > { + method: 'changePassword'; + request: { + identity: data.IIdentity; + currentPassword: string; + newPassword: string; + }; + response: { + message: string; + }; +} + +export interface IReq_DeleteAccount extends + plugins.typedrequestInterfaces.implementsTR< + plugins.typedrequestInterfaces.ITypedRequest, + IReq_DeleteAccount + > { + method: 'deleteAccount'; + request: { + identity: data.IIdentity; + password: string; + }; + response: { + message: string; + }; +} diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts new file mode 100644 index 0000000..5b61d36 --- /dev/null +++ b/ts_web/00_commitinfo_data.ts @@ -0,0 +1,8 @@ +/** + * autocreated commitinfo by @push.rocks/commitinfo + */ +export const commitinfo = { + name: '@stack.gallery/registry', + version: '1.5.0', + description: 'Enterprise-grade multi-protocol package registry' +} diff --git a/ts_web/appstate.ts b/ts_web/appstate.ts new file mode 100644 index 0000000..0b482fe --- /dev/null +++ b/ts_web/appstate.ts @@ -0,0 +1,663 @@ +import * as plugins from './plugins.js'; +import * as interfaces from '../ts_interfaces/index.js'; + +// ============================================================================ +// Smartstate instance +// ============================================================================ +export const appState = new plugins.domtools.plugins.smartstate.Smartstate(); + +// ============================================================================ +// State Part Interfaces +// ============================================================================ + +export interface ILoginState { + identity: interfaces.data.IIdentity | null; + isLoggedIn: boolean; +} + +export interface IOrganizationsState { + organizations: interfaces.data.IOrganization[]; + currentOrg: interfaces.data.IOrganizationDetail | null; + repositories: interfaces.data.IRepository[]; + members: interfaces.data.IOrganizationMember[]; +} + +export interface IPackagesState { + packages: interfaces.data.IPackage[]; + currentPackage: interfaces.data.IPackageDetail | null; + versions: interfaces.data.IPackageVersion[]; + total: number; + query: string; + protocolFilter: string; +} + +export interface ITokensState { + tokens: interfaces.data.IToken[]; +} + +export interface ISettingsState { + user: interfaces.data.IUser | null; + sessions: interfaces.data.ISession[]; +} + +export interface IAdminState { + providers: interfaces.data.IAuthProvider[]; + platformSettings: interfaces.data.IPlatformSettings | null; +} + +export interface IUiState { + activeView: string; + activeEntityId?: string; +} + +// ============================================================================ +// State Parts +// ============================================================================ + +export const loginStatePart = await appState.getStatePart( + 'login', + { + identity: null, + isLoggedIn: false, + }, + 'persistent', +); + +export const organizationsStatePart = await appState.getStatePart( + 'organizations', + { + organizations: [], + currentOrg: null, + repositories: [], + members: [], + }, + 'soft', +); + +export const packagesStatePart = await appState.getStatePart( + 'packages', + { + packages: [], + currentPackage: null, + versions: [], + total: 0, + query: '', + protocolFilter: '', + }, + 'soft', +); + +export const tokensStatePart = await appState.getStatePart( + 'tokens', + { tokens: [] }, + 'soft', +); + +export const settingsStatePart = await appState.getStatePart( + 'settings', + { user: null, sessions: [] }, + 'soft', +); + +export const adminStatePart = await appState.getStatePart( + 'admin', + { providers: [], platformSettings: null }, + 'soft', +); + +export const uiStatePart = await appState.getStatePart( + 'ui', + { activeView: 'dashboard' }, +); + +// ============================================================================ +// Helpers +// ============================================================================ + +const getActionContext = () => ({ + identity: loginStatePart.getState().identity, +}); + +function createTypedRequest( + method: string, +) { + return new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', method); +} + +// ============================================================================ +// Auth Actions +// ============================================================================ + +export const loginAction = loginStatePart.createAction<{ + email: string; + password: string; +}>(async (statePartArg, dataArg) => { + try { + const typedRequest = createTypedRequest('login'); + const response = await typedRequest.fire({ + email: dataArg.email, + password: dataArg.password, + }); + if (response.identity) { + return { identity: response.identity, isLoggedIn: true }; + } + return { identity: null, isLoggedIn: false }; + } catch (err) { + console.error('Login failed:', err); + return { identity: null, isLoggedIn: false }; + } +}); + +export const logoutAction = loginStatePart.createAction(async () => { + const context = getActionContext(); + if (context.identity) { + try { + const typedRequest = createTypedRequest('logout'); + await typedRequest.fire({ identity: context.identity }); + } catch { + // Ignore logout errors + } + } + return { identity: null, isLoggedIn: false }; +}); + +export const refreshTokenAction = loginStatePart.createAction(async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('refreshToken'); + const response = await typedRequest.fire({ identity: context.identity }); + return { identity: response.identity, isLoggedIn: true }; + } catch { + return { identity: null, isLoggedIn: false }; + } +}); + +export const fetchMeAction = settingsStatePart.createAction(async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('getMe'); + const response = await typedRequest.fire({ identity: context.identity }); + return { ...statePartArg.getState(), user: response.user }; + } catch { + return statePartArg.getState(); + } +}); + +// Handle OAuth callback tokens +export function handleOAuthCallback( + accessToken: string, + refreshToken: string, + sessionId: string, +) { + // Build a minimal identity from the callback tokens + // The full identity will be populated when getMe is called + loginStatePart.setState({ + identity: { + jwt: accessToken, + refreshJwt: refreshToken, + userId: '', + email: '', + username: '', + displayName: '', + isSystemAdmin: false, + expiresAt: Date.now() + 900000, + sessionId, + }, + isLoggedIn: true, + }); +} + +// ============================================================================ +// Organization Actions +// ============================================================================ + +export const fetchOrganizationsAction = organizationsStatePart.createAction( + async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getOrganizations', + ); + const response = await typedRequest.fire({ identity: context.identity }); + return { ...statePartArg.getState(), organizations: response.organizations }; + } catch { + return statePartArg.getState(); + } + }, +); + +export const fetchOrganizationAction = organizationsStatePart.createAction<{ + organizationId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getOrganization', + ); + const response = await typedRequest.fire({ + identity: context.identity, + organizationId: dataArg.organizationId, + }); + return { ...statePartArg.getState(), currentOrg: response.organization }; + } catch { + return statePartArg.getState(); + } +}); + +export const createOrganizationAction = organizationsStatePart.createAction<{ + name: string; + displayName?: string; + description?: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'createOrganization', + ); + await typedRequest.fire({ + identity: context.identity, + name: dataArg.name, + displayName: dataArg.displayName, + description: dataArg.description, + }); + // Re-fetch list + const listReq = createTypedRequest( + 'getOrganizations', + ); + const listResp = await listReq.fire({ identity: context.identity }); + return { ...statePartArg.getState(), organizations: listResp.organizations }; + } catch { + return statePartArg.getState(); + } +}); + +export const deleteOrganizationAction = organizationsStatePart.createAction<{ + organizationId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'deleteOrganization', + ); + await typedRequest.fire({ + identity: context.identity, + organizationId: dataArg.organizationId, + }); + const listReq = createTypedRequest( + 'getOrganizations', + ); + const listResp = await listReq.fire({ identity: context.identity }); + return { + ...statePartArg.getState(), + organizations: listResp.organizations, + currentOrg: null, + }; + } catch { + return statePartArg.getState(); + } +}); + +export const fetchRepositoriesAction = organizationsStatePart.createAction<{ + organizationId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getRepositories', + ); + const response = await typedRequest.fire({ + identity: context.identity, + organizationId: dataArg.organizationId, + }); + return { ...statePartArg.getState(), repositories: response.repositories }; + } catch { + return statePartArg.getState(); + } +}); + +export const fetchMembersAction = organizationsStatePart.createAction<{ + organizationId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getOrganizationMembers', + ); + const response = await typedRequest.fire({ + identity: context.identity, + organizationId: dataArg.organizationId, + }); + return { ...statePartArg.getState(), members: response.members }; + } catch { + return statePartArg.getState(); + } +}); + +// ============================================================================ +// Package Actions +// ============================================================================ + +export const searchPackagesAction = packagesStatePart.createAction<{ + query?: string; + protocol?: string; + offset?: number; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + try { + const typedRequest = createTypedRequest( + 'searchPackages', + ); + const response = await typedRequest.fire({ + identity: context.identity || undefined, + query: dataArg.query, + protocol: dataArg.protocol as interfaces.data.TRegistryProtocol | undefined, + offset: dataArg.offset, + limit: 50, + }); + return { + ...statePartArg.getState(), + packages: response.packages, + total: response.total, + query: dataArg.query || '', + protocolFilter: dataArg.protocol || '', + }; + } catch { + return statePartArg.getState(); + } +}); + +export const fetchPackageAction = packagesStatePart.createAction<{ + packageId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + try { + const typedRequest = createTypedRequest('getPackage'); + const response = await typedRequest.fire({ + identity: context.identity || undefined, + packageId: dataArg.packageId, + }); + return { ...statePartArg.getState(), currentPackage: response.package }; + } catch { + return statePartArg.getState(); + } +}); + +export const fetchPackageVersionsAction = packagesStatePart.createAction<{ + packageId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + try { + const typedRequest = createTypedRequest( + 'getPackageVersions', + ); + const response = await typedRequest.fire({ + identity: context.identity || undefined, + packageId: dataArg.packageId, + }); + return { ...statePartArg.getState(), versions: response.versions }; + } catch { + return statePartArg.getState(); + } +}); + +export const deletePackageAction = packagesStatePart.createAction<{ + packageId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'deletePackage', + ); + await typedRequest.fire({ identity: context.identity, packageId: dataArg.packageId }); + return { ...statePartArg.getState(), currentPackage: null }; + } catch { + return statePartArg.getState(); + } +}); + +// ============================================================================ +// Token Actions +// ============================================================================ + +export const fetchTokensAction = tokensStatePart.createAction<{ + organizationId?: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('getTokens'); + const response = await typedRequest.fire({ + identity: context.identity, + organizationId: dataArg?.organizationId, + }); + return { tokens: response.tokens }; + } catch { + return statePartArg.getState(); + } +}); + +export const createTokenAction = tokensStatePart.createAction<{ + name: string; + protocols: interfaces.data.TRegistryProtocol[]; + scopes: interfaces.data.ITokenScope[]; + organizationId?: string; + expiresInDays?: number; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('createToken'); + await typedRequest.fire({ + identity: context.identity, + ...dataArg, + }); + // Re-fetch + const listReq = createTypedRequest('getTokens'); + const listResp = await listReq.fire({ identity: context.identity }); + return { tokens: listResp.tokens }; + } catch { + return statePartArg.getState(); + } +}); + +export const revokeTokenAction = tokensStatePart.createAction<{ + tokenId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('revokeToken'); + await typedRequest.fire({ + identity: context.identity, + tokenId: dataArg.tokenId, + }); + const listReq = createTypedRequest('getTokens'); + const listResp = await listReq.fire({ identity: context.identity }); + return { tokens: listResp.tokens }; + } catch { + return statePartArg.getState(); + } +}); + +// ============================================================================ +// Settings Actions +// ============================================================================ + +export const fetchUserSessionsAction = settingsStatePart.createAction(async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getUserSessions', + ); + const response = await typedRequest.fire({ identity: context.identity }); + return { ...statePartArg.getState(), sessions: response.sessions }; + } catch { + return statePartArg.getState(); + } +}); + +export const changePasswordAction = settingsStatePart.createAction<{ + currentPassword: string; + newPassword: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + const typedRequest = createTypedRequest( + 'changePassword', + ); + await typedRequest.fire({ + identity: context.identity, + currentPassword: dataArg.currentPassword, + newPassword: dataArg.newPassword, + }); + return statePartArg.getState(); +}); + +export const updateProfileAction = settingsStatePart.createAction<{ + displayName?: string; + avatarUrl?: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest('updateUser'); + const response = await typedRequest.fire({ + identity: context.identity, + userId: context.identity.userId, + ...dataArg, + }); + return { ...statePartArg.getState(), user: response.user }; + } catch { + return statePartArg.getState(); + } +}); + +export const revokeSessionAction = settingsStatePart.createAction<{ + sessionId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'revokeSession', + ); + await typedRequest.fire({ + identity: context.identity, + sessionId: dataArg.sessionId, + }); + // Re-fetch sessions + const listReq = createTypedRequest('getUserSessions'); + const listResp = await listReq.fire({ identity: context.identity }); + return { ...statePartArg.getState(), sessions: listResp.sessions }; + } catch { + return statePartArg.getState(); + } +}); + +// ============================================================================ +// Admin Actions +// ============================================================================ + +export const fetchAdminProvidersAction = adminStatePart.createAction(async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getAdminProviders', + ); + const response = await typedRequest.fire({ identity: context.identity }); + return { ...statePartArg.getState(), providers: response.providers }; + } catch { + return statePartArg.getState(); + } +}); + +export const fetchPlatformSettingsAction = adminStatePart.createAction(async (statePartArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'getPlatformSettings', + ); + const response = await typedRequest.fire({ identity: context.identity }); + return { ...statePartArg.getState(), platformSettings: response.settings }; + } catch { + return statePartArg.getState(); + } +}); + +export const updatePlatformSettingsAction = adminStatePart.createAction<{ + auth?: Partial; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'updatePlatformSettings', + ); + const response = await typedRequest.fire({ + identity: context.identity, + auth: dataArg.auth, + }); + return { ...statePartArg.getState(), platformSettings: response.settings }; + } catch { + return statePartArg.getState(); + } +}); + +export const deleteAdminProviderAction = adminStatePart.createAction<{ + providerId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'deleteAdminProvider', + ); + await typedRequest.fire({ + identity: context.identity, + providerId: dataArg.providerId, + }); + const listReq = createTypedRequest( + 'getAdminProviders', + ); + const listResp = await listReq.fire({ identity: context.identity }); + return { ...statePartArg.getState(), providers: listResp.providers }; + } catch { + return statePartArg.getState(); + } +}); + +export const testAdminProviderAction = adminStatePart.createAction<{ + providerId: string; +}>(async (statePartArg, dataArg) => { + const context = getActionContext(); + if (!context.identity) return statePartArg.getState(); + try { + const typedRequest = createTypedRequest( + 'testAdminProvider', + ); + await typedRequest.fire({ + identity: context.identity, + providerId: dataArg.providerId, + }); + // Re-fetch to get updated test results + const listReq = createTypedRequest( + 'getAdminProviders', + ); + const listResp = await listReq.fire({ identity: context.identity }); + return { ...statePartArg.getState(), providers: listResp.providers }; + } catch { + return statePartArg.getState(); + } +}); diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts new file mode 100644 index 0000000..8f00b64 --- /dev/null +++ b/ts_web/elements/index.ts @@ -0,0 +1,8 @@ +export * from './shared/index.js'; +export * from './sg-app-shell.js'; +export * from './sg-view-dashboard.js'; +export * from './sg-view-organizations.js'; +export * from './sg-view-packages.js'; +export * from './sg-view-tokens.js'; +export * from './sg-view-settings.js'; +export * from './sg-view-admin.js'; diff --git a/ts_web/elements/sg-app-shell.ts b/ts_web/elements/sg-app-shell.ts new file mode 100644 index 0000000..674738f --- /dev/null +++ b/ts_web/elements/sg-app-shell.ts @@ -0,0 +1,289 @@ +import * as plugins from '../plugins.js'; +import * as appstate from '../appstate.js'; +import * as interfaces from '../../ts_interfaces/index.js'; +import { appRouter } from '../router.js'; +import { + DeesElement, + customElement, + html, + state, + css, + cssManager, + type TemplateResult, +} from '@design.estate/dees-element'; + +import type { SgViewDashboard } from './sg-view-dashboard.js'; +import type { SgViewOrganizations } from './sg-view-organizations.js'; +import type { SgViewPackages } from './sg-view-packages.js'; +import type { SgViewTokens } from './sg-view-tokens.js'; +import type { SgViewSettings } from './sg-view-settings.js'; +import type { SgViewAdmin } from './sg-view-admin.js'; + +@customElement('sg-app-shell') +export class SgAppShell extends DeesElement { + @state() + accessor loginState: appstate.ILoginState = { identity: null, isLoggedIn: false }; + + @state() + accessor uiState: appstate.IUiState = { activeView: 'dashboard' }; + + @state() + accessor loginLoading: boolean = false; + + @state() + accessor loginError: string = ''; + + @state() + accessor authProviders: interfaces.data.IPublicAuthProvider[] = []; + + @state() + accessor localAuthEnabled: boolean = true; + + private viewTabs = [ + { + name: 'Dashboard', + iconName: 'lucide:layoutDashboard', + element: (async () => (await import('./sg-view-dashboard.js')).SgViewDashboard)(), + }, + { + name: 'Organizations', + iconName: 'lucide:building2', + element: (async () => (await import('./sg-view-organizations.js')).SgViewOrganizations)(), + }, + { + name: 'Packages', + iconName: 'lucide:package', + element: (async () => (await import('./sg-view-packages.js')).SgViewPackages)(), + }, + { + name: 'Tokens', + iconName: 'lucide:key', + element: (async () => (await import('./sg-view-tokens.js')).SgViewTokens)(), + }, + { + name: 'Settings', + iconName: 'lucide:settings', + element: (async () => (await import('./sg-view-settings.js')).SgViewSettings)(), + }, + { + name: 'Admin', + iconName: 'lucide:shield', + element: (async () => (await import('./sg-view-admin.js')).SgViewAdmin)(), + }, + ]; + + private resolvedViewTabs: Array<{ name: string; iconName?: string; element: any }> = []; + + constructor() { + super(); + document.title = 'Stack.Gallery Registry'; + + // Make appRouter globally accessible for view elements + (globalThis as any).__sgAppRouter = appRouter; + + const loginSubscription = appstate.loginStatePart + .select((s) => s) + .subscribe((loginState) => { + this.loginState = loginState; + }); + this.rxSubscriptions.push(loginSubscription); + + const uiSubscription = appstate.uiStatePart + .select((s) => s) + .subscribe((uiState) => { + this.uiState = uiState; + this.syncAppdashView(uiState.activeView); + }); + this.rxSubscriptions.push(uiSubscription); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + } + .maincontainer { + width: 100%; + height: 100vh; + } + `, + ]; + + public render(): TemplateResult { + if (!this.loginState.isLoggedIn) { + return html` +
+ this.handleLocalLogin(e)} + @oauth-login=${(e: CustomEvent) => this.handleOAuthLogin(e)} + @ldap-login=${(e: CustomEvent) => this.handleLdapLogin(e)} + > +
+ `; + } + + return html` +
+ t.name.toLowerCase().replace(/\s+/g, '-') === this.uiState.activeView, + ) || this.resolvedViewTabs[0]} + > + +
+ `; + } + + public async firstUpdated() { + // Fetch auth providers for login page + this.fetchAuthProviders(); + + // Resolve async view tab imports + const allTabs = await Promise.all( + this.viewTabs.map(async (tab) => ({ + name: tab.name, + iconName: tab.iconName, + element: await tab.element, + })), + ); + + // Filter admin tab based on user role + this.resolvedViewTabs = this.loginState.identity?.isSystemAdmin + ? allTabs + : allTabs.filter((t) => t.name !== 'Admin'); + + this.requestUpdate(); + await this.updateComplete; + + const appDash = this.shadowRoot!.querySelector('dees-simple-appdash') as any; + if (appDash) { + appDash.addEventListener('view-select', (e: CustomEvent) => { + const viewName = e.detail.view.name.toLowerCase().replace(/\s+/g, '-'); + appRouter.navigateToView(viewName); + }); + appDash.addEventListener('logout', async () => { + await appstate.loginStatePart.dispatchAction(appstate.logoutAction, null); + }); + + // Load initial view + if (this.resolvedViewTabs.length > 0) { + const currentActiveView = appstate.uiStatePart.getState().activeView; + const initialView = this.resolvedViewTabs.find( + (t) => t.name.toLowerCase().replace(/\s+/g, '-') === currentActiveView, + ) || this.resolvedViewTabs[0]; + await appDash.loadView(initialView); + } + } + + // Check for stored session + const loginState = appstate.loginStatePart.getState(); + if (loginState.identity?.jwt) { + if (loginState.identity.expiresAt > Date.now()) { + // Validate token with server in the background + try { + await appstate.settingsStatePart.dispatchAction(appstate.fetchMeAction, null); + } catch { + console.warn('Stored session invalid, returning to login'); + await appstate.loginStatePart.dispatchAction(appstate.logoutAction, null); + } + } else { + // Token expired, try refresh + const newState = await appstate.loginStatePart.dispatchAction( + appstate.refreshTokenAction, null, + ); + if (!newState.isLoggedIn) { + // Refresh failed + await appstate.loginStatePart.dispatchAction(appstate.logoutAction, null); + } + } + } + } + + private async fetchAuthProviders() { + try { + const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest< + interfaces.requests.IReq_GetAuthProviders + >('/typedrequest', 'getAuthProviders'); + const response = await typedRequest.fire({}); + this.authProviders = response.providers; + this.localAuthEnabled = response.localAuthEnabled; + } catch { + // Default to local auth if we can't fetch providers + this.localAuthEnabled = true; + } + } + + private async handleLocalLogin(e: CustomEvent) { + const { email, password } = e.detail; + this.loginLoading = true; + this.loginError = ''; + try { + const newState = await appstate.loginStatePart.dispatchAction(appstate.loginAction, { + email, + password, + }); + if (!newState.isLoggedIn) { + this.loginError = 'Invalid email or password'; + } + } catch { + this.loginError = 'Login failed. Please try again.'; + } + this.loginLoading = false; + } + + private async handleOAuthLogin(e: CustomEvent) { + const { providerId } = e.detail; + try { + const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest< + interfaces.requests.IReq_OAuthAuthorize + >('/typedrequest', 'oauthAuthorize'); + const response = await typedRequest.fire({ providerId }); + // Redirect to OAuth provider + window.location.href = response.redirectUrl; + } catch { + this.loginError = 'OAuth login failed. Please try again.'; + } + } + + private async handleLdapLogin(e: CustomEvent) { + const { providerId, username, password } = e.detail; + this.loginLoading = true; + this.loginError = ''; + try { + const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest< + interfaces.requests.IReq_LdapLogin + >('/typedrequest', 'ldapLogin'); + const response = await typedRequest.fire({ providerId, username, password }); + if (response.identity) { + appstate.loginStatePart.setState({ + identity: response.identity, + isLoggedIn: true, + }); + } else { + this.loginError = response.errorMessage || 'LDAP login failed'; + } + } catch { + this.loginError = 'LDAP login failed. Please try again.'; + } + this.loginLoading = false; + } + + private syncAppdashView(viewName: string): void { + const appDash = this.shadowRoot?.querySelector('dees-simple-appdash') as any; + if (!appDash || this.resolvedViewTabs.length === 0) return; + const targetTab = this.resolvedViewTabs.find( + (t) => t.name.toLowerCase().replace(/\s+/g, '-') === viewName, + ); + if (!targetTab) return; + appDash.loadView(targetTab); + } +} diff --git a/ts_web/elements/sg-view-admin.ts b/ts_web/elements/sg-view-admin.ts new file mode 100644 index 0000000..1e03692 --- /dev/null +++ b/ts_web/elements/sg-view-admin.ts @@ -0,0 +1,100 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-admin') +export class SgViewAdmin extends DeesElement { + @state() + accessor adminState: appstate.IAdminState = { providers: [], platformSettings: null }; + + @state() + accessor editingProviderId: string | null = null; + + constructor() { + super(); + const sub = appstate.adminStatePart + .select((s) => s) + .subscribe((s) => { + this.adminState = s; + }); + this.rxSubscriptions.push(sub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + await appstate.adminStatePart.dispatchAction(appstate.fetchAdminProvidersAction, null); + await appstate.adminStatePart.dispatchAction(appstate.fetchPlatformSettingsAction, null); + } + + public render(): TemplateResult { + if (this.editingProviderId !== null) { + const provider = this.editingProviderId + ? this.adminState.providers.find((p) => p.id === this.editingProviderId) || null + : null; + return html` + + `; + } + + return html` + + `; + } + + private async saveProvider(detail: any) { + // TODO: implement create/update provider + this.editingProviderId = null; + } + + private async deleteProvider(providerId: string) { + await appstate.adminStatePart.dispatchAction( + appstate.deleteAdminProviderAction, + { providerId }, + ); + } + + private async testProvider(providerId: string) { + await appstate.adminStatePart.dispatchAction( + appstate.testAdminProviderAction, + { providerId }, + ); + } + + private async saveSettings(settings: any) { + await appstate.adminStatePart.dispatchAction( + appstate.updatePlatformSettingsAction, + { auth: settings }, + ); + } +} diff --git a/ts_web/elements/sg-view-dashboard.ts b/ts_web/elements/sg-view-dashboard.ts new file mode 100644 index 0000000..ba328b9 --- /dev/null +++ b/ts_web/elements/sg-view-dashboard.ts @@ -0,0 +1,100 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-dashboard') +export class SgViewDashboard extends DeesElement { + @state() + accessor organizationsState: appstate.IOrganizationsState = { + organizations: [], + currentOrg: null, + repositories: [], + members: [], + }; + + @state() + accessor packagesState: appstate.IPackagesState = { + packages: [], + currentPackage: null, + versions: [], + total: 0, + query: '', + protocolFilter: '', + }; + + constructor() { + super(); + const orgSub = appstate.organizationsStatePart + .select((s) => s) + .subscribe((s) => { + this.organizationsState = s; + }); + this.rxSubscriptions.push(orgSub); + + const pkgSub = appstate.packagesStatePart + .select((s) => s) + .subscribe((s) => { + this.packagesState = s; + }); + this.rxSubscriptions.push(pkgSub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + await appstate.organizationsStatePart.dispatchAction(appstate.fetchOrganizationsAction, null); + await appstate.packagesStatePart.dispatchAction(appstate.searchPackagesAction, { offset: 0 }); + } + + public render(): TemplateResult { + return html` + + `; + } + + private handleNavigate(e: CustomEvent) { + const { type, id } = e.detail; + if (type === 'org' && id) { + const { appRouter } = await_import_router(); + appRouter.navigateToEntity('organizations', id); + } else if (type === 'package' && id) { + const { appRouter } = await_import_router(); + appRouter.navigateToEntity('packages', id); + } else if (type === 'packages') { + const { appRouter } = await_import_router(); + appRouter.navigateToView('packages'); + } else if (type === 'tokens') { + const { appRouter } = await_import_router(); + appRouter.navigateToView('tokens'); + } + } +} + +// Lazy import to avoid circular dependency +function await_import_router() { + // Dynamic import not needed here since router is a separate module + // We use a workaround by importing at the module level + return { appRouter: (globalThis as any).__sgAppRouter }; +} diff --git a/ts_web/elements/sg-view-organizations.ts b/ts_web/elements/sg-view-organizations.ts new file mode 100644 index 0000000..e1d7ad1 --- /dev/null +++ b/ts_web/elements/sg-view-organizations.ts @@ -0,0 +1,127 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-organizations') +export class SgViewOrganizations extends DeesElement { + @state() + accessor organizationsState: appstate.IOrganizationsState = { + organizations: [], + currentOrg: null, + repositories: [], + members: [], + }; + + @state() + accessor uiState: appstate.IUiState = { activeView: 'organizations' }; + + constructor() { + super(); + const orgSub = appstate.organizationsStatePart + .select((s) => s) + .subscribe((s) => { + this.organizationsState = s; + }); + this.rxSubscriptions.push(orgSub); + + const uiSub = appstate.uiStatePart + .select((s) => s) + .subscribe((s) => { + this.uiState = s; + }); + this.rxSubscriptions.push(uiSub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + await appstate.organizationsStatePart.dispatchAction(appstate.fetchOrganizationsAction, null); + // If there's an entity ID, load the detail + if (this.uiState.activeEntityId) { + await this.loadOrgDetail(this.uiState.activeEntityId); + } + } + + private async loadOrgDetail(orgId: string) { + await appstate.organizationsStatePart.dispatchAction( + appstate.fetchOrganizationAction, + { organizationId: orgId }, + ); + await appstate.organizationsStatePart.dispatchAction( + appstate.fetchRepositoriesAction, + { organizationId: orgId }, + ); + await appstate.organizationsStatePart.dispatchAction( + appstate.fetchMembersAction, + { organizationId: orgId }, + ); + } + + public render(): TemplateResult { + if (this.uiState.activeEntityId && this.organizationsState.currentOrg) { + return html` + + `; + } + + return html` + + `; + } + + private selectOrg(orgId: string) { + appstate.uiStatePart.setState({ + ...appstate.uiStatePart.getState(), + activeEntityId: orgId, + }); + this.loadOrgDetail(orgId); + } + + private selectRepo(repoId: string) { + // Navigate to repository within org context + // For now, we could switch to packages view + } + + private goBack() { + appstate.uiStatePart.setState({ + ...appstate.uiStatePart.getState(), + activeEntityId: undefined, + }); + appstate.organizationsStatePart.setState({ + ...appstate.organizationsStatePart.getState(), + currentOrg: null, + repositories: [], + members: [], + }); + } + + private async createOrg(data: { name: string; displayName?: string; description?: string }) { + await appstate.organizationsStatePart.dispatchAction( + appstate.createOrganizationAction, + data, + ); + } +} diff --git a/ts_web/elements/sg-view-packages.ts b/ts_web/elements/sg-view-packages.ts new file mode 100644 index 0000000..e7e3f16 --- /dev/null +++ b/ts_web/elements/sg-view-packages.ts @@ -0,0 +1,156 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-packages') +export class SgViewPackages extends DeesElement { + @state() + accessor packagesState: appstate.IPackagesState = { + packages: [], + currentPackage: null, + versions: [], + total: 0, + query: '', + protocolFilter: '', + }; + + @state() + accessor uiState: appstate.IUiState = { activeView: 'packages' }; + + constructor() { + super(); + const pkgSub = appstate.packagesStatePart + .select((s) => s) + .subscribe((s) => { + this.packagesState = s; + }); + this.rxSubscriptions.push(pkgSub); + + const uiSub = appstate.uiStatePart + .select((s) => s) + .subscribe((s) => { + this.uiState = s; + }); + this.rxSubscriptions.push(uiSub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + if (this.uiState.activeEntityId) { + await this.loadPackageDetail(this.uiState.activeEntityId); + } else { + await appstate.packagesStatePart.dispatchAction( + appstate.searchPackagesAction, + { offset: 0 }, + ); + } + } + + private async loadPackageDetail(packageId: string) { + await appstate.packagesStatePart.dispatchAction( + appstate.fetchPackageAction, + { packageId }, + ); + await appstate.packagesStatePart.dispatchAction( + appstate.fetchPackageVersionsAction, + { packageId }, + ); + } + + public render(): TemplateResult { + if (this.uiState.activeEntityId && this.packagesState.currentPackage) { + return html` + + `; + } + + return html` + + `; + } + + private selectPackage(packageId: string) { + appstate.uiStatePart.setState({ + ...appstate.uiStatePart.getState(), + activeEntityId: packageId, + }); + this.loadPackageDetail(packageId); + } + + private goBack() { + appstate.uiStatePart.setState({ + ...appstate.uiStatePart.getState(), + activeEntityId: undefined, + }); + appstate.packagesStatePart.setState({ + ...appstate.packagesStatePart.getState(), + currentPackage: null, + versions: [], + }); + } + + private async search(query: string) { + await appstate.packagesStatePart.dispatchAction( + appstate.searchPackagesAction, + { query, protocol: this.packagesState.protocolFilter, offset: 0 }, + ); + } + + private async filter(protocol: string) { + await appstate.packagesStatePart.dispatchAction( + appstate.searchPackagesAction, + { query: this.packagesState.query, protocol, offset: 0 }, + ); + } + + private async paginate(offset: number) { + await appstate.packagesStatePart.dispatchAction( + appstate.searchPackagesAction, + { + query: this.packagesState.query, + protocol: this.packagesState.protocolFilter, + offset, + }, + ); + } + + private async deletePackage(packageId: string) { + await appstate.packagesStatePart.dispatchAction( + appstate.deletePackageAction, + { packageId }, + ); + this.goBack(); + } + + private async deleteVersion(detail: { packageId: string; version: string }) { + // TODO: implement deletePackageVersion action + } +} diff --git a/ts_web/elements/sg-view-settings.ts b/ts_web/elements/sg-view-settings.ts new file mode 100644 index 0000000..3bfe38c --- /dev/null +++ b/ts_web/elements/sg-view-settings.ts @@ -0,0 +1,67 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-settings') +export class SgViewSettings extends DeesElement { + @state() + accessor settingsState: appstate.ISettingsState = { user: null, sessions: [] }; + + constructor() { + super(); + const sub = appstate.settingsStatePart + .select((s) => s) + .subscribe((s) => { + this.settingsState = s; + }); + this.rxSubscriptions.push(sub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + await appstate.settingsStatePart.dispatchAction(appstate.fetchMeAction, null); + await appstate.settingsStatePart.dispatchAction(appstate.fetchUserSessionsAction, null); + } + + public render(): TemplateResult { + return html` + + `; + } + + private async saveProfile(detail: { displayName?: string; avatarUrl?: string }) { + await appstate.settingsStatePart.dispatchAction(appstate.updateProfileAction, detail); + } + + private async changePassword(detail: { currentPassword: string; newPassword: string }) { + await appstate.settingsStatePart.dispatchAction(appstate.changePasswordAction, detail); + } + + private async revokeSession(sessionId: string) { + await appstate.settingsStatePart.dispatchAction(appstate.revokeSessionAction, { sessionId }); + } + + private async deleteAccount(password: string) { + // TODO: implement delete account action + } +} diff --git a/ts_web/elements/sg-view-tokens.ts b/ts_web/elements/sg-view-tokens.ts new file mode 100644 index 0000000..cc8cad4 --- /dev/null +++ b/ts_web/elements/sg-view-tokens.ts @@ -0,0 +1,72 @@ +import * as appstate from '../appstate.js'; +import * as shared from './shared/index.js'; +import { + css, + cssManager, + customElement, + DeesElement, + html, + state, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('sg-view-tokens') +export class SgViewTokens extends DeesElement { + @state() + accessor tokensState: appstate.ITokensState = { tokens: [] }; + + @state() + accessor organizationsState: appstate.IOrganizationsState = { + organizations: [], + currentOrg: null, + repositories: [], + members: [], + }; + + constructor() { + super(); + const tokenSub = appstate.tokensStatePart + .select((s) => s) + .subscribe((s) => { + this.tokensState = s; + }); + this.rxSubscriptions.push(tokenSub); + + const orgSub = appstate.organizationsStatePart + .select((s) => s) + .subscribe((s) => { + this.organizationsState = s; + }); + this.rxSubscriptions.push(orgSub); + } + + public static styles = [ + cssManager.defaultStyles, + shared.viewHostCss, + ]; + + async connectedCallback() { + super.connectedCallback(); + await appstate.tokensStatePart.dispatchAction(appstate.fetchTokensAction, {}); + await appstate.organizationsStatePart.dispatchAction(appstate.fetchOrganizationsAction, null); + } + + public render(): TemplateResult { + return html` + + `; + } + + private async createToken(detail: any) { + await appstate.tokensStatePart.dispatchAction(appstate.createTokenAction, detail); + } + + private async revokeToken(tokenId: string) { + await appstate.tokensStatePart.dispatchAction(appstate.revokeTokenAction, { tokenId }); + } +} diff --git a/ts_web/elements/shared/css.ts b/ts_web/elements/shared/css.ts new file mode 100644 index 0000000..54e6227 --- /dev/null +++ b/ts_web/elements/shared/css.ts @@ -0,0 +1,12 @@ +import { css } from '@design.estate/dees-element'; + +export const viewHostCss = css` + :host { + display: block; + width: 100%; + height: 100%; + overflow-y: auto; + padding: 24px; + box-sizing: border-box; + } +`; diff --git a/ts_web/elements/shared/index.ts b/ts_web/elements/shared/index.ts new file mode 100644 index 0000000..70d7106 --- /dev/null +++ b/ts_web/elements/shared/index.ts @@ -0,0 +1,2 @@ +export * from './css.js'; +export * from './sg-sectionheading.js'; diff --git a/ts_web/elements/shared/sg-sectionheading.ts b/ts_web/elements/shared/sg-sectionheading.ts new file mode 100644 index 0000000..290d35e --- /dev/null +++ b/ts_web/elements/shared/sg-sectionheading.ts @@ -0,0 +1,43 @@ +import { + css, + cssManager, + customElement, + DeesElement, + html, + type TemplateResult, +} from '@design.estate/dees-element'; + +declare global { + interface HTMLElementTagNameMap { + 'sg-sectionheading': SgSectionheading; + } +} + +@customElement('sg-sectionheading') +export class SgSectionheading extends DeesElement { + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + margin-bottom: 16px; + } + .heading { + font-size: 20px; + font-weight: 700; + color: ${cssManager.bdTheme('#111', '#fff')}; + font-family: "JetBrains Mono", monospace; + padding-bottom: 8px; + border-bottom: 2px solid ${cssManager.bdTheme('#111', '#fff')}; + } + `, + ]; + + public render(): TemplateResult { + return html` +
+ +
+ `; + } +} diff --git a/ts_web/index.ts b/ts_web/index.ts new file mode 100644 index 0000000..25a2dff --- /dev/null +++ b/ts_web/index.ts @@ -0,0 +1,14 @@ +import * as plugins from './plugins.js'; +import { html } from '@design.estate/dees-element'; +import './elements/index.js'; +import { appRouter } from './router.js'; + +// Initialize router before rendering (handles initial URL -> state) +appRouter.init(); + +plugins.deesElement.render( + html` + +`, + document.body, +); diff --git a/ts_web/plugins.ts b/ts_web/plugins.ts new file mode 100644 index 0000000..623a365 --- /dev/null +++ b/ts_web/plugins.ts @@ -0,0 +1,11 @@ +// @design.estate scope +import * as deesElement from '@design.estate/dees-element'; +import * as deesCatalog from '@design.estate/dees-catalog'; + +// @stack.gallery scope — side-effect import registers all sg-* custom elements +import '@stack.gallery/catalog'; + +export { deesCatalog, deesElement }; + +// domtools gives us TypedRequest, smartstate, smartrouter, and other utilities +export const domtools = deesElement.domtools; diff --git a/ts_web/router.ts b/ts_web/router.ts new file mode 100644 index 0000000..67d762e --- /dev/null +++ b/ts_web/router.ts @@ -0,0 +1,155 @@ +import * as plugins from './plugins.js'; +import * as appstate from './appstate.js'; + +const SmartRouter = plugins.domtools.plugins.smartrouter.SmartRouter; + +export const validViews = [ + 'dashboard', + 'organizations', + 'packages', + 'tokens', + 'settings', + 'admin', +] as const; + +export type TValidView = typeof validViews[number]; + +class AppRouter { + private router: InstanceType; + private initialized = false; + private suppressStateUpdate = false; + + constructor() { + this.router = new SmartRouter({ debug: false }); + } + + public init(): void { + if (this.initialized) return; + this.setupRoutes(); + this.setupStateSync(); + this.handleInitialRoute(); + this.initialized = true; + } + + private setupRoutes(): void { + for (const view of validViews) { + this.router.on(`/${view}`, async () => { + this.updateViewState(view); + }); + } + + // Root redirect + this.router.on('/', async () => { + this.navigateTo('/dashboard'); + }); + } + + private setupStateSync(): void { + appstate.uiStatePart.select((s) => s.activeView).subscribe((activeView) => { + if (this.suppressStateUpdate) return; + + const currentPath = window.location.pathname; + const expectedPath = `/${activeView}`; + + if (currentPath !== expectedPath) { + this.suppressStateUpdate = true; + this.router.pushUrl(expectedPath); + this.suppressStateUpdate = false; + } + }); + } + + private handleInitialRoute(): void { + const path = window.location.pathname; + + // Handle OAuth callback + if (path === '/oauth-callback') { + this.handleOAuthCallback(); + return; + } + + if (!path || path === '/') { + this.router.pushUrl('/dashboard'); + } else { + const segments = path.split('/').filter(Boolean); + const view = segments[0]; + + if (validViews.includes(view as TValidView)) { + this.updateViewState(view as TValidView); + // If there's a sub-path, store the entity ID + if (segments[1]) { + const currentState = appstate.uiStatePart.getState(); + appstate.uiStatePart.setState({ + ...currentState, + activeEntityId: segments[1], + }); + } + } else { + this.router.pushUrl('/dashboard'); + } + } + } + + private handleOAuthCallback(): void { + const params = new URLSearchParams(window.location.search); + const accessToken = params.get('accessToken'); + const refreshToken = params.get('refreshToken'); + const sessionId = params.get('sessionId'); + + if (accessToken && refreshToken && sessionId) { + // Store tokens and redirect to dashboard + // The app shell will pick up the identity from loginStatePart + appstate.handleOAuthCallback(accessToken, refreshToken, sessionId); + } + + // Redirect to dashboard + this.navigateTo('/dashboard'); + } + + private updateViewState(view: string): void { + this.suppressStateUpdate = true; + const currentState = appstate.uiStatePart.getState(); + if (currentState.activeView !== view) { + appstate.uiStatePart.setState({ + ...currentState, + activeView: view, + activeEntityId: undefined, + }); + } + this.suppressStateUpdate = false; + } + + public navigateTo(path: string): void { + this.router.pushUrl(path); + } + + public navigateToView(view: string): void { + const normalized = view.toLowerCase().replace(/\s+/g, '-'); + if (validViews.includes(normalized as TValidView)) { + this.navigateTo(`/${normalized}`); + } else { + this.navigateTo('/dashboard'); + } + } + + public navigateToEntity(view: string, entityId: string): void { + const currentState = appstate.uiStatePart.getState(); + appstate.uiStatePart.setState({ + ...currentState, + activeView: view, + activeEntityId: entityId, + }); + this.router.pushUrl(`/${view}/${entityId}`); + } + + public getCurrentView(): string { + return appstate.uiStatePart.getState().activeView; + } + + public destroy(): void { + this.router.destroy(); + this.initialized = false; + } +} + +export const appRouter = new AppRouter(); diff --git a/ui/angular.json b/ui/angular.json deleted file mode 100644 index c88fda7..0000000 --- a/ui/angular.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "registry-ui": { - "projectType": "application", - "schematics": {}, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:application", - "options": { - "outputPath": "dist/registry-ui", - "index": "src/index.html", - "browser": "src/main.ts", - "polyfills": [], - "tsConfig": "tsconfig.app.json", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": [ - "src/styles.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kB", - "maximumError": "1MB" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "4kB", - "maximumError": "8kB" - } - ], - "outputHashing": "all" - }, - "development": { - "optimization": false, - "extractLicenses": false, - "sourceMap": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "proxyConfig": "proxy.conf.json" - }, - "configurations": { - "production": { - "buildTarget": "registry-ui:build:production" - }, - "development": { - "buildTarget": "registry-ui:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n" - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "polyfills": [], - "tsConfig": "tsconfig.spec.json", - "assets": [ - { - "glob": "**/*", - "input": "public" - } - ], - "styles": [ - "src/styles.css" - ], - "scripts": [] - } - } - } - } - } -} diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index 21b4dc1..0000000 --- a/ui/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@stack.gallery/registry-ui", - "version": "1.0.0", - "private": true, - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "dependencies": { - "@angular/animations": "^19.0.0", - "@angular/common": "^19.0.0", - "@angular/compiler": "^19.0.0", - "@angular/core": "^19.0.0", - "@angular/forms": "^19.0.0", - "@angular/platform-browser": "^19.0.0", - "@angular/platform-browser-dynamic": "^19.0.0", - "@angular/router": "^19.0.0", - "rxjs": "~7.8.0", - "tslib": "^2.6.0" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^19.0.0", - "@angular/cli": "^19.0.0", - "@angular/compiler-cli": "^19.0.0", - "@types/node": "^20.0.0", - "autoprefixer": "^10.4.0", - "postcss": "^8.4.0", - "tailwindcss": "^3.4.0", - "typescript": "~5.6.0" - } -} diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml deleted file mode 100644 index 862c3a9..0000000 --- a/ui/pnpm-lock.yaml +++ /dev/null @@ -1,8529 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@angular/animations': - specifier: ^19.0.0 - version: 19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/common': - specifier: ^19.0.0 - version: 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': - specifier: ^19.0.0 - version: 19.2.16 - '@angular/core': - specifier: ^19.0.0 - version: 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/forms': - specifier: ^19.0.0 - version: 19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - '@angular/platform-browser': - specifier: ^19.0.0 - version: 19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/platform-browser-dynamic': - specifier: ^19.0.0 - version: 19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.16)(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))) - '@angular/router': - specifier: ^19.0.0 - version: 19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - rxjs: - specifier: ~7.8.0 - version: 7.8.2 - tslib: - specifier: ^2.6.0 - version: 2.8.1 - devDependencies: - '@angular-devkit/build-angular': - specifier: ^19.0.0 - version: 19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(@angular/compiler@19.2.16)(@types/node@20.19.25)(chokidar@4.0.3)(jiti@1.21.7)(tailwindcss@3.4.18)(typescript@5.6.3)(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) - '@angular/cli': - specifier: ^19.0.0 - version: 19.2.19(@types/node@20.19.25)(chokidar@4.0.3) - '@angular/compiler-cli': - specifier: ^19.0.0 - version: 19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3) - '@types/node': - specifier: ^20.0.0 - version: 20.19.25 - autoprefixer: - specifier: ^10.4.0 - version: 10.4.22(postcss@8.5.6) - postcss: - specifier: ^8.4.0 - version: 8.5.6 - tailwindcss: - specifier: ^3.4.0 - version: 3.4.18 - typescript: - specifier: ~5.6.0 - version: 5.6.3 - -packages: - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@angular-devkit/architect@0.1902.19': - resolution: {integrity: sha512-iexYDIYpGAeAU7T60bGcfrGwtq1bxpZixYxWuHYiaD1b5baQgNSfd1isGEOh37GgDNsf4In9i2LOLPm0wBdtgQ==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@angular-devkit/build-angular@19.2.19': - resolution: {integrity: sha512-uIxi6Vzss6+ycljVhkyPUPWa20w8qxJL9lEn0h6+sX/fhM8Djt0FHIuTQjoX58EoMaQ/1jrXaRaGimkbaFcG9A==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - '@angular/localize': ^19.0.0 || ^19.2.0-next.0 - '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 - '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0 - '@angular/ssr': ^19.2.19 - '@web/test-runner': ^0.20.0 - browser-sync: ^3.0.2 - jest: ^29.5.0 - jest-environment-jsdom: ^29.5.0 - karma: ^6.3.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 - protractor: ^7.0.0 - tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.5 <5.9' - peerDependenciesMeta: - '@angular/localize': - optional: true - '@angular/platform-server': - optional: true - '@angular/service-worker': - optional: true - '@angular/ssr': - optional: true - '@web/test-runner': - optional: true - browser-sync: - optional: true - jest: - optional: true - jest-environment-jsdom: - optional: true - karma: - optional: true - ng-packagr: - optional: true - protractor: - optional: true - tailwindcss: - optional: true - - '@angular-devkit/build-webpack@0.1902.19': - resolution: {integrity: sha512-x2tlGg5CsUveFzuRuqeHknSbGirSAoRynEh+KqPRGK0G3WpMViW/M8SuVurecasegfIrDWtYZ4FnVxKqNbKwXQ==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - webpack: ^5.30.0 - webpack-dev-server: ^5.0.2 - - '@angular-devkit/core@19.2.19': - resolution: {integrity: sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^4.0.0 - peerDependenciesMeta: - chokidar: - optional: true - - '@angular-devkit/schematics@19.2.19': - resolution: {integrity: sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@angular/animations@19.2.16': - resolution: {integrity: sha512-K9kHMgHR49hBy6brFI9N4t0yWytcAHZER8zYhcsCoBhdJI69b5Va2Hm88g1bwrHCbw2laCkKOc3LsLpSr3s12A==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/common': 19.2.16 - '@angular/core': 19.2.16 - - '@angular/build@19.2.19': - resolution: {integrity: sha512-SFzQ1bRkNFiOVu+aaz+9INmts7tDUrsHLEr9HmARXr9qk5UmR8prlw39p2u+Bvi6/lCiJ18TZMQQl9mGyr63lg==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler': ^19.0.0 || ^19.2.0-next.0 - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - '@angular/localize': ^19.0.0 || ^19.2.0-next.0 - '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 - '@angular/service-worker': ^19.0.0 || ^19.2.0-next.0 - '@angular/ssr': ^19.2.19 - karma: ^6.4.0 - less: ^4.2.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 - postcss: ^8.4.0 - tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.5 <5.9' - peerDependenciesMeta: - '@angular/localize': - optional: true - '@angular/platform-server': - optional: true - '@angular/service-worker': - optional: true - '@angular/ssr': - optional: true - karma: - optional: true - less: - optional: true - ng-packagr: - optional: true - postcss: - optional: true - tailwindcss: - optional: true - - '@angular/cli@19.2.19': - resolution: {integrity: sha512-e9tAzFNOL4mMWfMnpC9Up83OCTOp2siIj8W41FCp8jfoEnw79AXDDLh3d70kOayiObchksTJVShslTogLUyhMw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true - - '@angular/common@19.2.16': - resolution: {integrity: sha512-sugztO7XIiLRoVjn0WJK9ooBm9zejsqlE5k4ZGvy1zFafM8LMjFHwD4KymN8JB3AOb7Ad4lJHVq1IvwWnpqeWw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/core': 19.2.16 - rxjs: ^6.5.3 || ^7.4.0 - - '@angular/compiler-cli@19.2.16': - resolution: {integrity: sha512-DCpEY6krTRcgLgRp/CmYxJ0JCB1LWyXPfEGIAxdDq8QFT2e+DM+MDMMB2n7VE3vr1Cx+Xz3QgZQ9qwRkGybBKQ==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - hasBin: true - peerDependencies: - '@angular/compiler': 19.2.16 - typescript: '>=5.5 <5.9' - - '@angular/compiler@19.2.16': - resolution: {integrity: sha512-7aZxmk1FRi0gWbZIxXyQ4zRm3tfQ9HiyjL6z6CphC8WthH4oq4JhfuW5zpx0CzHSchcR2Gsnox7VKrekklvtVQ==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - - '@angular/core@19.2.16': - resolution: {integrity: sha512-aBt4rYq0sMonUsl7k9kHAVgeP+6NM3CNGVvxqLmeSiQI2BUTWTTvfGR/52cQyUmDBuBRmaV6YK0F3zEAnOZzyA==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.15.0 - - '@angular/forms@19.2.16': - resolution: {integrity: sha512-463Blq8gcpBTTH5qdInbdnHeNVsQagsBHNa0NUJIK1lGiaxfAf5mnCosZdi1nu/rqtwE9CZgyRm7WidzoemGaA==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/common': 19.2.16 - '@angular/core': 19.2.16 - '@angular/platform-browser': 19.2.16 - rxjs: ^6.5.3 || ^7.4.0 - - '@angular/platform-browser-dynamic@19.2.16': - resolution: {integrity: sha512-bq4wqUgVAR9cr5QzjLjuSXEHo1Cstx8z/z1gZz0OM9HMSnA95bgPvQMtwtuZYOds0ItOUsLMDyFsDiAD3dAAmw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/common': 19.2.16 - '@angular/compiler': 19.2.16 - '@angular/core': 19.2.16 - '@angular/platform-browser': 19.2.16 - - '@angular/platform-browser@19.2.16': - resolution: {integrity: sha512-oDg0YWE0ZxW6AI2m5Da4fAVIhmNrrXLCvzE7bKZjBK1FsFx6FduBfQFsCg4K7D+72aGj0WDmEia8IVcBDtwvog==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/animations': 19.2.16 - '@angular/common': 19.2.16 - '@angular/core': 19.2.16 - peerDependenciesMeta: - '@angular/animations': - optional: true - - '@angular/router@19.2.16': - resolution: {integrity: sha512-vQMrZKmdU9rKz7HhT2wmXDGci2+bsLj37VPwoZOU/b0BCyK+5LM/OVpDvpA4yM42SXbRLqv28nXcVPoiz97HUg==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} - peerDependencies: - '@angular/common': 19.2.16 - '@angular/core': 19.2.16 - '@angular/platform-browser': 19.2.16 - rxjs: ^6.5.3 || ^7.4.0 - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.10': - resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.26.10': - resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} - - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} - - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/confirm@5.1.6': - resolution: {integrity: sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} - - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/prompts@7.3.2': - resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} - engines: {node: '>=18'} - - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.21.0': - resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@listr2/prompt-adapter-inquirer@2.0.18': - resolution: {integrity: sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@inquirer/prompts': '>= 3 < 8' - - '@lmdb/lmdb-darwin-arm64@3.2.6': - resolution: {integrity: sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==} - cpu: [arm64] - os: [darwin] - - '@lmdb/lmdb-darwin-x64@3.2.6': - resolution: {integrity: sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==} - cpu: [x64] - os: [darwin] - - '@lmdb/lmdb-linux-arm64@3.2.6': - resolution: {integrity: sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==} - cpu: [arm64] - os: [linux] - - '@lmdb/lmdb-linux-arm@3.2.6': - resolution: {integrity: sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==} - cpu: [arm] - os: [linux] - - '@lmdb/lmdb-linux-x64@3.2.6': - resolution: {integrity: sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==} - cpu: [x64] - os: [linux] - - '@lmdb/lmdb-win32-x64@3.2.6': - resolution: {integrity: sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==} - cpu: [x64] - os: [win32] - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - - '@napi-rs/nice-android-arm-eabi@1.1.1': - resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/nice-android-arm64@1.1.1': - resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/nice-darwin-arm64@1.1.1': - resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/nice-darwin-x64@1.1.1': - resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/nice-freebsd-x64@1.1.1': - resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': - resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/nice-linux-arm64-gnu@1.1.1': - resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/nice-linux-arm64-musl@1.1.1': - resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/nice-linux-ppc64-gnu@1.1.1': - resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} - engines: {node: '>= 10'} - cpu: [ppc64] - os: [linux] - - '@napi-rs/nice-linux-riscv64-gnu@1.1.1': - resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - - '@napi-rs/nice-linux-s390x-gnu@1.1.1': - resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} - engines: {node: '>= 10'} - cpu: [s390x] - os: [linux] - - '@napi-rs/nice-linux-x64-gnu@1.1.1': - resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/nice-linux-x64-musl@1.1.1': - resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/nice-openharmony-arm64@1.1.1': - resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [openharmony] - - '@napi-rs/nice-win32-arm64-msvc@1.1.1': - resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/nice-win32-ia32-msvc@1.1.1': - resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@napi-rs/nice-win32-x64-msvc@1.1.1': - resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/nice@1.1.1': - resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} - engines: {node: '>= 10'} - - '@ngtools/webpack@19.2.19': - resolution: {integrity: sha512-R9aeTrOBiRVl8I698JWPniUAAEpSvzc8SUGWSM5UXWMcHnWqd92cOnJJ1aXDGJZKXrbhMhCBx9Dglmcks5IDpg==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^19.0.0 || ^19.2.0-next.0 - typescript: '>=5.5 <5.9' - webpack: ^5.54.0 - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/agent@3.0.0': - resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/fs@4.0.0': - resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/git@6.0.3': - resolution: {integrity: sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/installed-package-contents@3.0.0': - resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - '@npmcli/node-gyp@4.0.0': - resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/package-json@6.2.0': - resolution: {integrity: sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/promise-spawn@8.0.3': - resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/redact@3.2.2': - resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@npmcli/run-script@9.1.0': - resolution: {integrity: sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.34.8': - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.34.8': - resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.34.8': - resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.34.8': - resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.34.8': - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.34.8': - resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.34.8': - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.34.8': - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.8': - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.34.8': - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.34.8': - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.34.8': - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} - cpu: [x64] - os: [win32] - - '@schematics/angular@19.2.19': - resolution: {integrity: sha512-6/0pvbPCY4UHeB4lnM/5r250QX5gcLgOYbR5FdhFu+22mOPHfWpRc5tNuY9kCephDHzAHjo6fTW1vefOOmA4jw==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@sigstore/bundle@3.1.0': - resolution: {integrity: sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/core@2.0.0': - resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/protobuf-specs@0.4.3': - resolution: {integrity: sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/sign@3.1.0': - resolution: {integrity: sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/tuf@3.1.1': - resolution: {integrity: sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/verify@2.1.1': - resolution: {integrity: sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@tufjs/canonical-json@2.0.0': - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@tufjs/models@3.0.1': - resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/http-proxy@1.17.17': - resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - - '@types/node@20.19.25': - resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@vitejs/plugin-basic-ssl@1.2.0': - resolution: {integrity: sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==} - engines: {node: '>=14.21.3'} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - - abbrev@3.0.1: - resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} - engines: {node: ^18.17.0 || >=20.5.0} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} - engines: {node: '>=18'} - - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-flatten@1.1.1: - resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} - - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - autoprefixer@10.4.22: - resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - babel-loader@9.2.1: - resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.8.31: - resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} - hasBin: true - - batch@0.6.1: - resolution: {integrity: sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=} - - beasties@0.3.2: - resolution: {integrity: sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==} - engines: {node: '>=14.0.0'} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - 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} - - bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} - - boolbase@1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cacache@19.0.1: - resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - 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'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - caniuse-lite@1.0.30001757: - resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - 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'} - - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clone@1.0.4: - resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} - engines: {node: '>=0.8'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.6: - resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - - copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.1.0 - - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.27.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.4.0: - resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} - engines: {node: '>=18'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - 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'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-libc@1.0.3: - resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=} - engines: {node: '>=0.10'} - hasBin: true - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} - - electron-to-chromium@1.5.262: - resolution: {integrity: sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - 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'} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - 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-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - esbuild-wasm@0.25.4: - resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} - 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=} - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - 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==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - - fresh@0.5.2: - resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} - engines: {node: '>= 0.6'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - 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==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} - engines: {node: '>=18'} - - 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'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - hasBin: true - - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hosted-git-info@8.1.0: - resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} - engines: {node: ^18.17.0 || >=20.5.0} - - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} - - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - - http-errors@1.6.3: - resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} - engines: {node: '>= 0.6'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - - http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - - 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'} - - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore-walk@7.0.0: - resolution: {integrity: sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} - engines: {node: '>=0.8.19'} - - inherits@2.0.3: - resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@5.0.0: - resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} - engines: {node: ^18.17.0 || >=20.5.0} - - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} - engines: {node: '>=16'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - 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'} - - isobject@3.0.1: - resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} - engines: {node: '>=0.10.0'} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@4.0.0: - resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} - engines: {node: ^18.17.0 || >=20.5.0} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} - engines: {'0': node >= 0.2.0} - - karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - launch-editor@2.12.0: - resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} - - less-loader@12.2.0: - resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - less@4.2.2: - resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==} - engines: {node: '>=6'} - hasBin: true - - license-webpack-plugin@4.0.2: - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} - peerDependencies: - webpack: '*' - peerDependenciesMeta: - webpack: - optional: true - - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} - engines: {node: '>=18.0.0'} - - lmdb@3.2.6: - resolution: {integrity: sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==} - hasBin: true - - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash.debounce@4.0.8: - resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - - make-fetch-happen@14.0.3: - resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} - engines: {node: '>= 0.6'} - - memfs@4.51.0: - resolution: {integrity: sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} - engines: {node: '>= 0.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - 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@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - - mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass-fetch@4.0.1: - resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - 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'} - - minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} - engines: {node: '>= 18'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.5: - resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-forge@1.3.2: - resolution: {integrity: sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==} - engines: {node: '>= 6.13.0'} - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - - node-gyp@11.5.0: - resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - - nopt@8.1.0: - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-bundled@4.0.0: - resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-install-checks@7.1.2: - resolution: {integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-normalize-package-bin@4.0.0: - resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-package-arg@12.0.2: - resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-packlist@9.0.0: - resolution: {integrity: sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-pick-manifest@10.0.0: - resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-registry-fetch@18.0.2: - resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - object-assign@4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} - engines: {node: '>=18'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - ordered-binary@1.6.0: - resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - - p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - pacote@20.0.0: - resolution: {integrity: sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - 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-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - - parse5-html-rewriting-stream@7.0.0: - resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} - - parse5-sax-parser@7.0.0: - resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} - - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - pify@2.3.0: - resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} - engines: {node: '>=0.10.0'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - piscina@4.8.0: - resolution: {integrity: sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==} - - pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - postcss-media-query-parser@0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.5.2: - resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - - proc-log@5.0.0: - resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - 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'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - 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@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regex-parser@2.3.1: - resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} - - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - requires-port@1.0.0: - resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - retry@0.12.0: - resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} - engines: {node: '>= 4'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rollup@4.34.8: - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sass-loader@16.0.5: - resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - webpack: - optional: true - - sass@1.85.0: - resolution: {integrity: sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==} - engines: {node: '>=14.0.0'} - hasBin: true - - sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-index@1.9.1: - resolution: {integrity: sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - 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'} - - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - - 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'} - - sigstore@3.1.0: - resolution: {integrity: sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==} - engines: {node: ^18.17.0 || >=20.5.0} - - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-loader@5.0.0: - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.72.1 - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - ssri@12.0.0: - resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - 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'} - - 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-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - 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==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - - tailwindcss@3.4.18: - resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} - engines: {node: '>=14.0.0'} - hasBin: true - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - tar@7.5.2: - resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} - engines: {node: '>=18'} - - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} - engines: {node: '>=10'} - hasBin: true - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tree-dump@1.1.0: - resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tuf-js@3.1.0: - resolution: {integrity: sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==} - engines: {node: ^18.17.0 || >=20.5.0} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} - - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - unique-filename@4.0.0: - resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - unique-slug@5.0.0: - resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} - engines: {node: ^18.17.0 || >=20.5.0} - - unpipe@1.0.0: - resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - util-deprecate@1.0.2: - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} - - utils-merge@1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} - engines: {node: '>= 0.4.0'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validate-npm-package-name@6.0.2: - resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} - engines: {node: ^18.17.0 || >=20.5.0} - - vary@1.1.2: - resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} - engines: {node: '>= 0.8'} - - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} - - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} - - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - - wcwidth@1.0.1: - resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} - - weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - - webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - - webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} - engines: {node: '>= 18.12.0'} - hasBin: true - peerDependencies: - webpack: ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - - webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack-subresource-integrity@5.1.0: - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} - peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' - webpack: ^5.12.0 - peerDependenciesMeta: - html-webpack-plugin: - optional: true - - webpack@5.98.0: - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - 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 - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - 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'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - 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 - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - 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'} - - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} - - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - - zone.js@0.15.1: - resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} - -snapshots: - - '@alloc/quick-lru@5.2.0': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@angular-devkit/architect@0.1902.19(chokidar@4.0.3)': - dependencies: - '@angular-devkit/core': 19.2.19(chokidar@4.0.3) - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - - '@angular-devkit/build-angular@19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(@angular/compiler@19.2.16)(@types/node@20.19.25)(chokidar@4.0.3)(jiti@1.21.7)(tailwindcss@3.4.18)(typescript@5.6.3)(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.4)) - '@angular-devkit/core': 19.2.19(chokidar@4.0.3) - '@angular/build': 19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(@angular/compiler@19.2.16)(@types/node@20.19.25)(chokidar@4.0.3)(jiti@1.21.7)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.18)(terser@5.39.0)(typescript@5.6.3) - '@angular/compiler-cli': 19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3) - '@babel/core': 7.26.10 - '@babel/generator': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/runtime': 7.26.10 - '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.98.0(esbuild@0.25.4)) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) - ansi-colors: 4.1.3 - autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.98.0(esbuild@0.25.4)) - browserslist: 4.28.0 - copy-webpack-plugin: 12.0.2(webpack@5.98.0(esbuild@0.25.4)) - css-loader: 7.1.2(webpack@5.98.0(esbuild@0.25.4)) - esbuild-wasm: 0.25.4 - fast-glob: 3.3.3 - http-proxy-middleware: 3.0.5 - istanbul-lib-instrument: 6.0.3 - jsonc-parser: 3.3.1 - karma-source-map-support: 1.4.0 - less: 4.2.2 - less-loader: 12.2.0(less@4.2.2)(webpack@5.98.0(esbuild@0.25.4)) - license-webpack-plugin: 4.0.2(webpack@5.98.0(esbuild@0.25.4)) - loader-utils: 3.3.1 - mini-css-extract-plugin: 2.9.2(webpack@5.98.0(esbuild@0.25.4)) - open: 10.1.0 - ora: 5.4.1 - picomatch: 4.0.2 - piscina: 4.8.0 - postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.6.3)(webpack@5.98.0(esbuild@0.25.4)) - resolve-url-loader: 5.0.0 - rxjs: 7.8.1 - sass: 1.85.0 - sass-loader: 16.0.5(sass@1.85.0)(webpack@5.98.0(esbuild@0.25.4)) - semver: 7.7.1 - source-map-loader: 5.0.0(webpack@5.98.0(esbuild@0.25.4)) - source-map-support: 0.5.21 - terser: 5.39.0 - tree-kill: 1.2.2 - tslib: 2.8.1 - typescript: 5.6.3 - webpack: 5.98.0(esbuild@0.25.4) - webpack-dev-middleware: 7.4.2(webpack@5.98.0) - webpack-dev-server: 5.2.2(webpack@5.98.0) - webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.98.0(esbuild@0.25.4)) - optionalDependencies: - esbuild: 0.25.4 - tailwindcss: 3.4.18 - transitivePeerDependencies: - - '@angular/compiler' - - '@rspack/core' - - '@swc/core' - - '@types/node' - - bufferutil - - chokidar - - debug - - html-webpack-plugin - - jiti - - lightningcss - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - tsx - - uglify-js - - utf-8-validate - - vite - - webpack-cli - - yaml - - '@angular-devkit/build-webpack@0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.4))': - dependencies: - '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) - rxjs: 7.8.1 - webpack: 5.98.0(esbuild@0.25.4) - webpack-dev-server: 5.2.2(webpack@5.98.0) - transitivePeerDependencies: - - chokidar - - '@angular-devkit/core@19.2.19(chokidar@4.0.3)': - dependencies: - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - jsonc-parser: 3.3.1 - picomatch: 4.0.2 - rxjs: 7.8.1 - source-map: 0.7.4 - optionalDependencies: - chokidar: 4.0.3 - - '@angular-devkit/schematics@19.2.19(chokidar@4.0.3)': - dependencies: - '@angular-devkit/core': 19.2.19(chokidar@4.0.3) - jsonc-parser: 3.3.1 - magic-string: 0.30.17 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - - '@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))': - dependencies: - '@angular/common': 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - tslib: 2.8.1 - - '@angular/build@19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(@angular/compiler@19.2.16)(@types/node@20.19.25)(chokidar@4.0.3)(jiti@1.21.7)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.18)(terser@5.39.0)(typescript@5.6.3)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) - '@angular/compiler': 19.2.16 - '@angular/compiler-cli': 19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3) - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@inquirer/confirm': 5.1.6(@types/node@20.19.25) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) - beasties: 0.3.2 - browserslist: 4.28.0 - esbuild: 0.25.4 - fast-glob: 3.3.3 - https-proxy-agent: 7.0.6 - istanbul-lib-instrument: 6.0.3 - listr2: 8.2.5 - magic-string: 0.30.17 - mrmime: 2.0.1 - parse5-html-rewriting-stream: 7.0.0 - picomatch: 4.0.2 - piscina: 4.8.0 - rollup: 4.34.8 - sass: 1.85.0 - semver: 7.7.1 - source-map-support: 0.5.21 - typescript: 5.6.3 - vite: 6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) - watchpack: 2.4.2 - optionalDependencies: - less: 4.2.2 - lmdb: 3.2.6 - postcss: 8.5.2 - tailwindcss: 3.4.18 - transitivePeerDependencies: - - '@types/node' - - chokidar - - jiti - - lightningcss - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@angular/cli@19.2.19(@types/node@20.19.25)(chokidar@4.0.3)': - dependencies: - '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) - '@angular-devkit/core': 19.2.19(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@20.19.25) - '@listr2/prompt-adapter-inquirer': 2.0.18(@inquirer/prompts@7.3.2(@types/node@20.19.25)) - '@schematics/angular': 19.2.19(chokidar@4.0.3) - '@yarnpkg/lockfile': 1.1.0 - ini: 5.0.0 - jsonc-parser: 3.3.1 - listr2: 8.2.5 - npm-package-arg: 12.0.2 - npm-pick-manifest: 10.0.0 - pacote: 20.0.0 - resolve: 1.22.10 - semver: 7.7.1 - symbol-observable: 4.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - chokidar - - supports-color - - '@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': - dependencies: - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - rxjs: 7.8.2 - tslib: 2.8.1 - - '@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3)': - dependencies: - '@angular/compiler': 19.2.16 - '@babel/core': 7.26.9 - '@jridgewell/sourcemap-codec': 1.5.5 - chokidar: 4.0.3 - convert-source-map: 1.9.0 - reflect-metadata: 0.2.2 - semver: 7.7.3 - tslib: 2.8.1 - typescript: 5.6.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - - '@angular/compiler@19.2.16': - dependencies: - tslib: 2.8.1 - - '@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)': - dependencies: - rxjs: 7.8.2 - tslib: 2.8.1 - zone.js: 0.15.1 - - '@angular/forms@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': - dependencies: - '@angular/common': 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - rxjs: 7.8.2 - tslib: 2.8.1 - - '@angular/platform-browser-dynamic@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.16)(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))': - dependencies: - '@angular/common': 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': 19.2.16 - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - tslib: 2.8.1 - - '@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))': - dependencies: - '@angular/common': 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - tslib: 2.8.1 - optionalDependencies: - '@angular/animations': 19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - - '@angular/router@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': - dependencies: - '@angular/common': 19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 19.2.16(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 19.2.16(@angular/animations@19.2.16(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.16(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.16(rxjs@7.8.2)(zone.js@0.15.1)) - rxjs: 7.8.2 - tslib: 2.8.1 - - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.5': {} - - '@babel/core@7.26.10': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.26.9': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.9) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.26.10': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - - '@babel/parser@7.28.5': - dependencies: - '@babel/types': 7.28.5 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.10) - core-js-compat: 3.47.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 - esutils: 2.0.3 - - '@babel/runtime@7.26.10': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - - '@babel/traverse@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.28.5': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@discoveryjs/json-ext@0.6.3': {} - - '@esbuild/aix-ppc64@0.25.4': - optional: true - - '@esbuild/android-arm64@0.25.4': - optional: true - - '@esbuild/android-arm@0.25.4': - optional: true - - '@esbuild/android-x64@0.25.4': - optional: true - - '@esbuild/darwin-arm64@0.25.4': - optional: true - - '@esbuild/darwin-x64@0.25.4': - optional: true - - '@esbuild/freebsd-arm64@0.25.4': - optional: true - - '@esbuild/freebsd-x64@0.25.4': - optional: true - - '@esbuild/linux-arm64@0.25.4': - optional: true - - '@esbuild/linux-arm@0.25.4': - optional: true - - '@esbuild/linux-ia32@0.25.4': - optional: true - - '@esbuild/linux-loong64@0.25.4': - optional: true - - '@esbuild/linux-mips64el@0.25.4': - optional: true - - '@esbuild/linux-ppc64@0.25.4': - optional: true - - '@esbuild/linux-riscv64@0.25.4': - optional: true - - '@esbuild/linux-s390x@0.25.4': - optional: true - - '@esbuild/linux-x64@0.25.4': - optional: true - - '@esbuild/netbsd-arm64@0.25.4': - optional: true - - '@esbuild/netbsd-x64@0.25.4': - optional: true - - '@esbuild/openbsd-arm64@0.25.4': - optional: true - - '@esbuild/openbsd-x64@0.25.4': - optional: true - - '@esbuild/sunos-x64@0.25.4': - optional: true - - '@esbuild/win32-arm64@0.25.4': - optional: true - - '@esbuild/win32-ia32@0.25.4': - optional: true - - '@esbuild/win32-x64@0.25.4': - optional: true - - '@inquirer/ansi@1.0.2': {} - - '@inquirer/checkbox@4.3.2(@types/node@20.19.25)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.25) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/confirm@5.1.21(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/confirm@5.1.6(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/core@10.3.2(@types/node@20.19.25)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.25) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/editor@4.2.23(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/external-editor': 1.0.3(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/expand@4.0.23(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/external-editor@1.0.3(@types/node@20.19.25)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/figures@1.0.15': {} - - '@inquirer/input@4.3.1(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/number@3.0.23(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/password@4.0.23(@types/node@20.19.25)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/prompts@7.3.2(@types/node@20.19.25)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@20.19.25) - '@inquirer/confirm': 5.1.21(@types/node@20.19.25) - '@inquirer/editor': 4.2.23(@types/node@20.19.25) - '@inquirer/expand': 4.0.23(@types/node@20.19.25) - '@inquirer/input': 4.3.1(@types/node@20.19.25) - '@inquirer/number': 3.0.23(@types/node@20.19.25) - '@inquirer/password': 4.0.23(@types/node@20.19.25) - '@inquirer/rawlist': 4.1.11(@types/node@20.19.25) - '@inquirer/search': 3.2.2(@types/node@20.19.25) - '@inquirer/select': 4.4.2(@types/node@20.19.25) - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/rawlist@4.1.11(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/type': 3.0.10(@types/node@20.19.25) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/search@3.2.2(@types/node@20.19.25)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.25) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/select@4.4.2(@types/node@20.19.25)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@20.19.25) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@20.19.25) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 20.19.25 - - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 - - '@inquirer/type@3.0.10(@types/node@20.19.25)': - optionalDependencies: - '@types/node': 20.19.25 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - - '@istanbuljs/schema@0.1.3': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - tslib: 2.8.1 - - '@leichtgewicht/ip-codec@2.0.5': {} - - '@listr2/prompt-adapter-inquirer@2.0.18(@inquirer/prompts@7.3.2(@types/node@20.19.25))': - dependencies: - '@inquirer/prompts': 7.3.2(@types/node@20.19.25) - '@inquirer/type': 1.5.5 - - '@lmdb/lmdb-darwin-arm64@3.2.6': - optional: true - - '@lmdb/lmdb-darwin-x64@3.2.6': - optional: true - - '@lmdb/lmdb-linux-arm64@3.2.6': - optional: true - - '@lmdb/lmdb-linux-arm@3.2.6': - optional: true - - '@lmdb/lmdb-linux-x64@3.2.6': - optional: true - - '@lmdb/lmdb-win32-x64@3.2.6': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@napi-rs/nice-android-arm-eabi@1.1.1': - optional: true - - '@napi-rs/nice-android-arm64@1.1.1': - optional: true - - '@napi-rs/nice-darwin-arm64@1.1.1': - optional: true - - '@napi-rs/nice-darwin-x64@1.1.1': - optional: true - - '@napi-rs/nice-freebsd-x64@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm64-musl@1.1.1': - optional: true - - '@napi-rs/nice-linux-ppc64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-riscv64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-s390x-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-x64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-x64-musl@1.1.1': - optional: true - - '@napi-rs/nice-openharmony-arm64@1.1.1': - optional: true - - '@napi-rs/nice-win32-arm64-msvc@1.1.1': - optional: true - - '@napi-rs/nice-win32-ia32-msvc@1.1.1': - optional: true - - '@napi-rs/nice-win32-x64-msvc@1.1.1': - optional: true - - '@napi-rs/nice@1.1.1': - optionalDependencies: - '@napi-rs/nice-android-arm-eabi': 1.1.1 - '@napi-rs/nice-android-arm64': 1.1.1 - '@napi-rs/nice-darwin-arm64': 1.1.1 - '@napi-rs/nice-darwin-x64': 1.1.1 - '@napi-rs/nice-freebsd-x64': 1.1.1 - '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 - '@napi-rs/nice-linux-arm64-gnu': 1.1.1 - '@napi-rs/nice-linux-arm64-musl': 1.1.1 - '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 - '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 - '@napi-rs/nice-linux-s390x-gnu': 1.1.1 - '@napi-rs/nice-linux-x64-gnu': 1.1.1 - '@napi-rs/nice-linux-x64-musl': 1.1.1 - '@napi-rs/nice-openharmony-arm64': 1.1.1 - '@napi-rs/nice-win32-arm64-msvc': 1.1.1 - '@napi-rs/nice-win32-ia32-msvc': 1.1.1 - '@napi-rs/nice-win32-x64-msvc': 1.1.1 - optional: true - - '@ngtools/webpack@19.2.19(@angular/compiler-cli@19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.98.0(esbuild@0.25.4))': - dependencies: - '@angular/compiler-cli': 19.2.16(@angular/compiler@19.2.16)(typescript@5.6.3) - typescript: 5.6.3 - webpack: 5.98.0(esbuild@0.25.4) - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@npmcli/agent@3.0.0': - dependencies: - agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 10.4.3 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - '@npmcli/fs@4.0.0': - dependencies: - semver: 7.7.1 - - '@npmcli/git@6.0.3': - dependencies: - '@npmcli/promise-spawn': 8.0.3 - ini: 5.0.0 - lru-cache: 10.4.3 - npm-pick-manifest: 10.0.0 - proc-log: 5.0.0 - promise-retry: 2.0.1 - semver: 7.7.1 - which: 5.0.0 - - '@npmcli/installed-package-contents@3.0.0': - dependencies: - npm-bundled: 4.0.0 - npm-normalize-package-bin: 4.0.0 - - '@npmcli/node-gyp@4.0.0': {} - - '@npmcli/package-json@6.2.0': - dependencies: - '@npmcli/git': 6.0.3 - glob: 10.5.0 - hosted-git-info: 8.1.0 - json-parse-even-better-errors: 4.0.0 - proc-log: 5.0.0 - semver: 7.7.1 - validate-npm-package-license: 3.0.4 - - '@npmcli/promise-spawn@8.0.3': - dependencies: - which: 5.0.0 - - '@npmcli/redact@3.2.2': {} - - '@npmcli/run-script@9.1.0': - dependencies: - '@npmcli/node-gyp': 4.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.3 - node-gyp: 11.5.0 - proc-log: 5.0.0 - which: 5.0.0 - transitivePeerDependencies: - - supports-color - - '@parcel/watcher-android-arm64@2.5.1': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.1': - optional: true - - '@parcel/watcher-darwin-x64@2.5.1': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.1': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.1': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.1': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.1': - optional: true - - '@parcel/watcher-win32-arm64@2.5.1': - optional: true - - '@parcel/watcher-win32-ia32@2.5.1': - optional: true - - '@parcel/watcher-win32-x64@2.5.1': - optional: true - - '@parcel/watcher@2.5.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.8 - node-addon-api: 7.1.1 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 - optional: true - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@rollup/rollup-android-arm-eabi@4.34.8': - optional: true - - '@rollup/rollup-android-arm-eabi@4.53.3': - optional: true - - '@rollup/rollup-android-arm64@4.34.8': - optional: true - - '@rollup/rollup-android-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.34.8': - optional: true - - '@rollup/rollup-darwin-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-x64@4.34.8': - optional: true - - '@rollup/rollup-darwin-x64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-arm64@4.34.8': - optional: true - - '@rollup/rollup-freebsd-arm64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-x64@4.34.8': - optional: true - - '@rollup/rollup-freebsd-x64@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.34.8': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.34.8': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-musl@4.34.8': - optional: true - - '@rollup/rollup-linux-x64-musl@4.53.3': - optional: true - - '@rollup/rollup-openharmony-arm64@4.53.3': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.34.8': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.34.8': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.34.8': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.53.3': - optional: true - - '@schematics/angular@19.2.19(chokidar@4.0.3)': - dependencies: - '@angular-devkit/core': 19.2.19(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) - jsonc-parser: 3.3.1 - transitivePeerDependencies: - - chokidar - - '@sigstore/bundle@3.1.0': - dependencies: - '@sigstore/protobuf-specs': 0.4.3 - - '@sigstore/core@2.0.0': {} - - '@sigstore/protobuf-specs@0.4.3': {} - - '@sigstore/sign@3.1.0': - dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - make-fetch-happen: 14.0.3 - proc-log: 5.0.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@sigstore/tuf@3.1.1': - dependencies: - '@sigstore/protobuf-specs': 0.4.3 - tuf-js: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@sigstore/verify@2.1.1': - dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - - '@sindresorhus/merge-streams@2.3.0': {} - - '@tufjs/canonical-json@2.0.0': {} - - '@tufjs/models@3.0.1': - dependencies: - '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.5 - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.19.25 - - '@types/bonjour@3.5.13': - dependencies: - '@types/node': 20.19.25 - - '@types/connect-history-api-fallback@1.5.4': - dependencies: - '@types/express-serve-static-core': 4.19.7 - '@types/node': 20.19.25 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.19.25 - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.6': {} - - '@types/estree@1.0.8': {} - - '@types/express-serve-static-core@4.19.7': - dependencies: - '@types/node': 20.19.25 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express@4.17.25': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.10 - - '@types/http-errors@2.0.5': {} - - '@types/http-proxy@1.17.17': - dependencies: - '@types/node': 20.19.25 - - '@types/json-schema@7.0.15': {} - - '@types/mime@1.3.5': {} - - '@types/node-forge@1.3.14': - dependencies: - '@types/node': 20.19.25 - - '@types/node@20.19.25': - dependencies: - undici-types: 6.21.0 - - '@types/qs@6.14.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/retry@0.12.2': {} - - '@types/send@0.17.6': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.19.25 - - '@types/send@1.2.1': - dependencies: - '@types/node': 20.19.25 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.25 - - '@types/serve-static@1.15.10': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 20.19.25 - '@types/send': 0.17.6 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 20.19.25 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.19.25 - - '@vitejs/plugin-basic-ssl@1.2.0(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': - dependencies: - vite: 6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - '@yarnpkg/lockfile@1.1.0': {} - - abbrev@3.0.1: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn@8.15.0: {} - - adjust-sourcemap-loader@4.0.0: - dependencies: - loader-utils: 2.0.4 - regex-parser: 2.3.1 - - agent-base@7.1.4: {} - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-colors@4.1.3: {} - - ansi-escapes@7.2.0: - dependencies: - environment: 1.1.0 - - ansi-html-community@0.0.8: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@2.0.1: {} - - array-flatten@1.1.1: {} - - autoprefixer@10.4.20(postcss@8.5.2): - dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.2 - postcss-value-parser: 4.2.0 - - autoprefixer@10.4.22(postcss@8.5.6): - dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 - fraction.js: 5.3.4 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - babel-loader@9.2.1(@babel/core@7.26.10)(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - '@babel/core': 7.26.10 - find-cache-dir: 4.0.0 - schema-utils: 4.3.3 - webpack: 5.98.0(esbuild@0.25.4) - - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.26.10): - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) - core-js-compat: 3.47.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - balanced-match@1.0.2: {} - - base64-js@1.5.1: {} - - baseline-browser-mapping@2.8.31: {} - - batch@0.6.1: {} - - beasties@0.3.2: - dependencies: - css-select: 5.2.2 - css-what: 6.2.2 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - htmlparser2: 10.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-media-query-parser: 0.2.3 - - big.js@5.2.2: {} - - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - 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 - - bonjour-service@1.3.0: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.28.0: - dependencies: - baseline-browser-mapping: 2.8.31 - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.262 - node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) - - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - - bytes@3.1.2: {} - - cacache@19.0.1: - dependencies: - '@npmcli/fs': 4.0.0 - fs-minipass: 3.0.3 - glob: 10.5.0 - lru-cache: 10.4.3 - minipass: 7.1.2 - minipass-collect: 2.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 7.0.4 - ssri: 12.0.0 - tar: 7.5.2 - unique-filename: 4.0.0 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camelcase-css@2.0.1: {} - - caniuse-lite@1.0.30001757: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chardet@2.1.1: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chownr@2.0.0: {} - - chownr@3.0.0: {} - - chrome-trace-event@1.0.4: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.9.2: {} - - cli-truncate@4.0.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 - - cli-width@4.1.0: {} - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clone@1.0.4: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - commander@2.20.3: {} - - commander@4.1.1: {} - - common-path-prefix@3.0.0: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - connect-history-api-fallback@2.0.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.7.1: {} - - copy-anything@2.0.6: - dependencies: - is-what: 3.14.1 - - copy-webpack-plugin@12.0.2(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - fast-glob: 3.3.3 - glob-parent: 6.0.2 - globby: 14.1.0 - normalize-path: 3.0.0 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - webpack: 5.98.0(esbuild@0.25.4) - - core-js-compat@3.47.0: - dependencies: - browserslist: 4.28.0 - - core-util-is@1.0.3: {} - - cosmiconfig@9.0.0(typescript@5.6.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.6.3 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-loader@7.1.2(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - semver: 7.7.1 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-what@6.2.2: {} - - cssesc@3.0.0: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - default-browser-id@5.0.1: {} - - default-browser@5.4.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-lazy-prop@3.0.0: {} - - depd@1.1.2: {} - - depd@2.0.0: {} - - destroy@1.2.0: {} - - detect-libc@1.0.3: - optional: true - - detect-libc@2.1.2: - optional: true - - detect-node@2.1.0: {} - - didyoumean@1.2.2: {} - - dlv@1.1.3: {} - - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.262: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@3.0.0: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - entities@4.5.0: {} - - entities@6.0.1: {} - - env-paths@2.2.1: {} - - environment@1.1.0: {} - - err-code@2.0.3: {} - - errno@0.1.8: - dependencies: - prr: 1.0.1 - optional: true - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - esbuild-wasm@0.25.4: {} - - esbuild@0.25.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - events@3.3.0: {} - - exponential-backoff@3.1.3: {} - - 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 - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.1.0: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fdir@6.5.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - 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 - - find-cache-dir@4.0.0: - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - - flat@5.0.2: {} - - follow-redirects@1.15.11(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - forwarded@0.2.0: {} - - fraction.js@4.3.7: {} - - fraction.js@5.3.4: {} - - fresh@0.5.2: {} - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-minipass@3.0.3: - dependencies: - minipass: 7.1.2 - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.4.0: {} - - 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 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regex.js@1.2.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - glob-to-regexp@0.4.1: {} - - glob@10.5.0: - 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 - - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - handle-thing@2.0.1: {} - - has-flag@4.0.0: {} - - has-symbols@1.1.0: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hosted-git-info@8.1.0: - dependencies: - lru-cache: 10.4.3 - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 - - http-cache-semantics@4.2.0: {} - - http-deceiver@1.2.7: {} - - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - 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-parser-js@0.5.10: {} - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - http-proxy-middleware@2.0.9(@types/express@4.17.25): - dependencies: - '@types/http-proxy': 1.17.17 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - '@types/express': 4.17.25 - transitivePeerDependencies: - - debug - - http-proxy-middleware@3.0.5: - dependencies: - '@types/http-proxy': 1.17.17 - debug: 4.4.3 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-object: 5.0.0 - micromatch: 4.0.8 - transitivePeerDependencies: - - supports-color - - http-proxy@1.18.1(debug@4.4.3): - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - hyperdyperid@1.2.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - - icss-utils@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - ieee754@1.2.1: {} - - ignore-walk@7.0.0: - dependencies: - minimatch: 9.0.5 - - ignore@7.0.5: {} - - image-size@0.5.5: - optional: true - - immutable@5.1.4: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@5.0.0: {} - - ip-address@10.1.0: {} - - ipaddr.js@1.9.1: {} - - ipaddr.js@2.2.0: {} - - is-arrayish@0.2.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-docker@3.0.0: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.4.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@1.0.0: {} - - is-network-error@1.3.0: {} - - is-number@7.0.0: {} - - is-plain-obj@3.0.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-plain-object@5.0.0: {} - - is-unicode-supported@0.1.0: {} - - is-what@3.14.1: {} - - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - isexe@3.1.1: {} - - isobject@3.0.1: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.28.5 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jest-worker@27.5.1: - dependencies: - '@types/node': 20.19.25 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jiti@1.21.7: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - - jsesc@3.1.0: {} - - json-parse-even-better-errors@2.3.1: {} - - json-parse-even-better-errors@4.0.0: {} - - json-schema-traverse@1.0.0: {} - - json5@2.2.3: {} - - jsonc-parser@3.3.1: {} - - jsonparse@1.3.1: {} - - karma-source-map-support@1.4.0: - dependencies: - source-map-support: 0.5.21 - - kind-of@6.0.3: {} - - launch-editor@2.12.0: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.3 - - less-loader@12.2.0(less@4.2.2)(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - less: 4.2.2 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - - less@4.2.2: - dependencies: - copy-anything: 2.0.6 - parse-node-version: 1.0.1 - tslib: 2.8.1 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - needle: 3.3.1 - source-map: 0.6.1 - - license-webpack-plugin@4.0.2(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - webpack-sources: 3.3.3 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - listr2@8.2.5: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 - - lmdb@3.2.6: - dependencies: - msgpackr: 1.11.5 - node-addon-api: 6.1.0 - node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.0 - weak-lru-cache: 1.2.2 - optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.2.6 - '@lmdb/lmdb-darwin-x64': 3.2.6 - '@lmdb/lmdb-linux-arm': 3.2.6 - '@lmdb/lmdb-linux-arm64': 3.2.6 - '@lmdb/lmdb-linux-x64': 3.2.6 - '@lmdb/lmdb-win32-x64': 3.2.6 - optional: true - - loader-runner@4.3.1: {} - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - loader-utils@3.3.1: {} - - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash.debounce@4.0.8: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-update@6.1.0: - dependencies: - ansi-escapes: 7.2.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 - - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - optional: true - - make-fetch-happen@14.0.3: - dependencies: - '@npmcli/agent': 3.0.0 - cacache: 19.0.1 - http-cache-semantics: 4.2.0 - minipass: 7.1.2 - minipass-fetch: 4.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 1.0.0 - proc-log: 5.0.0 - promise-retry: 2.0.1 - ssri: 12.0.0 - transitivePeerDependencies: - - supports-color - - math-intrinsics@1.1.0: {} - - media-typer@0.3.0: {} - - memfs@4.51.0: - dependencies: - '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-function@5.0.1: {} - - mini-css-extract-plugin@2.9.2(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - schema-utils: 4.3.3 - tapable: 2.3.0 - webpack: 5.98.0(esbuild@0.25.4) - - minimalistic-assert@1.0.1: {} - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.2 - - minipass-fetch@4.0.1: - dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 3.1.0 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - 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 - - minizlib@3.1.0: - dependencies: - minipass: 7.1.2 - - mkdirp@1.0.4: {} - - mrmime@2.0.1: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.5: - optionalDependencies: - msgpackr-extract: 3.0.3 - optional: true - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mute-stream@1.0.0: {} - - mute-stream@2.0.0: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.11: {} - - needle@3.3.1: - dependencies: - iconv-lite: 0.6.3 - sax: 1.4.3 - optional: true - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - negotiator@1.0.0: {} - - neo-async@2.6.2: {} - - node-addon-api@6.1.0: - optional: true - - node-addon-api@7.1.1: - optional: true - - node-forge@1.3.2: {} - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true - - node-gyp@11.5.0: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - graceful-fs: 4.2.11 - make-fetch-happen: 14.0.3 - nopt: 8.1.0 - proc-log: 5.0.0 - semver: 7.7.1 - tar: 7.5.2 - tinyglobby: 0.2.15 - which: 5.0.0 - transitivePeerDependencies: - - supports-color - - node-releases@2.0.27: {} - - nopt@8.1.0: - dependencies: - abbrev: 3.0.1 - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - npm-bundled@4.0.0: - dependencies: - npm-normalize-package-bin: 4.0.0 - - npm-install-checks@7.1.2: - dependencies: - semver: 7.7.1 - - npm-normalize-package-bin@4.0.0: {} - - npm-package-arg@12.0.2: - dependencies: - hosted-git-info: 8.1.0 - proc-log: 5.0.0 - semver: 7.7.1 - validate-npm-package-name: 6.0.2 - - npm-packlist@9.0.0: - dependencies: - ignore-walk: 7.0.0 - - npm-pick-manifest@10.0.0: - dependencies: - npm-install-checks: 7.1.2 - npm-normalize-package-bin: 4.0.0 - npm-package-arg: 12.0.2 - semver: 7.7.1 - - npm-registry-fetch@18.0.2: - dependencies: - '@npmcli/redact': 3.2.2 - jsonparse: 1.3.1 - make-fetch-happen: 14.0.3 - minipass: 7.1.2 - minipass-fetch: 4.0.1 - minizlib: 3.1.0 - npm-package-arg: 12.0.2 - proc-log: 5.0.0 - transitivePeerDependencies: - - supports-color - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - object-inspect@1.13.4: {} - - obuf@1.1.2: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.1.0: {} - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - open@10.1.0: - dependencies: - default-browser: 5.4.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - ordered-binary@1.6.0: - optional: true - - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.2 - - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - - p-map@7.0.4: {} - - p-retry@6.2.1: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.3.0 - retry: 0.13.1 - - package-json-from-dist@1.0.1: {} - - pacote@20.0.0: - dependencies: - '@npmcli/git': 6.0.3 - '@npmcli/installed-package-contents': 3.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.3 - '@npmcli/run-script': 9.1.0 - cacache: 19.0.1 - fs-minipass: 3.0.3 - minipass: 7.1.2 - npm-package-arg: 12.0.2 - npm-packlist: 9.0.0 - npm-pick-manifest: 10.0.0 - npm-registry-fetch: 18.0.2 - proc-log: 5.0.0 - promise-retry: 2.0.1 - sigstore: 3.1.0 - ssri: 12.0.0 - tar: 6.2.1 - transitivePeerDependencies: - - supports-color - - 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.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-node-version@1.0.1: {} - - parse5-html-rewriting-stream@7.0.0: - dependencies: - entities: 4.5.0 - parse5: 7.3.0 - parse5-sax-parser: 7.0.0 - - parse5-sax-parser@7.0.0: - dependencies: - parse5: 7.3.0 - - parse5@7.3.0: - dependencies: - entities: 6.0.1 - - parseurl@1.3.3: {} - - path-exists@5.0.0: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} - - path-type@6.0.0: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - picomatch@4.0.3: {} - - pify@2.3.0: {} - - pify@4.0.1: - optional: true - - pirates@4.0.7: {} - - piscina@4.8.0: - optionalDependencies: - '@napi-rs/nice': 1.1.1 - - pkg-dir@7.0.0: - dependencies: - find-up: 6.3.0 - - postcss-import@15.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.11 - - postcss-js@4.1.0(postcss@8.5.6): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 - - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.6 - - postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.6.3)(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - cosmiconfig: 9.0.0(typescript@5.6.3) - jiti: 1.21.7 - postcss: 8.5.2 - semver: 7.7.1 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - transitivePeerDependencies: - - typescript - - postcss-media-query-parser@0.2.3: {} - - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - - postcss-modules-values@4.0.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - - postcss-nested@6.2.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - - postcss@8.5.2: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - proc-log@5.0.0: {} - - process-nextick-args@2.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - prr@1.0.1: - optional: true - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - 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 - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - 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@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.1.2: {} - - reflect-metadata@0.2.2: {} - - regenerate-unicode-properties@10.2.2: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.14.1: {} - - regex-parser@2.3.1: {} - - regexpu-core@6.4.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 - regjsgen: 0.8.0 - regjsparser: 0.13.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 - - regjsgen@0.8.0: {} - - regjsparser@0.13.0: - dependencies: - jsesc: 3.1.0 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - requires-port@1.0.0: {} - - resolve-from@4.0.0: {} - - resolve-url-loader@5.0.0: - dependencies: - adjust-sourcemap-loader: 4.0.0 - convert-source-map: 1.9.0 - loader-utils: 2.0.4 - postcss: 8.5.6 - source-map: 0.6.1 - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - retry@0.12.0: {} - - retry@0.13.1: {} - - reusify@1.1.0: {} - - rfdc@1.4.1: {} - - rollup@4.34.8: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.8 - '@rollup/rollup-android-arm64': 4.34.8 - '@rollup/rollup-darwin-arm64': 4.34.8 - '@rollup/rollup-darwin-x64': 4.34.8 - '@rollup/rollup-freebsd-arm64': 4.34.8 - '@rollup/rollup-freebsd-x64': 4.34.8 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 - '@rollup/rollup-linux-arm-musleabihf': 4.34.8 - '@rollup/rollup-linux-arm64-gnu': 4.34.8 - '@rollup/rollup-linux-arm64-musl': 4.34.8 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 - '@rollup/rollup-linux-riscv64-gnu': 4.34.8 - '@rollup/rollup-linux-s390x-gnu': 4.34.8 - '@rollup/rollup-linux-x64-gnu': 4.34.8 - '@rollup/rollup-linux-x64-musl': 4.34.8 - '@rollup/rollup-win32-arm64-msvc': 4.34.8 - '@rollup/rollup-win32-ia32-msvc': 4.34.8 - '@rollup/rollup-win32-x64-msvc': 4.34.8 - fsevents: 2.3.3 - - rollup@4.53.3: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 - fsevents: 2.3.3 - - run-applescript@7.1.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.1: - dependencies: - tslib: 2.8.1 - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - sass-loader@16.0.5(sass@1.85.0)(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - neo-async: 2.6.2 - optionalDependencies: - sass: 1.85.0 - webpack: 5.98.0(esbuild@0.25.4) - - sass@1.85.0: - dependencies: - chokidar: 4.0.3 - immutable: 5.1.4 - source-map-js: 1.2.1 - optionalDependencies: - '@parcel/watcher': 2.5.1 - - sax@1.4.3: - optional: true - - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - select-hose@2.0.0: {} - - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.14 - node-forge: 1.3.2 - - semver@5.7.2: - optional: true - - semver@6.3.1: {} - - semver@7.7.1: {} - - semver@7.7.3: {} - - 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 - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - 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 - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.8.3: {} - - 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: {} - - sigstore@3.1.0: - dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - '@sigstore/sign': 3.1.0 - '@sigstore/tuf': 3.1.1 - '@sigstore/verify': 2.1.1 - transitivePeerDependencies: - - supports-color - - slash@5.1.0: {} - - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - smart-buffer@4.2.0: {} - - sockjs@0.3.24: - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - - socks@2.8.7: - dependencies: - ip-address: 10.1.0 - smart-buffer: 4.2.0 - - source-map-js@1.2.1: {} - - source-map-loader@5.0.0(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - iconv-lite: 0.6.3 - source-map-js: 1.2.1 - webpack: 5.98.0(esbuild@0.25.4) - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - source-map@0.7.4: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 - - spdx-license-ids@3.0.22: {} - - spdy-transport@3.0.0: - dependencies: - debug: 4.4.3 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2: - dependencies: - debug: 4.4.3 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - - ssri@12.0.0: - dependencies: - minipass: 7.1.2 - - statuses@1.5.0: {} - - statuses@2.0.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.2 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - - sucrase@3.35.1: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.15 - ts-interface-checker: 0.1.13 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - symbol-observable@4.0.0: {} - - tailwindcss@3.4.18: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) - postcss-nested: 6.2.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - resolve: 1.22.11 - sucrase: 3.35.1 - transitivePeerDependencies: - - tsx - - yaml - - tapable@2.3.0: {} - - 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 - - tar@7.5.2: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.1.0 - yallist: 5.0.0 - - terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.98.0): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(esbuild@0.25.4) - optionalDependencies: - esbuild: 0.25.4 - - terser@5.39.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - thingies@2.5.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - thunky@1.1.0: {} - - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tree-dump@1.1.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - tree-kill@1.2.2: {} - - ts-interface-checker@0.1.13: {} - - tslib@2.8.1: {} - - tuf-js@3.1.0: - dependencies: - '@tufjs/models': 3.0.1 - debug: 4.4.3 - make-fetch-happen: 14.0.3 - transitivePeerDependencies: - - supports-color - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-assert@1.0.9: {} - - typescript@5.6.3: {} - - undici-types@6.21.0: {} - - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 - - unicode-match-property-value-ecmascript@2.2.1: {} - - unicode-property-aliases-ecmascript@2.2.0: {} - - unicorn-magic@0.3.0: {} - - unique-filename@4.0.0: - dependencies: - unique-slug: 5.0.0 - - unique-slug@5.0.0: - dependencies: - imurmurhash: 0.1.4 - - unpipe@1.0.0: {} - - update-browserslist-db@1.1.4(browserslist@4.28.0): - dependencies: - browserslist: 4.28.0 - escalade: 3.2.0 - picocolors: 1.1.1 - - util-deprecate@1.0.2: {} - - utils-merge@1.0.1: {} - - uuid@8.3.2: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - validate-npm-package-name@6.0.2: {} - - vary@1.1.2: {} - - vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0): - dependencies: - esbuild: 0.25.4 - fdir: 6.5.0(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.53.3 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 20.19.25 - fsevents: 2.3.3 - jiti: 1.21.7 - less: 4.2.2 - sass: 1.85.0 - terser: 5.39.0 - - watchpack@2.4.2: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - watchpack@2.4.4: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - weak-lru-cache@1.2.2: - optional: true - - webpack-dev-middleware@7.4.2(webpack@5.98.0): - dependencies: - colorette: 2.0.20 - memfs: 4.51.0 - mime-types: 2.1.35 - on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.3 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - - webpack-dev-server@5.2.2(webpack@5.98.0): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.10 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.1 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.2.0 - launch-editor: 2.12.0 - open: 10.1.0 - p-retry: 6.2.1 - schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) - ws: 8.18.3 - optionalDependencies: - webpack: 5.98.0(esbuild@0.25.4) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-merge@6.0.1: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-sources@3.3.3: {} - - webpack-subresource-integrity@5.1.0(webpack@5.98.0(esbuild@0.25.4)): - dependencies: - typed-assert: 1.0.9 - webpack: 5.98.0(esbuild@0.25.4) - - webpack@5.98.0(esbuild@0.25.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.28.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.98.0) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - which@5.0.0: - dependencies: - isexe: 3.1.1 - - wildcard@2.0.1: {} - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - 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.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.1.2 - - ws@8.18.3: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yallist@5.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 - - yocto-queue@1.2.2: {} - - yoctocolors-cjs@2.1.3: {} - - zone.js@0.15.1: {} diff --git a/ui/postcss.config.js b/ui/postcss.config.js deleted file mode 100644 index 33ad091..0000000 --- a/ui/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/ui/proxy.conf.json b/ui/proxy.conf.json deleted file mode 100644 index 527d410..0000000 --- a/ui/proxy.conf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "/api": { - "target": "http://localhost:3000", - "secure": false, - "changeOrigin": true - } -} diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts deleted file mode 100644 index d9e892c..0000000 --- a/ui/src/app/app.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, inject } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; -import { ReloadService } from './core/services/reload.service'; - -@Component({ - selector: 'app-root', - standalone: true, - imports: [RouterOutlet], - template: ``, -}) -export class AppComponent { - // Inject to trigger instantiation for hot reload - private reloadService = inject(ReloadService); -} diff --git a/ui/src/app/app.config.ts b/ui/src/app/app.config.ts deleted file mode 100644 index fa77ec8..0000000 --- a/ui/src/app/app.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ApplicationConfig, provideExperimentalZonelessChangeDetection } from '@angular/core'; -import { provideRouter } from '@angular/router'; -import { provideHttpClient, withInterceptors } from '@angular/common/http'; -import { routes } from './app.routes'; -import { authInterceptor } from './core/interceptors/auth.interceptor'; -import { ReloadService } from './core/services/reload.service'; - -export const appConfig: ApplicationConfig = { - providers: [ - provideExperimentalZonelessChangeDetection(), - provideRouter(routes), - provideHttpClient(withInterceptors([authInterceptor])), - ReloadService, - ], -}; diff --git a/ui/src/app/app.routes.ts b/ui/src/app/app.routes.ts deleted file mode 100644 index d279839..0000000 --- a/ui/src/app/app.routes.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Routes } from '@angular/router'; -import { authGuard } from './core/guards/auth.guard'; -import { adminGuard } from './core/guards/admin.guard'; - -export const routes: Routes = [ - { - path: 'login', - loadComponent: () => - import('./features/login/login.component').then((m) => m.LoginComponent), - }, - { - path: 'oauth-callback', - loadComponent: () => - import('./features/oauth-callback/oauth-callback.component').then( - (m) => m.OAuthCallbackComponent - ), - }, - { - path: '', - loadComponent: () => - import('./shared/components/layout/layout.component').then( - (m) => m.LayoutComponent - ), - canActivate: [authGuard], - children: [ - { - path: '', - redirectTo: 'dashboard', - pathMatch: 'full', - }, - { - path: 'dashboard', - loadComponent: () => - import('./features/dashboard/dashboard.component').then( - (m) => m.DashboardComponent - ), - }, - { - path: 'organizations', - children: [ - { - path: '', - loadComponent: () => - import('./features/organizations/organizations.component').then( - (m) => m.OrganizationsComponent - ), - }, - { - path: ':orgName', - loadComponent: () => - import('./features/organizations/organization-detail.component').then( - (m) => m.OrganizationDetailComponent - ), - }, - { - path: ':orgName/repositories/:repoId', - loadComponent: () => - import('./features/repositories/repository-detail.component').then( - (m) => m.RepositoryDetailComponent - ), - }, - ], - }, - { - path: 'packages', - children: [ - { - path: '', - loadComponent: () => - import('./features/packages/packages.component').then( - (m) => m.PackagesComponent - ), - }, - { - path: ':packageId', - loadComponent: () => - import('./features/packages/package-detail.component').then( - (m) => m.PackageDetailComponent - ), - }, - ], - }, - { - path: 'tokens', - loadComponent: () => - import('./features/tokens/tokens.component').then( - (m) => m.TokensComponent - ), - }, - { - path: 'settings', - loadComponent: () => - import('./features/settings/settings.component').then( - (m) => m.SettingsComponent - ), - }, - // Admin routes - { - path: 'admin', - canActivate: [adminGuard], - children: [ - { - path: '', - redirectTo: 'auth', - pathMatch: 'full', - }, - { - path: 'auth', - loadComponent: () => - import('./features/admin/auth-providers/auth-providers.component').then( - (m) => m.AuthProvidersComponent - ), - }, - { - path: 'auth/providers/new', - loadComponent: () => - import('./features/admin/auth-providers/provider-form.component').then( - (m) => m.ProviderFormComponent - ), - }, - { - path: 'auth/providers/:id', - loadComponent: () => - import('./features/admin/auth-providers/provider-form.component').then( - (m) => m.ProviderFormComponent - ), - }, - ], - }, - ], - }, - { - path: '**', - redirectTo: 'dashboard', - }, -]; diff --git a/ui/src/app/core/guards/admin.guard.ts b/ui/src/app/core/guards/admin.guard.ts deleted file mode 100644 index d542432..0000000 --- a/ui/src/app/core/guards/admin.guard.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { inject } from '@angular/core'; -import { Router, type CanActivateFn } from '@angular/router'; -import { AuthService } from '../services/auth.service'; - -export const adminGuard: CanActivateFn = async () => { - const authService = inject(AuthService); - const router = inject(Router); - - // First check if authenticated - if (!authService.isAuthenticated()) { - // Try to refresh the token - const refreshed = await authService.refreshAccessToken(); - if (!refreshed) { - router.navigate(['/login']); - return false; - } - } - - // Then check if admin - if (!authService.isAdmin()) { - // Not an admin, redirect to dashboard - router.navigate(['/dashboard']); - return false; - } - - return true; -}; diff --git a/ui/src/app/core/guards/auth.guard.ts b/ui/src/app/core/guards/auth.guard.ts deleted file mode 100644 index ce6cd98..0000000 --- a/ui/src/app/core/guards/auth.guard.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { inject } from '@angular/core'; -import { Router, type CanActivateFn } from '@angular/router'; -import { AuthService } from '../services/auth.service'; - -export const authGuard: CanActivateFn = async () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isAuthenticated()) { - return true; - } - - // Try to refresh the token - const refreshed = await authService.refreshAccessToken(); - if (refreshed) { - return true; - } - - router.navigate(['/login']); - return false; -}; diff --git a/ui/src/app/core/interceptors/auth.interceptor.ts b/ui/src/app/core/interceptors/auth.interceptor.ts deleted file mode 100644 index 4115e5d..0000000 --- a/ui/src/app/core/interceptors/auth.interceptor.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { inject } from '@angular/core'; -import { - HttpInterceptorFn, - HttpRequest, - HttpHandlerFn, - HttpErrorResponse, -} from '@angular/common/http'; -import { catchError, switchMap, throwError, from, Observable } from 'rxjs'; -import { AuthService } from '../services/auth.service'; -import { Router } from '@angular/router'; - -export const authInterceptor: HttpInterceptorFn = ( - req: HttpRequest, - next: HttpHandlerFn -) => { - const authService = inject(AuthService); - const router = inject(Router); - - // Skip auth header for login/refresh endpoints - if (req.url.includes('/auth/login') || req.url.includes('/auth/refresh')) { - return next(req); - } - - const token = authService.accessToken; - if (token) { - req = req.clone({ - setHeaders: { - Authorization: `Bearer ${token}`, - }, - }); - } - - return next(req).pipe( - catchError((error: HttpErrorResponse) => { - if (error.status === 401) { - // Try to refresh the token using from() to convert Promise to Observable - return from(authService.refreshAccessToken()).pipe( - switchMap((success) => { - if (success) { - // Retry the request with new token - const newToken = authService.accessToken; - const retryReq = req.clone({ - setHeaders: { - Authorization: `Bearer ${newToken}`, - }, - }); - return next(retryReq); - } else { - // Redirect to login - router.navigate(['/login']); - return throwError(() => error); - } - }) - ); - } - return throwError(() => error); - }) - ); -}; diff --git a/ui/src/app/core/services/admin-auth.service.ts b/ui/src/app/core/services/admin-auth.service.ts deleted file mode 100644 index 54476cc..0000000 --- a/ui/src/app/core/services/admin-auth.service.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -// Types -export type TAuthProviderType = 'oidc' | 'ldap'; -export type TAuthProviderStatus = 'active' | 'disabled' | 'testing'; - -export interface IOAuthConfig { - clientId: string; - clientSecretEncrypted: string; - issuer: string; - authorizationUrl?: string; - tokenUrl?: string; - userInfoUrl?: string; - scopes: string[]; - callbackUrl: string; -} - -export interface ILdapConfig { - serverUrl: string; - bindDn: string; - bindPasswordEncrypted: string; - baseDn: string; - userSearchFilter: string; - tlsEnabled: boolean; - tlsCaCert?: string; -} - -export interface IAttributeMapping { - email: string; - username: string; - displayName: string; - avatarUrl?: string; - groups?: string; -} - -export interface IProvisioningSettings { - jitEnabled: boolean; - autoLinkByEmail: boolean; - allowedEmailDomains?: string[]; -} - -export interface IAuthProvider { - id: string; - name: string; - displayName: string; - type: TAuthProviderType; - status: TAuthProviderStatus; - priority: number; - oauthConfig?: IOAuthConfig; - ldapConfig?: ILdapConfig; - attributeMapping: IAttributeMapping; - provisioning: IProvisioningSettings; - createdAt: string; - updatedAt: string; - createdById: string; - lastTestedAt?: string; - lastTestResult?: 'success' | 'failure'; - lastTestError?: string; -} - -export interface IPlatformAuthSettings { - localAuthEnabled: boolean; - allowUserRegistration: boolean; - sessionDurationMinutes: number; - defaultProviderId?: string; -} - -export interface IPlatformSettings { - id: string; - auth: IPlatformAuthSettings; - updatedAt: string; - updatedById?: string; -} - -export interface IConnectionTestResult { - success: boolean; - latencyMs: number; - serverInfo?: Record; - error?: string; -} - -export interface ICreateAuthProviderDto { - name: string; - displayName: string; - type: TAuthProviderType; - oauthConfig?: IOAuthConfig; - ldapConfig?: ILdapConfig; - attributeMapping?: IAttributeMapping; - provisioning?: IProvisioningSettings; -} - -export interface IUpdateAuthProviderDto { - displayName?: string; - status?: TAuthProviderStatus; - priority?: number; - oauthConfig?: Partial; - ldapConfig?: Partial; - attributeMapping?: Partial; - provisioning?: Partial; -} - -@Injectable({ providedIn: 'root' }) -export class AdminAuthService { - constructor(private http: HttpClient) {} - - // Provider CRUD - listProviders(): Observable<{ providers: IAuthProvider[] }> { - return this.http.get<{ providers: IAuthProvider[] }>('/api/v1/admin/auth/providers'); - } - - getProvider(id: string): Observable { - return this.http.get(`/api/v1/admin/auth/providers/${id}`); - } - - createProvider(dto: ICreateAuthProviderDto): Observable { - return this.http.post('/api/v1/admin/auth/providers', dto); - } - - updateProvider(id: string, dto: IUpdateAuthProviderDto): Observable { - return this.http.put(`/api/v1/admin/auth/providers/${id}`, dto); - } - - deleteProvider(id: string): Observable<{ message: string }> { - return this.http.delete<{ message: string }>(`/api/v1/admin/auth/providers/${id}`); - } - - testProvider(id: string): Observable { - return this.http.post(`/api/v1/admin/auth/providers/${id}/test`, {}); - } - - // Platform settings - getSettings(): Observable { - return this.http.get('/api/v1/admin/auth/settings'); - } - - updateSettings(settings: Partial<{ auth: Partial }>): Observable { - return this.http.put('/api/v1/admin/auth/settings', settings); - } -} diff --git a/ui/src/app/core/services/api.service.ts b/ui/src/app/core/services/api.service.ts deleted file mode 100644 index b573791..0000000 --- a/ui/src/app/core/services/api.service.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -// Types -export interface IOrganization { - id: string; - name: string; - displayName: string; - description?: string; - avatarUrl?: string; - isPublic: boolean; - memberCount: number; - createdAt: string; -} - -export interface IRepository { - id: string; - organizationId: string; - name: string; - displayName: string; - description?: string; - protocols: string[]; - isPublic: boolean; - packageCount: number; - createdAt: string; -} - -export interface IPackage { - id: string; - name: string; - description?: string; - protocol: string; - organizationId: string; - repositoryId: string; - latestVersion?: string; - isPrivate: boolean; - downloadCount: number; - updatedAt: string; -} - -export interface ITokenScope { - protocol: string; - organizationId?: string; - repositoryId?: string; - actions: string[]; -} - -export interface IToken { - id: string; - name: string; - tokenPrefix: string; - protocols: string[]; - scopes?: ITokenScope[]; - organizationId?: string; - createdById?: string; - expiresAt?: string; - lastUsedAt?: string; - usageCount: number; - createdAt: string; -} - -export interface IAuditLog { - id: string; - actorId?: string; - actorType: string; - action: string; - resourceType: string; - resourceId?: string; - resourceName?: string; - success: boolean; - timestamp: string; -} - -@Injectable({ providedIn: 'root' }) -export class ApiService { - private readonly baseUrl = '/api/v1'; - - constructor(private http: HttpClient) {} - - // Organizations - getOrganizations(): Observable<{ organizations: IOrganization[] }> { - return this.http.get<{ organizations: IOrganization[] }>( - `${this.baseUrl}/organizations` - ); - } - - getOrganization(id: string): Observable { - return this.http.get(`${this.baseUrl}/organizations/${id}`); - } - - createOrganization(data: { - name: string; - displayName?: string; - description?: string; - isPublic?: boolean; - }): Observable { - return this.http.post(`${this.baseUrl}/organizations`, data); - } - - updateOrganization( - id: string, - data: Partial - ): Observable { - return this.http.put( - `${this.baseUrl}/organizations/${id}`, - data - ); - } - - deleteOrganization(id: string): Observable<{ message: string }> { - return this.http.delete<{ message: string }>( - `${this.baseUrl}/organizations/${id}` - ); - } - - // Repositories - getRepositories(orgId: string): Observable<{ repositories: IRepository[] }> { - return this.http.get<{ repositories: IRepository[] }>( - `${this.baseUrl}/organizations/${orgId}/repositories` - ); - } - - getRepository(id: string): Observable { - return this.http.get(`${this.baseUrl}/repositories/${id}`); - } - - createRepository( - orgId: string, - data: { - name: string; - displayName?: string; - description?: string; - protocols?: string[]; - isPublic?: boolean; - } - ): Observable { - return this.http.post( - `${this.baseUrl}/organizations/${orgId}/repositories`, - data - ); - } - - updateRepository( - id: string, - data: Partial - ): Observable { - return this.http.put(`${this.baseUrl}/repositories/${id}`, data); - } - - deleteRepository(id: string): Observable<{ message: string }> { - return this.http.delete<{ message: string }>( - `${this.baseUrl}/repositories/${id}` - ); - } - - // Packages - searchPackages(params?: { - q?: string; - protocol?: string; - organizationId?: string; - limit?: number; - offset?: number; - }): Observable<{ packages: IPackage[]; total: number }> { - let httpParams = new HttpParams(); - if (params?.q) httpParams = httpParams.set('q', params.q); - if (params?.protocol) httpParams = httpParams.set('protocol', params.protocol); - if (params?.organizationId) - httpParams = httpParams.set('organizationId', params.organizationId); - if (params?.limit) httpParams = httpParams.set('limit', params.limit.toString()); - if (params?.offset) httpParams = httpParams.set('offset', params.offset.toString()); - - return this.http.get<{ packages: IPackage[]; total: number }>( - `${this.baseUrl}/packages`, - { params: httpParams } - ); - } - - getPackage(id: string): Observable { - return this.http.get( - `${this.baseUrl}/packages/${encodeURIComponent(id)}` - ); - } - - deletePackage(id: string): Observable<{ message: string }> { - return this.http.delete<{ message: string }>( - `${this.baseUrl}/packages/${encodeURIComponent(id)}` - ); - } - - // Tokens - getTokens(organizationId?: string): Observable<{ tokens: IToken[] }> { - let httpParams = new HttpParams(); - if (organizationId) { - httpParams = httpParams.set('organizationId', organizationId); - } - return this.http.get<{ tokens: IToken[] }>(`${this.baseUrl}/tokens`, { - params: httpParams, - }); - } - - createToken(data: { - name: string; - organizationId?: string; - protocols: string[]; - scopes: ITokenScope[]; - expiresInDays?: number; - }): Observable { - return this.http.post( - `${this.baseUrl}/tokens`, - data - ); - } - - revokeToken(id: string): Observable<{ message: string }> { - return this.http.delete<{ message: string }>(`${this.baseUrl}/tokens/${id}`); - } - - // Audit - getAuditLogs(params?: { - organizationId?: string; - resourceType?: string; - startDate?: string; - endDate?: string; - limit?: number; - offset?: number; - }): Observable<{ logs: IAuditLog[]; total: number }> { - let httpParams = new HttpParams(); - if (params?.organizationId) - httpParams = httpParams.set('organizationId', params.organizationId); - if (params?.resourceType) - httpParams = httpParams.set('resourceType', params.resourceType); - if (params?.startDate) httpParams = httpParams.set('startDate', params.startDate); - if (params?.endDate) httpParams = httpParams.set('endDate', params.endDate); - if (params?.limit) httpParams = httpParams.set('limit', params.limit.toString()); - if (params?.offset) httpParams = httpParams.set('offset', params.offset.toString()); - - return this.http.get<{ logs: IAuditLog[]; total: number }>( - `${this.baseUrl}/audit`, - { params: httpParams } - ); - } -} diff --git a/ui/src/app/core/services/auth.service.ts b/ui/src/app/core/services/auth.service.ts deleted file mode 100644 index 5c20a63..0000000 --- a/ui/src/app/core/services/auth.service.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Injectable, signal, computed } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Router } from '@angular/router'; -import { firstValueFrom } from 'rxjs'; - -export interface IUser { - id: string; - email: string; - username: string; - displayName: string; - avatarUrl?: string; - isSystemAdmin: boolean; -} - -export interface ILoginResponse { - user: IUser; - accessToken: string; - refreshToken: string; - sessionId: string; -} - -@Injectable({ providedIn: 'root' }) -export class AuthService { - private readonly _user = signal(null); - private readonly _accessToken = signal(null); - private readonly _refreshToken = signal(null); - private readonly _sessionId = signal(null); - - readonly user = this._user.asReadonly(); - readonly isAuthenticated = computed(() => !!this._accessToken()); - readonly isAdmin = computed(() => this._user()?.isSystemAdmin ?? false); - - constructor( - private http: HttpClient, - private router: Router - ) { - this.loadFromStorage(); - } - - get accessToken(): string | null { - return this._accessToken(); - } - - async login(email: string, password: string): Promise { - try { - const response = await firstValueFrom( - this.http.post('/api/v1/auth/login', { email, password }) - ); - - this._user.set(response.user); - this._accessToken.set(response.accessToken); - this._refreshToken.set(response.refreshToken); - this._sessionId.set(response.sessionId); - - this.saveToStorage(); - return true; - } catch (error) { - console.error('Login failed:', error); - return false; - } - } - - async logout(): Promise { - try { - const sessionId = this._sessionId(); - if (sessionId) { - await firstValueFrom( - this.http.post('/api/v1/auth/logout', { sessionId }) - ).catch(() => {}); - } - } finally { - this.clearAuth(); - this.router.navigate(['/login']); - } - } - - async refreshAccessToken(): Promise { - const refreshToken = this._refreshToken(); - if (!refreshToken) return false; - - try { - const response = await firstValueFrom( - this.http.post<{ accessToken: string }>('/api/v1/auth/refresh', { - refreshToken, - }) - ); - - this._accessToken.set(response.accessToken); - this.saveToStorage(); - return true; - } catch { - this.clearAuth(); - return false; - } - } - - async fetchCurrentUser(): Promise { - try { - const user = await firstValueFrom( - this.http.get('/api/v1/auth/me') - ); - this._user.set(user); - return user; - } catch { - return null; - } - } - - /** - * Handle OAuth callback tokens from external providers - */ - handleOAuthCallback(accessToken: string, refreshToken: string, sessionId: string): void { - this._accessToken.set(accessToken); - this._refreshToken.set(refreshToken); - this._sessionId.set(sessionId); - this.saveToStorage(); - - // Fetch user info asynchronously - this.fetchCurrentUser(); - } - - private loadFromStorage(): void { - const accessToken = localStorage.getItem('accessToken'); - const refreshToken = localStorage.getItem('refreshToken'); - const sessionId = localStorage.getItem('sessionId'); - const userJson = localStorage.getItem('user'); - - if (accessToken) this._accessToken.set(accessToken); - if (refreshToken) this._refreshToken.set(refreshToken); - if (sessionId) this._sessionId.set(sessionId); - if (userJson) { - try { - this._user.set(JSON.parse(userJson)); - } catch {} - } - } - - private saveToStorage(): void { - const accessToken = this._accessToken(); - const refreshToken = this._refreshToken(); - const sessionId = this._sessionId(); - const user = this._user(); - - if (accessToken) localStorage.setItem('accessToken', accessToken); - if (refreshToken) localStorage.setItem('refreshToken', refreshToken); - if (sessionId) localStorage.setItem('sessionId', sessionId); - if (user) localStorage.setItem('user', JSON.stringify(user)); - } - - private clearAuth(): void { - this._user.set(null); - this._accessToken.set(null); - this._refreshToken.set(null); - this._sessionId.set(null); - - localStorage.removeItem('accessToken'); - localStorage.removeItem('refreshToken'); - localStorage.removeItem('sessionId'); - localStorage.removeItem('user'); - } -} diff --git a/ui/src/app/core/services/reload.service.ts b/ui/src/app/core/services/reload.service.ts deleted file mode 100644 index fe60526..0000000 --- a/ui/src/app/core/services/reload.service.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Injectable, signal } from '@angular/core'; - -/** - * Service for automatic page reload when server restarts. - * Connects to WebSocket endpoint and monitors server instance ID. - * When server restarts with new ID, page automatically reloads. - */ -@Injectable({ providedIn: 'root' }) -export class ReloadService { - private ws: WebSocket | null = null; - private instanceId = signal(null); - private reconnectAttempts = 0; - private maxReconnectAttempts = 10; - private reconnectTimeout: ReturnType | null = null; - - constructor() { - this.connect(); - } - - private connect(): void { - // Clean up any existing connection - if (this.ws) { - this.ws.close(); - this.ws = null; - } - - const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - const wsUrl = `${protocol}//${location.host}/ws/reload`; - - try { - this.ws = new WebSocket(wsUrl); - - this.ws.onopen = () => { - console.log('[ReloadService] Connected to server'); - this.reconnectAttempts = 0; - }; - - this.ws.onmessage = (event) => { - try { - const data = JSON.parse(event.data); - if (data.type === 'instance') { - const currentId = this.instanceId(); - if (currentId !== null && currentId !== data.id) { - // Server restarted with new ID - reload page - console.log('[ReloadService] Server restarted, reloading...'); - location.reload(); - } else { - console.log(`[ReloadService] Instance ID: ${data.id}`); - } - this.instanceId.set(data.id); - } - } catch (e) { - console.error('[ReloadService] Failed to parse message:', e); - } - }; - - this.ws.onclose = () => { - console.log('[ReloadService] Connection closed'); - this.scheduleReconnect(); - }; - - this.ws.onerror = (error) => { - console.error('[ReloadService] WebSocket error:', error); - this.ws?.close(); - }; - } catch (e) { - console.error('[ReloadService] Failed to create WebSocket:', e); - this.scheduleReconnect(); - } - } - - private scheduleReconnect(): void { - if (this.reconnectTimeout) { - clearTimeout(this.reconnectTimeout); - } - - if (this.reconnectAttempts < this.maxReconnectAttempts) { - const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 10000); - this.reconnectAttempts++; - console.log(`[ReloadService] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`); - this.reconnectTimeout = setTimeout(() => this.connect(), delay); - } else { - console.log('[ReloadService] Max reconnect attempts reached'); - } - } -} diff --git a/ui/src/app/core/services/toast.service.ts b/ui/src/app/core/services/toast.service.ts deleted file mode 100644 index 7f59239..0000000 --- a/ui/src/app/core/services/toast.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable, signal } from '@angular/core'; - -export interface IToast { - id: string; - type: 'success' | 'error' | 'warning' | 'info'; - title: string; - message?: string; - duration?: number; -} - -@Injectable({ providedIn: 'root' }) -export class ToastService { - private _toasts = signal([]); - readonly toasts = this._toasts.asReadonly(); - - show(toast: Omit): void { - const id = crypto.randomUUID(); - const newToast: IToast = { ...toast, id }; - this._toasts.update((toasts) => [...toasts, newToast]); - - const duration = toast.duration ?? 5000; - if (duration > 0) { - setTimeout(() => this.dismiss(id), duration); - } - } - - success(title: string, message?: string): void { - this.show({ type: 'success', title, message }); - } - - error(title: string, message?: string): void { - this.show({ type: 'error', title, message }); - } - - warning(title: string, message?: string): void { - this.show({ type: 'warning', title, message }); - } - - info(title: string, message?: string): void { - this.show({ type: 'info', title, message }); - } - - dismiss(id: string): void { - this._toasts.update((toasts) => toasts.filter((t) => t.id !== id)); - } - - clear(): void { - this._toasts.set([]); - } -} diff --git a/ui/src/app/features/admin/auth-providers/auth-providers.component.ts b/ui/src/app/features/admin/auth-providers/auth-providers.component.ts deleted file mode 100644 index 22f8223..0000000 --- a/ui/src/app/features/admin/auth-providers/auth-providers.component.ts +++ /dev/null @@ -1,522 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { - AdminAuthService, - type IAuthProvider, - type IPlatformSettings, - type TAuthProviderStatus, -} from '../../../core/services/admin-auth.service'; -import { ToastService } from '../../../core/services/toast.service'; - -@Component({ - selector: 'app-auth-providers', - standalone: true, - template: ` -
-
-
-
-
- -
-

Authentication Providers

-

Configure OAuth and LDAP authentication

-
- -
- - -
-
-
-
- Platform Settings -
-
-
- @if (settings()) { -
-
-
-

Local Authentication

-

Allow email/password login

-
- -
-
-
-

User Registration

-

Allow new account creation

-
- -
-
-
-

Session Duration

-

{{ formatDuration(settings()!.auth.sessionDurationMinutes) }}

-
- -
-
- } @else { -
-
-
-
-
-
- } -
-
- - - @if (loading()) { -
- - - - -
- } @else if (providers().length === 0) { -
- - - -

No providers configured

-

Add an OAuth or LDAP provider to enable single sign-on

- -
- } @else { -
- @for (provider of providers(); track provider.id) { -
-
-
-
- @if (provider.type === 'oidc') { - - - - } @else { - - - - } -
-
-
-

{{ provider.displayName }}

- {{ provider.status }} - @if (settings()?.auth?.defaultProviderId === provider.id) { - Default - } -
-

{{ provider.name }} · {{ provider.type.toUpperCase() }}

- @if (provider.type === 'oidc' && provider.oauthConfig) { -

{{ provider.oauthConfig.issuer }}

- } - @if (provider.type === 'ldap' && provider.ldapConfig) { -

{{ provider.ldapConfig.serverUrl }}

- } - @if (provider.lastTestedAt) { -
- @if (provider.lastTestResult === 'success') { - - - - - Connection OK - - } @else { - - - - - Connection Failed - - } - - tested {{ formatDate(provider.lastTestedAt) }} - -
- } -
-
- - - -
-
-
-
- } -
- } - - - @if (showCreateModal()) { - - } - - - @if (providerToDelete()) { - - } - - - @if (showSettingsModal()) { - - } -
- `, -}) -export class AuthProvidersComponent implements OnInit { - private adminAuthService = inject(AdminAuthService); - private toastService = inject(ToastService); - - providers = signal([]); - settings = signal(null); - loading = signal(true); - testing = signal(null); - deleting = signal(false); - savingSettings = signal(false); - - showCreateModal = signal(false); - showSettingsModal = signal(false); - providerToDelete = signal(null); - selectedProviderForEdit = signal(null); - - editingSettings = { - sessionDurationMinutes: 10080, - defaultProviderId: undefined as string | undefined, - }; - - ngOnInit(): void { - this.loadData(); - } - - private async loadData(): Promise { - this.loading.set(true); - try { - const [providersRes, settingsRes] = await Promise.all([ - this.adminAuthService.listProviders().toPromise(), - this.adminAuthService.getSettings().toPromise(), - ]); - this.providers.set(providersRes?.providers || []); - if (settingsRes) { - this.settings.set(settingsRes); - this.editingSettings = { - sessionDurationMinutes: settingsRes.auth.sessionDurationMinutes, - defaultProviderId: settingsRes.auth.defaultProviderId, - }; - } - } catch (error) { - this.toastService.error('Failed to load authentication settings'); - } finally { - this.loading.set(false); - } - } - - createProvider(type: 'oidc' | 'ldap'): void { - this.showCreateModal.set(false); - // Navigate to provider form - window.location.href = `/admin/auth/providers/new?type=${type}`; - } - - editProvider(provider: IAuthProvider): void { - window.location.href = `/admin/auth/providers/${provider.id}`; - } - - async testProvider(provider: IAuthProvider): Promise { - this.testing.set(provider.id); - try { - const result = await this.adminAuthService.testProvider(provider.id).toPromise(); - if (result?.success) { - this.toastService.success(`Connection successful (${result.latencyMs}ms)`); - } else { - this.toastService.error(result?.error || 'Connection failed'); - } - // Reload to get updated test results - await this.loadData(); - } catch (error) { - this.toastService.error('Failed to test provider'); - } finally { - this.testing.set(null); - } - } - - confirmDelete(provider: IAuthProvider): void { - this.providerToDelete.set(provider); - } - - async deleteProvider(): Promise { - const provider = this.providerToDelete(); - if (!provider) return; - - this.deleting.set(true); - try { - await this.adminAuthService.deleteProvider(provider.id).toPromise(); - this.toastService.success('Provider deleted'); - this.providerToDelete.set(null); - await this.loadData(); - } catch (error) { - this.toastService.error('Failed to delete provider'); - } finally { - this.deleting.set(false); - } - } - - async toggleLocalAuth(): Promise { - const current = this.settings(); - if (!current) return; - - try { - await this.adminAuthService.updateSettings({ - auth: { localAuthEnabled: !current.auth.localAuthEnabled }, - }).toPromise(); - this.toastService.success('Settings updated'); - await this.loadData(); - } catch (error) { - this.toastService.error('Failed to update settings'); - } - } - - async toggleRegistration(): Promise { - const current = this.settings(); - if (!current) return; - - try { - await this.adminAuthService.updateSettings({ - auth: { allowUserRegistration: !current.auth.allowUserRegistration }, - }).toPromise(); - this.toastService.success('Settings updated'); - await this.loadData(); - } catch (error) { - this.toastService.error('Failed to update settings'); - } - } - - async saveSettings(): Promise { - this.savingSettings.set(true); - try { - await this.adminAuthService.updateSettings({ - auth: { - sessionDurationMinutes: this.editingSettings.sessionDurationMinutes, - defaultProviderId: this.editingSettings.defaultProviderId, - }, - }).toPromise(); - this.toastService.success('Settings saved'); - this.showSettingsModal.set(false); - await this.loadData(); - } catch (error) { - this.toastService.error('Failed to save settings'); - } finally { - this.savingSettings.set(false); - } - } - - getProviderIconClass(type: string): string { - return type === 'oidc' ? 'bg-primary/10 text-primary' : 'bg-accent/10 text-accent'; - } - - getStatusBadgeClass(status: TAuthProviderStatus): string { - switch (status) { - case 'active': - return 'badge-accent'; - case 'testing': - return 'badge-warning'; - case 'disabled': - return 'badge-secondary'; - default: - return 'badge-secondary'; - } - } - - formatDuration(minutes: number): string { - if (minutes < 60) return `${minutes} minutes`; - if (minutes < 1440) return `${Math.round(minutes / 60)} hours`; - return `${Math.round(minutes / 1440)} days`; - } - - formatDate(dateStr: string): string { - const date = new Date(dateStr); - const now = new Date(); - const diff = now.getTime() - date.getTime(); - const minutes = Math.floor(diff / 60000); - if (minutes < 1) return 'just now'; - if (minutes < 60) return `${minutes}m ago`; - const hours = Math.floor(minutes / 60); - if (hours < 24) return `${hours}h ago`; - const days = Math.floor(hours / 24); - return `${days}d ago`; - } -} diff --git a/ui/src/app/features/admin/auth-providers/provider-form.component.ts b/ui/src/app/features/admin/auth-providers/provider-form.component.ts deleted file mode 100644 index 7dec057..0000000 --- a/ui/src/app/features/admin/auth-providers/provider-form.component.ts +++ /dev/null @@ -1,705 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Router, ActivatedRoute } from '@angular/router'; -import { - AdminAuthService, - type IAuthProvider, - type ICreateAuthProviderDto, - type IUpdateAuthProviderDto, - type TAuthProviderType, - type TAuthProviderStatus, -} from '../../../core/services/admin-auth.service'; -import { ToastService } from '../../../core/services/toast.service'; - -@Component({ - selector: 'app-provider-form', - standalone: true, - imports: [FormsModule], - template: ` -
-
-
-
- -
-

- {{ isEditMode() ? 'Edit Provider' : 'New ' + (providerType() === 'oidc' ? 'OAuth/OIDC' : 'LDAP') + ' Provider' }} -

-
- - @if (loading()) { -
- - - - -
- } @else { -
- -
-
-
-
- Basic Information -
-
-
-
-
- - -

Lowercase, alphanumeric with hyphens

-
-
- - -

Shown on login page

-
-
- @if (isEditMode()) { -
-
- - -
-
- - -

Higher = shown first (0-100)

-
-
- } -
-
- - - @if (providerType() === 'oidc') { -
-
-
-
- OAuth / OIDC Configuration -
-
-
-
- - -

OIDC discovery endpoint base URL

-
-
-
- - -
-
- - -

- @if (isEditMode()) { - Leave empty to keep existing secret - } @else { - Will be encrypted at rest - } -

-
-
-
- - -

Space-separated OAuth scopes

-
-
- -
- - -
-

Add this to your OAuth provider's allowed redirect URIs

-
- - -
- - Advanced Settings - -
-
- - -
-
- - -
-
- - -
-
-
-
-
- } - - - @if (providerType() === 'ldap') { -
-
-
-
- LDAP Configuration -
-
-
-
- - -

LDAP or LDAPS protocol URL

-
-
-
- - -
-
- - -

- @if (isEditMode()) { - Leave empty to keep existing password - } @else { - Will be encrypted at rest - } -

-
-
-
- - -

Base DN for user searches

-
-
- - -

Use double-brace username placeholder

-
-
- -
- @if (form.ldapConfig.tlsEnabled) { -
- - -

PEM-encoded CA certificate for self-signed servers

-
- } -
-
- } - - -
-
-
-
- Attribute Mapping -
-
-
-

- Map provider attributes to user fields. Use claim names for OAuth or attribute names for LDAP. -

-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -

For future group sync functionality

-
-
-
- - -
-
-
-
- User Provisioning -
-
-
-
- -
-

- Automatically create user accounts on first login -

- -
- -
-

- Automatically link to existing accounts with matching email addresses -

- -
- - -

- Comma-separated. Leave empty to allow all domains. -

-
-
-
- - -
- -
- @if (isEditMode()) { - - } - -
-
-
- } -
- `, -}) -export class ProviderFormComponent implements OnInit { - private adminAuthService = inject(AdminAuthService); - private toastService = inject(ToastService); - private router = inject(Router); - private route = inject(ActivatedRoute); - - loading = signal(true); - saving = signal(false); - testing = signal(false); - isEditMode = signal(false); - providerType = signal('oidc'); - providerId = signal(null); - - scopesInput = 'openid profile email'; - domainsInput = ''; - - form = { - name: '', - displayName: '', - status: 'testing' as TAuthProviderStatus, - priority: 0, - oauthConfig: { - clientId: '', - clientSecretEncrypted: '', - issuer: '', - authorizationUrl: '', - tokenUrl: '', - userInfoUrl: '', - scopes: ['openid', 'profile', 'email'], - callbackUrl: '', - }, - ldapConfig: { - serverUrl: '', - bindDn: '', - bindPasswordEncrypted: '', - baseDn: '', - userSearchFilter: '(uid={{username}})', - tlsEnabled: false, - tlsCaCert: '', - }, - attributeMapping: { - email: 'email', - username: 'preferred_username', - displayName: 'name', - avatarUrl: '', - groups: '', - }, - provisioning: { - jitEnabled: true, - autoLinkByEmail: true, - allowedEmailDomains: [] as string[], - }, - }; - - ngOnInit(): void { - // Check for edit mode - const id = this.route.snapshot.paramMap.get('id'); - if (id && id !== 'new') { - this.isEditMode.set(true); - this.providerId.set(id); - this.loadProvider(id); - } else { - // New provider mode - const type = this.route.snapshot.queryParamMap.get('type') as TAuthProviderType; - if (type && (type === 'oidc' || type === 'ldap')) { - this.providerType.set(type); - this.setDefaultMappings(type); - } - this.loading.set(false); - } - } - - private async loadProvider(id: string): Promise { - try { - const provider = await this.adminAuthService.getProvider(id).toPromise(); - if (provider) { - this.providerType.set(provider.type); - this.form.name = provider.name; - this.form.displayName = provider.displayName; - this.form.status = provider.status; - this.form.priority = provider.priority; - - if (provider.oauthConfig) { - this.form.oauthConfig = { - ...this.form.oauthConfig, - ...provider.oauthConfig, - clientSecretEncrypted: '', // Don't show encrypted secret - }; - this.scopesInput = provider.oauthConfig.scopes.join(' '); - } - - if (provider.ldapConfig) { - this.form.ldapConfig = { - ...this.form.ldapConfig, - ...provider.ldapConfig, - bindPasswordEncrypted: '', // Don't show encrypted password - }; - } - - if (provider.attributeMapping) { - this.form.attributeMapping = { ...this.form.attributeMapping, ...provider.attributeMapping }; - } - - if (provider.provisioning) { - this.form.provisioning = { ...this.form.provisioning, ...provider.provisioning }; - this.domainsInput = provider.provisioning.allowedEmailDomains?.join(', ') || ''; - } - } - } catch (error) { - this.toastService.error('Failed to load provider'); - this.router.navigate(['/admin/auth']); - } finally { - this.loading.set(false); - } - } - - private setDefaultMappings(type: TAuthProviderType): void { - if (type === 'ldap') { - this.form.attributeMapping = { - email: 'mail', - username: 'uid', - displayName: 'cn', - avatarUrl: '', - groups: 'memberOf', - }; - this.form.ldapConfig.userSearchFilter = '(uid={{username}})'; - } - } - - getCallbackUrl(): string { - const baseUrl = window.location.origin; - const providerName = this.form.name || '{provider-name}'; - return `${baseUrl}/api/v1/auth/oauth/${providerName}/callback`; - } - - copyCallbackUrl(): void { - navigator.clipboard.writeText(this.getCallbackUrl()); - this.toastService.success('Callback URL copied'); - } - - async saveProvider(): Promise { - // Parse scopes and domains - this.form.oauthConfig.scopes = this.scopesInput.split(/\s+/).filter(Boolean); - this.form.provisioning.allowedEmailDomains = this.domainsInput - .split(',') - .map((d) => d.trim()) - .filter(Boolean); - - this.saving.set(true); - - try { - if (this.isEditMode()) { - // Update existing provider - const dto: IUpdateAuthProviderDto = { - displayName: this.form.displayName, - status: this.form.status, - priority: this.form.priority, - attributeMapping: this.form.attributeMapping, - provisioning: this.form.provisioning, - }; - - if (this.providerType() === 'oidc') { - dto.oauthConfig = { ...this.form.oauthConfig }; - // Only include secret if changed - if (!dto.oauthConfig.clientSecretEncrypted) { - delete dto.oauthConfig.clientSecretEncrypted; - } - } else { - dto.ldapConfig = { ...this.form.ldapConfig }; - // Only include password if changed - if (!dto.ldapConfig.bindPasswordEncrypted) { - delete dto.ldapConfig.bindPasswordEncrypted; - } - } - - await this.adminAuthService.updateProvider(this.providerId()!, dto).toPromise(); - this.toastService.success('Provider updated'); - } else { - // Create new provider - const dto: ICreateAuthProviderDto = { - name: this.form.name, - displayName: this.form.displayName, - type: this.providerType(), - attributeMapping: this.form.attributeMapping, - provisioning: this.form.provisioning, - }; - - if (this.providerType() === 'oidc') { - dto.oauthConfig = { - ...this.form.oauthConfig, - callbackUrl: this.getCallbackUrl(), - }; - } else { - dto.ldapConfig = this.form.ldapConfig; - } - - await this.adminAuthService.createProvider(dto).toPromise(); - this.toastService.success('Provider created'); - } - - this.router.navigate(['/admin/auth']); - } catch (error: any) { - const message = error?.error?.error || 'Failed to save provider'; - this.toastService.error(message); - } finally { - this.saving.set(false); - } - } - - async testConnection(): Promise { - if (!this.providerId()) return; - - this.testing.set(true); - try { - const result = await this.adminAuthService.testProvider(this.providerId()!).toPromise(); - if (result?.success) { - this.toastService.success(`Connection successful (${result.latencyMs}ms)`); - } else { - this.toastService.error(result?.error || 'Connection failed'); - } - } catch (error) { - this.toastService.error('Failed to test connection'); - } finally { - this.testing.set(false); - } - } - - cancel(): void { - this.router.navigate(['/admin/auth']); - } -} diff --git a/ui/src/app/features/dashboard/dashboard.component.ts b/ui/src/app/features/dashboard/dashboard.component.ts deleted file mode 100644 index 63dd1de..0000000 --- a/ui/src/app/features/dashboard/dashboard.component.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { RouterLink } from '@angular/router'; -import { ApiService, type IOrganization, type IPackage } from '../../core/services/api.service'; -import { AuthService } from '../../core/services/auth.service'; - -@Component({ - selector: 'app-dashboard', - standalone: true, - imports: [RouterLink], - template: ` -
- -
-
-
- -
-

Welcome back, {{ userName() }}

-
- - -
-
-
-
- - - -
-
-

Organizations

-

{{ organizations().length }}

-
-
-
- -
-
-
- - - -
-
-

Packages

-

{{ packages().length }}

-
-
-
- -
-
-
- - - -
-
-

Total Downloads

-

{{ totalDownloads() }}

-
-
-
- -
-
-
- - - -
-
-

Last Activity

-

Today

-
-
-
-
- - -
- -
-
-
-
- Recent Packages -
- View all -
-
- @if (packages().length === 0) { -
- No packages yet -
- } @else { -
    - @for (pkg of packages().slice(0, 5); track pkg.id) { -
  • -
    -
    -

    {{ pkg.name }}

    -

    {{ pkg.protocol }} · {{ pkg.latestVersion || 'No versions' }}

    -
    - {{ pkg.downloadCount }} downloads -
    -
  • - } -
- } -
-
- - -
-
-
-
- Your Organizations -
- View all -
-
- @if (organizations().length === 0) { -
- No organizations yet -
- } @else { - - } -
-
-
- - - -
- `, -}) -export class DashboardComponent implements OnInit { - private authService = inject(AuthService); - private apiService = inject(ApiService); - - organizations = signal([]); - packages = signal([]); - totalDownloads = signal(0); - - userName = () => this.authService.user()?.displayName || 'User'; - - ngOnInit(): void { - this.loadData(); - } - - private async loadData(): Promise { - try { - const [orgsResponse, packagesResponse] = await Promise.all([ - this.apiService.getOrganizations().toPromise(), - this.apiService.searchPackages({ limit: 10 }).toPromise(), - ]); - - this.organizations.set(orgsResponse?.organizations || []); - this.packages.set(packagesResponse?.packages || []); - - const totalDownloads = (packagesResponse?.packages || []).reduce( - (sum, pkg) => sum + pkg.downloadCount, - 0 - ); - this.totalDownloads.set(totalDownloads); - } catch (error) { - console.error('Failed to load dashboard data:', error); - } - } -} diff --git a/ui/src/app/features/login/login.component.ts b/ui/src/app/features/login/login.component.ts deleted file mode 100644 index 03c645e..0000000 --- a/ui/src/app/features/login/login.component.ts +++ /dev/null @@ -1,393 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Router } from '@angular/router'; -import { HttpClient } from '@angular/common/http'; -import { AuthService } from '../../core/services/auth.service'; -import { ToastService } from '../../core/services/toast.service'; -import { firstValueFrom } from 'rxjs'; - -interface IPublicProvider { - id: string; - name: string; - displayName: string; - type: 'oidc' | 'ldap'; -} - -interface IProvidersResponse { - providers: IPublicProvider[]; - localAuthEnabled: boolean; - defaultProviderId?: string; -} - -@Component({ - selector: 'app-login', - standalone: true, - imports: [FormsModule], - template: ` -
-
- -
-
- - - -
-

Stack.Gallery

-

Registry

-
- - @if (loadingProviders()) { -
- - - - -
- } @else { - - @if (oauthProviders().length > 0) { -
- @for (provider of oauthProviders(); track provider.id) { - - } -
- } - - - @if (ldapProviders().length > 0 && !showLdapForm()) { -
- @for (provider of ldapProviders(); track provider.id) { - - } -
- } - - - @if (showLdapForm() && selectedLdapProvider()) { -
-
-
-
-
- {{ selectedLdapProvider()!.displayName }} -
- -
-
- - -
-
- - -
-
- - @if (ldapError()) { -
-

{{ ldapError() }}

-
- } - -
- - -
-
- } - - - @if ((oauthProviders().length > 0 || ldapProviders().length > 0) && localAuthEnabled() && !showLdapForm()) { -
-
- or -
-
- } - - - @if (localAuthEnabled() && !showLdapForm()) { -
- -
-
-
-
- Sign In -
- -
-
- - -
- -
- - -
-
- - @if (error()) { -
-

{{ error() }}

-
- } - - -
- } - - - @if (!localAuthEnabled() && oauthProviders().length === 0 && ldapProviders().length === 0 && !showLdapForm()) { -
- - - -

- No authentication methods available. Please contact your administrator. -

-
- } - } - -

- Enterprise Package Registry -

-
-
- `, -}) -export class LoginComponent implements OnInit { - private authService = inject(AuthService); - private router = inject(Router); - private toastService = inject(ToastService); - private http = inject(HttpClient); - - // Local login - email = ''; - password = ''; - loading = signal(false); - error = signal(null); - - // Providers - loadingProviders = signal(true); - localAuthEnabled = signal(true); - oauthProviders = signal([]); - ldapProviders = signal([]); - - // LDAP form - showLdapForm = signal(false); - selectedLdapProvider = signal(null); - ldapUsername = ''; - ldapPassword = ''; - ldapLoading = signal(false); - ldapError = signal(null); - - ngOnInit(): void { - // Check for error in URL params - const params = new URLSearchParams(window.location.search); - const errorParam = params.get('error'); - if (errorParam) { - this.error.set(decodeURIComponent(errorParam)); - } - - this.loadProviders(); - } - - private async loadProviders(): Promise { - try { - const response = await firstValueFrom( - this.http.get('/api/v1/auth/providers') - ); - - this.localAuthEnabled.set(response.localAuthEnabled); - this.oauthProviders.set(response.providers.filter((p) => p.type === 'oidc')); - this.ldapProviders.set(response.providers.filter((p) => p.type === 'ldap')); - - // Auto-redirect to default provider if configured - if (response.defaultProviderId && !this.error()) { - const defaultProvider = response.providers.find((p) => p.id === response.defaultProviderId); - if (defaultProvider) { - if (defaultProvider.type === 'oidc') { - this.loginWithOAuth(defaultProvider); - return; - } else if (defaultProvider.type === 'ldap') { - this.selectLdapProvider(defaultProvider); - } - } - } - } catch (error) { - // If providers endpoint fails, show local auth - console.error('Failed to load providers:', error); - } finally { - this.loadingProviders.set(false); - } - } - - async login(): Promise { - if (!this.email || !this.password) { - this.error.set('Please enter your email and password'); - return; - } - - this.loading.set(true); - this.error.set(null); - - try { - const success = await this.authService.login(this.email, this.password); - - if (success) { - this.toastService.success('Welcome back!'); - this.router.navigate(['/dashboard']); - } else { - this.error.set('Invalid email or password'); - } - } catch (err) { - this.error.set('An error occurred. Please try again.'); - } finally { - this.loading.set(false); - } - } - - loginWithOAuth(provider: IPublicProvider): void { - // Redirect to OAuth authorization endpoint - const returnUrl = encodeURIComponent(window.location.origin + '/dashboard'); - window.location.href = `/api/v1/auth/oauth/${provider.id}/authorize?returnUrl=${returnUrl}`; - } - - selectLdapProvider(provider: IPublicProvider): void { - this.selectedLdapProvider.set(provider); - this.showLdapForm.set(true); - this.ldapUsername = ''; - this.ldapPassword = ''; - this.ldapError.set(null); - } - - cancelLdap(): void { - this.showLdapForm.set(false); - this.selectedLdapProvider.set(null); - } - - async loginWithLdap(): Promise { - const provider = this.selectedLdapProvider(); - if (!provider || !this.ldapUsername || !this.ldapPassword) { - this.ldapError.set('Please enter your username and password'); - return; - } - - this.ldapLoading.set(true); - this.ldapError.set(null); - - try { - const response = await firstValueFrom( - this.http.post<{ - user: { id: string; email: string; username: string; displayName: string; isSystemAdmin: boolean }; - accessToken: string; - refreshToken: string; - sessionId: string; - }>(`/api/v1/auth/ldap/${provider.id}/login`, { - username: this.ldapUsername, - password: this.ldapPassword, - }) - ); - - this.authService.handleOAuthCallback( - response.accessToken, - response.refreshToken, - response.sessionId - ); - - this.toastService.success('Welcome!'); - this.router.navigate(['/dashboard']); - } catch (err: any) { - const message = err?.error?.error || 'Authentication failed'; - this.ldapError.set(message); - } finally { - this.ldapLoading.set(false); - } - } -} diff --git a/ui/src/app/features/oauth-callback/oauth-callback.component.ts b/ui/src/app/features/oauth-callback/oauth-callback.component.ts deleted file mode 100644 index 4f77caa..0000000 --- a/ui/src/app/features/oauth-callback/oauth-callback.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { AuthService } from '../../core/services/auth.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-oauth-callback', - standalone: true, - template: ` -
-
- @if (error()) { -
- - - -
-

Authentication Failed

-

{{ error() }}

- Back to Login - } @else { -
- - - - -
-

Signing you in...

-

Please wait while we complete authentication

- } -
-
- `, -}) -export class OAuthCallbackComponent implements OnInit { - private authService = inject(AuthService); - private router = inject(Router); - private toastService = inject(ToastService); - - error = signal(null); - - ngOnInit(): void { - this.handleCallback(); - } - - private handleCallback(): void { - const params = new URLSearchParams(window.location.search); - const accessToken = params.get('accessToken'); - const refreshToken = params.get('refreshToken'); - const sessionId = params.get('sessionId'); - const errorParam = params.get('error'); - - if (errorParam) { - this.error.set(decodeURIComponent(errorParam)); - return; - } - - if (!accessToken || !refreshToken || !sessionId) { - this.error.set('Missing authentication tokens'); - return; - } - - // Store the tokens and redirect - this.authService.handleOAuthCallback(accessToken, refreshToken, sessionId); - this.toastService.success('Welcome!'); - this.router.navigate(['/dashboard']); - } -} diff --git a/ui/src/app/features/organizations/organization-detail.component.ts b/ui/src/app/features/organizations/organization-detail.component.ts deleted file mode 100644 index 743eb0a..0000000 --- a/ui/src/app/features/organizations/organization-detail.component.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { ActivatedRoute, RouterLink } from '@angular/router'; -import { ApiService, type IOrganization, type IRepository } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-organization-detail', - standalone: true, - imports: [RouterLink], - template: ` -
- @if (loading()) { -
- - - - -
- } @else if (organization()) { - -
-
-
- - {{ organization()!.name.charAt(0).toUpperCase() }} - -
-
-

{{ organization()!.displayName }}

-

@{{ organization()!.name }}

-
-
-
- @if (organization()!.isPublic) { - Public - } @else { - Private - } -
-
- - @if (organization()!.description) { -

{{ organization()!.description }}

- } - - -
-
-
-
- -
- -
- - @if (repositories().length === 0) { -
-

No repositories yet

-
- } @else { - - } -
- - -
-
-
- -
-
-
-
-

Members

-

{{ organization()!.memberCount }}

-
-
-

Repositories

-

{{ repositories().length }}

-
-
-

Created

-

{{ formatDate(organization()!.createdAt) }}

-
-
- } -
- `, -}) -export class OrganizationDetailComponent implements OnInit { - private route = inject(ActivatedRoute); - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - organization = signal(null); - repositories = signal([]); - loading = signal(true); - - ngOnInit(): void { - const orgName = this.route.snapshot.paramMap.get('orgName'); - if (orgName) { - this.loadData(orgName); - } - } - - private async loadData(orgName: string): Promise { - this.loading.set(true); - try { - const [org, reposResponse] = await Promise.all([ - this.apiService.getOrganization(orgName).toPromise(), - this.apiService.getRepositories(orgName).toPromise(), - ]); - this.organization.set(org || null); - this.repositories.set(reposResponse?.repositories || []); - } catch (error) { - this.toastService.error('Failed to load organization'); - } finally { - this.loading.set(false); - } - } - - formatDate(dateStr: string): string { - return new Date(dateStr).toLocaleDateString(); - } -} diff --git a/ui/src/app/features/organizations/organizations.component.ts b/ui/src/app/features/organizations/organizations.component.ts deleted file mode 100644 index b404517..0000000 --- a/ui/src/app/features/organizations/organizations.component.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { RouterLink } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { ApiService, type IOrganization } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-organizations', - standalone: true, - imports: [RouterLink, FormsModule], - template: ` -
-
-
-
-
- -
-

Manage your organizations

-
- -
- - @if (loading()) { -
- - - - -
- } @else if (organizations().length === 0) { -
- - - -

No organizations yet

-

Create your first organization to start managing packages

- -
- } @else { - - } - - - @if (showCreateModal()) { - - } - - - @if (showPublicExplainer()) { - - } -
- `, -}) -export class OrganizationsComponent implements OnInit { - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - organizations = signal([]); - loading = signal(true); - showCreateModal = signal(false); - showPublicExplainer = signal(false); - creating = signal(false); - - newOrg = { - name: '', - displayName: '', - description: '', - isPublic: false, - }; - - ngOnInit(): void { - this.loadOrganizations(); - } - - private async loadOrganizations(): Promise { - this.loading.set(true); - try { - const response = await this.apiService.getOrganizations().toPromise(); - this.organizations.set(response?.organizations || []); - } catch (error) { - this.toastService.error('Failed to load organizations'); - } finally { - this.loading.set(false); - } - } - - async createOrganization(): Promise { - if (!this.newOrg.name) return; - - this.creating.set(true); - try { - const org = await this.apiService.createOrganization({ - name: this.newOrg.name, - displayName: this.newOrg.displayName || this.newOrg.name, - description: this.newOrg.description, - isPublic: this.newOrg.isPublic, - }).toPromise(); - - if (org) { - this.organizations.update((orgs) => [...orgs, org]); - this.toastService.success('Organization created successfully'); - this.showCreateModal.set(false); - this.newOrg = { name: '', displayName: '', description: '', isPublic: false }; - } - } catch (error) { - this.toastService.error('Failed to create organization'); - } finally { - this.creating.set(false); - } - } -} diff --git a/ui/src/app/features/packages/package-detail.component.ts b/ui/src/app/features/packages/package-detail.component.ts deleted file mode 100644 index 74ebff8..0000000 --- a/ui/src/app/features/packages/package-detail.component.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { ActivatedRoute, RouterLink } from '@angular/router'; -import { ApiService, type IPackage } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-package-detail', - standalone: true, - imports: [RouterLink], - template: ` -
- @if (loading()) { -
- - - - -
- } @else if (pkg()) { - - -
-
-
-

{{ pkg()!.name }}

- {{ pkg()!.protocol }} - @if (pkg()!.isPrivate) { - Private - } -
- @if (pkg()!.description) { -

{{ pkg()!.description }}

- } -
-
- -
- -
- -
-
-

Installation

-
-
- @switch (pkg()!.protocol) { - @case ('npm') { - - npm install {{ pkg()!.name }} - - } - @case ('oci') { - - docker pull registry.stack.gallery/{{ pkg()!.name }}:{{ pkg()!.latestVersion || 'latest' }} - - } - @case ('maven') { - - <dependency>
-   <groupId>{{ pkg()!.name.split(':')[0] }}</groupId>
-   <artifactId>{{ pkg()!.name.split(':')[1] || pkg()!.name }}</artifactId>
-   <version>{{ pkg()!.latestVersion || 'LATEST' }}</version>
- </dependency> -
- } - @case ('pypi') { - - pip install {{ pkg()!.name }} - - } - @case ('cargo') { - - cargo add {{ pkg()!.name }} - - } - @case ('composer') { - - composer require {{ pkg()!.name }} - - } - @case ('rubygems') { - - gem install {{ pkg()!.name }} - - } - @default { -

Installation instructions not available

- } - } -
-
- - -
-
-

Versions

-
-
- @if (versions().length === 0) { -
- No versions published yet -
- } @else { -
    - @for (version of versions(); track version.version) { -
  • -
    - {{ version.version }} - @if (version.version === pkg()!.latestVersion) { - latest - } -
    - - {{ version.downloads }} downloads - -
  • - } -
- } -
-
-
- - -
-
-

Stats

-
-
-
Downloads
-
{{ pkg()!.downloadCount }}
-
-
-
Latest version
-
{{ pkg()!.latestVersion || 'N/A' }}
-
-
-
Last updated
-
{{ formatDate(pkg()!.updatedAt) }}
-
-
-
-
-
- } -
- `, -}) -export class PackageDetailComponent implements OnInit { - private route = inject(ActivatedRoute); - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - pkg = signal(null); - versions = signal<{ version: string; downloads: number }[]>([]); - loading = signal(true); - - ngOnInit(): void { - const packageId = this.route.snapshot.paramMap.get('packageId'); - if (packageId) { - this.loadPackage(packageId); - } - } - - private async loadPackage(packageId: string): Promise { - this.loading.set(true); - try { - const pkg = await this.apiService.getPackage(packageId).toPromise(); - this.pkg.set(pkg || null); - // Versions would come from the full package response in a real implementation - this.versions.set([]); - } catch (error) { - this.toastService.error('Failed to load package'); - } finally { - this.loading.set(false); - } - } - - formatDate(dateStr: string): string { - return new Date(dateStr).toLocaleDateString(); - } -} diff --git a/ui/src/app/features/packages/packages.component.ts b/ui/src/app/features/packages/packages.component.ts deleted file mode 100644 index a82c271..0000000 --- a/ui/src/app/features/packages/packages.component.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { RouterLink } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { ApiService, type IPackage } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-packages', - standalone: true, - imports: [RouterLink, FormsModule], - template: ` -
-
-
-
- -
-

Browse and search packages

-
- - -
-
-
- -
- -
-
- - @if (loading()) { -
- - - - -
- } @else if (packages().length === 0) { -
- - - -

No packages found

-

- @if (searchQuery || selectedProtocol) { - Try adjusting your search or filters - } @else { - Publish your first package to get started - } -

-
- } @else { - - - @if (total() > packages().length) { -
- -
- } - } -
- `, -}) -export class PackagesComponent implements OnInit { - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - packages = signal([]); - total = signal(0); - loading = signal(true); - - searchQuery = ''; - selectedProtocol = ''; - private offset = 0; - private readonly limit = 20; - private searchTimeout?: ReturnType; - - ngOnInit(): void { - this.loadPackages(); - } - - search(): void { - clearTimeout(this.searchTimeout); - this.searchTimeout = setTimeout(() => { - this.offset = 0; - this.loadPackages(); - }, 300); - } - - async loadPackages(): Promise { - this.loading.set(true); - try { - const response = await this.apiService.searchPackages({ - q: this.searchQuery || undefined, - protocol: this.selectedProtocol || undefined, - limit: this.limit, - offset: this.offset, - }).toPromise(); - - if (this.offset === 0) { - this.packages.set(response?.packages || []); - } else { - this.packages.update((pkgs) => [...pkgs, ...(response?.packages || [])]); - } - this.total.set(response?.total || 0); - } catch (error) { - this.toastService.error('Failed to load packages'); - } finally { - this.loading.set(false); - } - } - - loadMore(): void { - this.offset += this.limit; - this.loadPackages(); - } - - formatDate(dateStr: string): string { - const date = new Date(dateStr); - const now = new Date(); - const diff = now.getTime() - date.getTime(); - const days = Math.floor(diff / (1000 * 60 * 60 * 24)); - - if (days === 0) return 'today'; - if (days === 1) return 'yesterday'; - if (days < 7) return `${days} days ago`; - if (days < 30) return `${Math.floor(days / 7)} weeks ago`; - return date.toLocaleDateString(); - } -} diff --git a/ui/src/app/features/repositories/repository-detail.component.ts b/ui/src/app/features/repositories/repository-detail.component.ts deleted file mode 100644 index 2084246..0000000 --- a/ui/src/app/features/repositories/repository-detail.component.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { ActivatedRoute, RouterLink } from '@angular/router'; -import { ApiService, type IRepository, type IPackage } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-repository-detail', - standalone: true, - imports: [RouterLink], - template: ` -
- @if (loading()) { -
- - - - -
- } @else if (repository()) { - - -
-
-

{{ repository()!.displayName }}

-

{{ repository()!.name }}

-
-
- @for (protocol of repository()!.protocols; track protocol) { - {{ protocol }} - } - @if (repository()!.isPublic) { - Public - } -
-
- - @if (repository()!.description) { -

{{ repository()!.description }}

- } - - -
-
-

Packages

-
-
- @if (packages().length === 0) { -
- No packages in this repository yet -
- } @else { -
    - @for (pkg of packages(); track pkg.id) { -
  • -
    -
    -

    {{ pkg.name }}

    -

    - {{ pkg.protocol }} · {{ pkg.latestVersion || 'No versions' }} -

    -
    -
    - - {{ pkg.downloadCount }} downloads - - - View - -
    -
    -
  • - } -
- } -
-
- } -
- `, -}) -export class RepositoryDetailComponent implements OnInit { - private route = inject(ActivatedRoute); - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - repository = signal(null); - packages = signal([]); - loading = signal(true); - - ngOnInit(): void { - const repoId = this.route.snapshot.paramMap.get('repoId'); - if (repoId) { - this.loadData(repoId); - } - } - - private async loadData(repoId: string): Promise { - this.loading.set(true); - try { - const repo = await this.apiService.getRepository(repoId).toPromise(); - this.repository.set(repo || null); - - if (repo) { - const packagesResponse = await this.apiService.searchPackages({ - organizationId: repo.organizationId, - }).toPromise(); - this.packages.set( - (packagesResponse?.packages || []).filter((p) => p.repositoryId === repoId) - ); - } - } catch (error) { - this.toastService.error('Failed to load repository'); - } finally { - this.loading.set(false); - } - } -} diff --git a/ui/src/app/features/settings/settings.component.ts b/ui/src/app/features/settings/settings.component.ts deleted file mode 100644 index 4d3c715..0000000 --- a/ui/src/app/features/settings/settings.component.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { AuthService, type IUser } from '../../core/services/auth.service'; -import { ToastService } from '../../core/services/toast.service'; - -@Component({ - selector: 'app-settings', - standalone: true, - imports: [FormsModule], - template: ` -
-
-
-
- -
-

Account Settings

-
- - -
-
-
-
- Profile -
-
-
-
-
- - {{ userInitial() }} - -
-
-

{{ user()?.displayName }}

-

{{ user()?.email }}

-
-
- -
- - -
- -
- - -

Username cannot be changed

-
- -
- - -

Contact support to change your email

-
-
- -
- - -
-
-
-
- Security -
-
-
-
- - -
-
- - -
-
- - -
-
- -
- - -
-
-
-
- Sessions -
-
-
-

- Sign out of all other browser sessions. This will not affect your current session. -

- -
-
- - -
-
-
-
- Danger Zone -
-
-
-

- Once you delete your account, there is no going back. Please be certain. -

- -
-
-
- `, -}) -export class SettingsComponent implements OnInit { - private authService = inject(AuthService); - private toastService = inject(ToastService); - - user = this.authService.user; - displayName = ''; - currentPassword = ''; - newPassword = ''; - confirmPassword = ''; - - saving = signal(false); - changingPassword = signal(false); - - userInitial = () => { - const name = this.user()?.displayName || 'U'; - return name.charAt(0).toUpperCase(); - }; - - ngOnInit(): void { - this.displayName = this.user()?.displayName || ''; - } - - async saveProfile(): Promise { - this.saving.set(true); - try { - // Would call API to update profile - this.toastService.success('Profile updated'); - } catch (error) { - this.toastService.error('Failed to update profile'); - } finally { - this.saving.set(false); - } - } - - async changePassword(): Promise { - if (!this.currentPassword || !this.newPassword) { - this.toastService.error('Please fill in all password fields'); - return; - } - - if (this.newPassword !== this.confirmPassword) { - this.toastService.error('New passwords do not match'); - return; - } - - this.changingPassword.set(true); - try { - // Would call API to change password - this.toastService.success('Password changed'); - this.currentPassword = ''; - this.newPassword = ''; - this.confirmPassword = ''; - } catch (error) { - this.toastService.error('Failed to change password'); - } finally { - this.changingPassword.set(false); - } - } - - async logoutAllSessions(): Promise { - try { - // Would call API to logout all sessions - this.toastService.success('Signed out of all other sessions'); - } catch (error) { - this.toastService.error('Failed to sign out'); - } - } -} diff --git a/ui/src/app/features/tokens/tokens.component.ts b/ui/src/app/features/tokens/tokens.component.ts deleted file mode 100644 index a3a5bf4..0000000 --- a/ui/src/app/features/tokens/tokens.component.ts +++ /dev/null @@ -1,466 +0,0 @@ -import { Component, inject, signal, OnInit } from '@angular/core'; -import { NgClass } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { ApiService, type IToken, type ITokenScope, type IOrganization } from '../../core/services/api.service'; -import { ToastService } from '../../core/services/toast.service'; - -interface IScopeEntry { - protocol: string; - actions: string[]; - organizationId?: string; -} - -@Component({ - selector: 'app-tokens', - standalone: true, - imports: [NgClass, FormsModule], - template: ` -
-
-
-
-
- -
-

Manage your API tokens for registry access

-
- -
- - @if (loading()) { -
- - - - -
- } @else if (tokens().length === 0) { -
- - - -

No API tokens

-

Create a token to authenticate with the registry

- -
- } @else { -
-
    - @for (token of tokens(); track token.id) { -
  • -
    -
    -
    -

    {{ token.name }}

    - @if (token.organizationId) { - Org Token - } @else { - Personal - } -
    - -
    - @for (scope of token.scopes?.slice(0, 4) || []; track $index) { - - {{ scope.protocol === '*' ? 'All' : scope.protocol }} - {{ formatActions(scope.actions) }} - - } - @if ((token.scopes?.length || 0) > 4) { - +{{ (token.scopes?.length || 0) - 4 }} more - } -
    -

    - {{ token.tokenPrefix }}... - @if (token.expiresAt) { - · - Expires {{ formatDate(token.expiresAt) }} - } -

    -

    - Created {{ formatDate(token.createdAt) }} - @if (token.lastUsedAt) { - · Last used {{ formatDate(token.lastUsedAt) }} - } - · {{ token.usageCount }} uses -

    -
    - -
    -
  • - } -
-
- } - - - @if (showCreateModal()) { - - } - - - @if (createdToken()) { - - } -
- `, -}) -export class TokensComponent implements OnInit { - private apiService = inject(ApiService); - private toastService = inject(ToastService); - - tokens = signal([]); - organizations = signal([]); - loading = signal(true); - showCreateModal = signal(false); - creating = signal(false); - createdToken = signal(null); - - availableProtocols = ['npm', 'oci', 'maven', 'cargo', 'composer', 'pypi', 'rubygems']; - availableActions = ['read', 'write', 'delete']; - - newToken: { - name: string; - organizationId?: string; - scopes: IScopeEntry[]; - expiresInDays: number | null; - } = { - name: '', - organizationId: undefined, - scopes: [], - expiresInDays: null, - }; - - ngOnInit(): void { - this.loadData(); - } - - private async loadData(): Promise { - this.loading.set(true); - try { - const [tokensRes, orgsRes] = await Promise.all([ - this.apiService.getTokens().toPromise(), - this.apiService.getOrganizations().toPromise(), - ]); - this.tokens.set(tokensRes?.tokens || []); - this.organizations.set(orgsRes?.organizations || []); - } catch (error) { - this.toastService.error('Failed to load data'); - } finally { - this.loading.set(false); - } - } - - addScope(): void { - this.newToken.scopes = [ - ...this.newToken.scopes, - { protocol: '*', actions: ['read', 'write'] }, - ]; - } - - removeScope(index: number): void { - this.newToken.scopes = this.newToken.scopes.filter((_, i) => i !== index); - } - - toggleAction(scope: IScopeEntry, action: string): void { - if (scope.actions.includes(action)) { - scope.actions = scope.actions.filter((a) => a !== action); - } else { - scope.actions = [...scope.actions, action]; - } - } - - hasValidScopes(): boolean { - return this.newToken.scopes.every((s) => s.protocol && s.actions.length > 0); - } - - async createToken(): Promise { - if (!this.newToken.name || this.newToken.scopes.length === 0 || !this.hasValidScopes()) return; - - this.creating.set(true); - try { - // Build protocols array from scopes - const protocols = [...new Set(this.newToken.scopes.map((s) => s.protocol))]; - - const response = await this.apiService.createToken({ - name: this.newToken.name, - organizationId: this.newToken.organizationId, - protocols, - scopes: this.newToken.scopes.map((s) => ({ - protocol: s.protocol, - actions: s.actions, - organizationId: s.organizationId, - })), - expiresInDays: this.newToken.expiresInDays || undefined, - }).toPromise(); - - if (response) { - this.createdToken.set(response.token); - this.tokens.update((tokens) => [response, ...tokens]); - this.showCreateModal.set(false); - this.resetNewToken(); - } - } catch (error) { - this.toastService.error('Failed to create token'); - } finally { - this.creating.set(false); - } - } - - async revokeToken(token: IToken): Promise { - if (!confirm(`Are you sure you want to revoke "${token.name}"? This cannot be undone.`)) return; - - try { - await this.apiService.revokeToken(token.id).toPromise(); - this.tokens.update((tokens) => tokens.filter((t) => t.id !== token.id)); - this.toastService.success('Token revoked'); - } catch (error) { - this.toastService.error('Failed to revoke token'); - } - } - - closeCreateModal(): void { - this.showCreateModal.set(false); - this.resetNewToken(); - } - - private resetNewToken(): void { - this.newToken = { - name: '', - organizationId: undefined, - scopes: [], - expiresInDays: null, - }; - } - - copyToken(): void { - const token = this.createdToken(); - if (token) { - navigator.clipboard.writeText(token); - this.toastService.success('Token copied to clipboard'); - } - } - - formatDate(dateStr: string): string { - return new Date(dateStr).toLocaleDateString(); - } - - formatActions(actions: string[]): string { - if (actions.includes('*')) return 'full'; - return actions.join(', '); - } -} diff --git a/ui/src/app/shared/components/layout/layout.component.ts b/ui/src/app/shared/components/layout/layout.component.ts deleted file mode 100644 index 9d142bf..0000000 --- a/ui/src/app/shared/components/layout/layout.component.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Component, computed, inject } from '@angular/core'; -import { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router'; -import { AuthService } from '../../../core/services/auth.service'; - -@Component({ - selector: 'app-layout', - standalone: true, - imports: [RouterOutlet, RouterLink, RouterLinkActive], - template: ` -
- - - - -
- -
-
- `, -}) -export class LayoutComponent { - private authService = inject(AuthService); - - userName = computed(() => this.authService.user()?.displayName || 'User'); - userEmail = computed(() => this.authService.user()?.email || ''); - userInitial = computed(() => { - const name = this.authService.user()?.displayName || 'U'; - return name.charAt(0).toUpperCase(); - }); - isAdmin = computed(() => this.authService.isAdmin()); - - logout(): void { - this.authService.logout(); - } -} diff --git a/ui/src/index.html b/ui/src/index.html deleted file mode 100644 index 672501c..0000000 --- a/ui/src/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Stack.Gallery Registry - - - - - - - - - - - - diff --git a/ui/src/main.ts b/ui/src/main.ts deleted file mode 100644 index 514c89a..0000000 --- a/ui/src/main.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; - -bootstrapApplication(AppComponent, appConfig).catch((err) => - console.error(err) -); diff --git a/ui/src/styles.css b/ui/src/styles.css deleted file mode 100644 index 659c03b..0000000 --- a/ui/src/styles.css +++ /dev/null @@ -1,302 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - /* Stack.Gallery Design System - Dark Theme (Default) */ - :root { - --background: 0 0% 0%; - --foreground: 0 0% 100%; - --card: 0 0% 4%; - --card-foreground: 0 0% 100%; - --popover: 0 0% 4%; - --popover-foreground: 0 0% 100%; - --primary: 33 100% 50%; - --primary-foreground: 0 0% 0%; - --secondary: 0 0% 8%; - --secondary-foreground: 0 0% 100%; - --muted: 0 0% 8%; - --muted-foreground: 0 0% 55%; - --accent: 142 71% 45%; - --accent-foreground: 0 0% 0%; - --destructive: 0 84% 60%; - --destructive-foreground: 0 0% 100%; - --border: 0 0% 15%; - --input: 0 0% 15%; - --ring: 33 100% 50%; - --radius: 0px; - } - - /* Light Theme */ - .light { - --background: 0 0% 100%; - --foreground: 0 0% 5%; - --card: 0 0% 98%; - --card-foreground: 0 0% 5%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 5%; - --primary: 33 100% 45%; - --primary-foreground: 0 0% 100%; - --secondary: 0 0% 96%; - --secondary-foreground: 0 0% 5%; - --muted: 0 0% 96%; - --muted-foreground: 0 0% 40%; - --accent: 142 71% 35%; - --accent-foreground: 0 0% 100%; - --destructive: 0 84% 60%; - --destructive-foreground: 0 0% 100%; - --border: 0 0% 90%; - --input: 0 0% 90%; - --ring: 33 100% 45%; - } -} - -@layer base { - * { - @apply border-border; - } - - body { - @apply bg-background text-foreground font-sans; - font-feature-settings: "rlig" 1, "calt" 1; - } - - /* Typography - Monospace for headings */ - h1, h2, h3, h4, h5, h6 { - @apply font-mono tracking-tighter; - } - - h1 { - @apply text-3xl md:text-4xl font-bold; - } - - h2 { - @apply text-xl md:text-2xl font-bold; - } - - h3 { - @apply text-sm font-semibold; - } -} - -@layer components { - /* Buttons */ - .btn { - @apply inline-flex items-center justify-center h-10 px-6 - font-mono text-sm font-bold uppercase tracking-wider - transition-colors - focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background - disabled:pointer-events-none disabled:opacity-50; - } - - .btn-primary { - @apply btn bg-primary text-primary-foreground hover:opacity-90; - } - - .btn-secondary { - @apply btn bg-transparent text-foreground border border-border hover:bg-muted; - } - - .btn-ghost { - @apply btn hover:bg-muted/30; - } - - .btn-destructive { - @apply btn bg-destructive text-destructive-foreground hover:opacity-90; - } - - .btn-sm { - @apply h-8 px-3 text-xs; - } - - .btn-md { - @apply h-10 px-4; - } - - .btn-lg { - @apply h-12 px-6; - } - - /* Inputs */ - .input { - @apply flex h-10 w-full border border-border bg-background - px-3 py-2 font-mono text-sm - placeholder:text-muted-foreground - focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent - disabled:cursor-not-allowed disabled:opacity-50; - } - - .label { - @apply font-mono text-xs font-normal uppercase tracking-wider text-muted-foreground; - } - - /* Cards */ - .card { - @apply bg-card text-card-foreground border border-border; - } - - .card-header { - @apply px-6 py-4 border-b border-border; - } - - .card-content { - @apply p-6; - } - - .card-footer { - @apply px-6 py-4 border-t border-border; - } - - /* Badges/Tags */ - .badge { - @apply inline-flex items-center px-2 py-1 - font-mono text-xs uppercase tracking-wider - border; - } - - .badge-default { - @apply badge bg-muted text-muted-foreground border-border; - } - - .badge-primary { - @apply badge text-primary bg-primary/5 border-primary/30; - } - - .badge-accent { - @apply badge text-accent bg-accent/5 border-accent/30; - } - - .badge-success { - @apply badge text-accent bg-accent/5 border-accent/30; - } - - .badge-warning { - @apply badge text-primary bg-primary/5 border-primary/30; - } - - .badge-destructive { - @apply badge text-destructive bg-destructive/5 border-destructive/30; - } - - /* Code Blocks */ - .code-block { - @apply bg-card border border-border font-mono text-sm; - } - - .code-header { - @apply flex items-center gap-2 px-3 py-2 bg-muted/50 border-b border-border; - } - - /* Terminal dots */ - .terminal-dot { - @apply w-2 h-2; - } - - .dot-red { - @apply bg-destructive/60; - } - - .dot-orange { - @apply bg-primary/60; - } - - .dot-green { - @apply bg-accent/60; - } - - /* Tables */ - .table { - @apply w-full border border-border font-mono text-xs; - } - - .table-header { - @apply bg-muted uppercase tracking-wider text-muted-foreground; - } - - .table-cell { - @apply border-b border-border px-4 py-3; - } - - /* Section header pattern */ - .section-header { - @apply flex items-center gap-3; - } - - .section-indicator { - @apply w-2 h-2 bg-primary; - } - - .section-label { - @apply font-mono text-xs uppercase tracking-wider text-muted-foreground; - } - - /* Navigation */ - .nav-link { - @apply flex items-center gap-3 px-3 py-2 - font-mono text-sm uppercase tracking-wider - text-muted-foreground - hover:text-foreground hover:bg-muted/30 - transition-colors; - } - - .nav-link-active { - @apply text-primary bg-primary/10; - } - - /* Status indicators */ - .status-dot { - @apply w-2 h-2; - } - - .status-active { - @apply bg-accent; - } - - .status-inactive { - @apply bg-muted-foreground; - } - - .status-error { - @apply bg-destructive; - } - - /* Modal animations */ - .modal-backdrop { - @apply animate-fade-in; - } - - .modal-content { - @apply animate-modal-in; - } -} - -/* Custom animations */ -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes modal-in { - from { - opacity: 0; - transform: scale(0.95) translateY(-10px); - } - to { - opacity: 1; - transform: scale(1) translateY(0); - } -} - -@layer utilities { - .animate-fade-in { - animation: fade-in 0.2s ease-out; - } - - .animate-modal-in { - animation: modal-in 0.2s ease-out; - } -} diff --git a/ui/tailwind.config.js b/ui/tailwind.config.js deleted file mode 100644 index db18273..0000000 --- a/ui/tailwind.config.js +++ /dev/null @@ -1,58 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./src/**/*.{html,ts}", - ], - darkMode: 'class', - theme: { - extend: { - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))', - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))', - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))', - }, - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))', - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))', - }, - }, - fontFamily: { - sans: ['Inter', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'sans-serif'], - mono: ['JetBrains Mono', 'SF Mono', 'Consolas', 'Liberation Mono', 'monospace'], - }, - borderRadius: { - DEFAULT: '0px', - none: '0px', - sm: '0px', - md: '0px', - lg: '0px', - xl: '0px', - '2xl': '0px', - '3xl': '0px', - full: '0px', - }, - letterSpacing: { - tighter: '-0.02em', - wider: '0.05em', - }, - }, - }, - plugins: [], -} diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json deleted file mode 100644 index 5b9d3c5..0000000 --- a/ui/tsconfig.app.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": ["src/main.ts"], - "include": ["src/**/*.d.ts"] -} diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index fb9e5aa..0000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "outDir": "./dist/out-tsc", - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "skipLibCheck": true, - "esModuleInterop": true, - "sourceMap": true, - "declaration": false, - "experimentalDecorators": true, - "moduleResolution": "bundler", - "importHelpers": true, - "target": "ES2022", - "module": "ES2022", - "lib": ["ES2022", "dom"], - "useDefineForClassFields": false - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -}