From 377b7b12ced9720bf2c0171f9f5afbce30d734ce Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Fri, 18 Jul 2025 18:31:12 +0000 Subject: [PATCH] update/alpha.9 (#2988) * import marketplac preview for sideload * fix: improve state service (#2977) * fix: fix sideload DI * fix: update Angular * fix: cleanup * fix: fix version selection * Bump node version to fix build for Angular * misc fixes - update node to v22 - fix chroot-and-upgrade access to prune-images - don't self-migrate legacy packages - #2985 - move dataVersion to volume folder - remove "instructions.md" from s9pk - add "docsUrl" to manifest * version bump * include flavor when clicking view listing from updates tab * closes #2980 * fix: fix select button * bring back ssh keys * fix: drop 'portal' from all routes * fix: implement longtap action to select table rows * fix description for ssh page * replace instructions with docsLink and refactor marketplace preview * delete unused translations * fix patchdb diffing algorithm * continue refactor of marketplace lib show components * Booting StartOS instead of Setting up your server on init * misc fixes - closes #2990 - closes #2987 * fix build * docsUrl and clickable service headers * don't cleanup after update until new service install succeeds * update types * misc fixes * beta.35 * sdkversion, githash for sideload, correct logs for init, startos pubkey display * bring back reboot button on install * misc fixes * beta.36 * better handling of setup and init for websocket errors * reopen init and setup logs even on graceful closure * better logging, misc fixes * fix build * dont let package stats hang * dont show docsurl in marketplace if no docsurl * re-add needs-config * show error if init fails, shorten hover state on header icons * fix operator precedemce --------- Co-authored-by: Matt Hill Co-authored-by: Alex Inkin Co-authored-by: Mariusz Kogen --- .github/workflows/startos-iso.yaml | 2 +- .github/workflows/test.yaml | 2 +- build/lib/scripts/chroot-and-upgrade | 2 +- container-runtime/package-lock.json | 2 +- .../Systems/SystemForEmbassy/index.ts | 55 +- .../src/Adapters/Systems/SystemForStartOs.ts | 2 +- core/Cargo.lock | 663 +-- core/models/src/id/replay.rs | 8 + core/startos/Cargo.toml | 4 +- core/startos/src/context/config.rs | 15 - core/startos/src/context/rpc.rs | 44 +- core/startos/src/db/model/package.rs | 4 +- core/startos/src/db/model/public.rs | 6 +- core/startos/src/init.rs | 153 +- core/startos/src/install/mod.rs | 4 +- core/startos/src/install/update.rs | 18 - core/startos/src/lxc/mod.rs | 6 +- core/startos/src/net/network_interface.rs | 3 +- core/startos/src/net/static_server.rs | 38 +- core/startos/src/net/web_server.rs | 24 +- core/startos/src/progress.rs | 39 +- core/startos/src/registry/context.rs | 22 +- core/startos/src/registry/package/index.rs | 6 + core/startos/src/s9pk/git_hash.rs | 6 + .../src/s9pk/merkle_archive/source/mod.rs | 12 + .../source/multi_cursor_file.rs | 2 +- core/startos/src/s9pk/v1/docker.rs | 109 +- core/startos/src/s9pk/v1/reader.rs | 29 - core/startos/src/s9pk/v2/compat.rs | 13 +- core/startos/src/s9pk/v2/manifest.rs | 5 +- core/startos/src/s9pk/v2/mod.rs | 9 +- core/startos/src/s9pk/v2/pack.rs | 10 +- core/startos/src/service/effects/version.rs | 49 +- core/startos/src/service/mod.rs | 89 +- core/startos/src/service/service_map.rs | 125 +- core/startos/src/service/uninstall.rs | 7 - core/startos/src/setup.rs | 2 + core/startos/src/util/actor/concurrent.rs | 5 +- core/startos/src/util/io.rs | 57 +- core/startos/src/util/serde.rs | 47 +- core/startos/src/version/mod.rs | 107 +- core/startos/src/version/v0_3_5.rs | 4 +- core/startos/src/version/v0_3_5_1.rs | 4 +- core/startos/src/version/v0_3_5_2.rs | 4 +- core/startos/src/version/v0_3_6_alpha_0.rs | 105 +- core/startos/src/version/v0_3_6_alpha_1.rs | 4 +- core/startos/src/version/v0_3_6_alpha_10.rs | 4 +- core/startos/src/version/v0_3_6_alpha_11.rs | 4 +- core/startos/src/version/v0_3_6_alpha_12.rs | 4 +- core/startos/src/version/v0_3_6_alpha_13.rs | 4 +- core/startos/src/version/v0_3_6_alpha_14.rs | 4 +- core/startos/src/version/v0_3_6_alpha_15.rs | 4 +- core/startos/src/version/v0_3_6_alpha_16.rs | 4 +- core/startos/src/version/v0_3_6_alpha_17.rs | 4 +- core/startos/src/version/v0_3_6_alpha_18.rs | 4 +- core/startos/src/version/v0_3_6_alpha_2.rs | 4 +- core/startos/src/version/v0_3_6_alpha_3.rs | 4 +- core/startos/src/version/v0_3_6_alpha_4.rs | 4 +- core/startos/src/version/v0_3_6_alpha_5.rs | 4 +- core/startos/src/version/v0_3_6_alpha_6.rs | 4 +- core/startos/src/version/v0_3_6_alpha_7.rs | 7 +- core/startos/src/version/v0_3_6_alpha_8.rs | 7 +- core/startos/src/version/v0_3_6_alpha_9.rs | 4 +- core/startos/src/version/v0_4_0_alpha_0.rs | 7 +- core/startos/src/version/v0_4_0_alpha_1.rs | 4 +- core/startos/src/version/v0_4_0_alpha_2.rs | 4 +- core/startos/src/version/v0_4_0_alpha_3.rs | 4 +- core/startos/src/version/v0_4_0_alpha_4.rs | 6 +- core/startos/src/version/v0_4_0_alpha_5.rs | 4 +- core/startos/src/version/v0_4_0_alpha_6.rs | 4 +- core/startos/src/version/v0_4_0_alpha_7.rs | 4 +- core/startos/src/version/v0_4_0_alpha_8.rs | 4 +- core/startos/src/version/v0_4_0_alpha_9.rs | 112 + patch-db | 2 +- sdk/base/lib/osBindings/Manifest.ts | 3 +- sdk/base/lib/osBindings/PackageDataEntry.ts | 2 +- sdk/base/lib/osBindings/PackageVersionInfo.ts | 2 + sdk/base/lib/osBindings/ServerInfo.ts | 2 +- sdk/base/lib/osBindings/UpdatingState.ts | 1 + sdk/base/lib/s9pk/index.ts | 9 +- sdk/base/lib/types/ManifestTypes.ts | 4 + sdk/base/lib/util/Drop.ts | 153 + sdk/base/lib/util/GetSystemSmtp.ts | 67 +- sdk/base/lib/util/getServiceInterface.ts | 71 +- sdk/base/lib/util/getServiceInterfaces.ts | 70 +- sdk/base/lib/util/graph.ts | 17 + sdk/package/lib/StartSdk.ts | 25 +- sdk/package/lib/mainFn/CommandController.ts | 2 +- sdk/package/lib/mainFn/Daemon.ts | 25 +- sdk/package/lib/mainFn/Daemons.ts | 6 +- sdk/package/lib/manifest/setupManifest.ts | 1 + sdk/package/lib/test/inputSpecBuilder.test.ts | 3 +- sdk/package/lib/test/output.sdk.ts | 4 +- sdk/package/lib/util/Drop.ts | 46 - sdk/package/lib/util/GetSslCertificate.ts | 69 +- sdk/package/lib/util/SubContainer.ts | 2 +- sdk/package/lib/util/fileHelper.ts | 171 +- sdk/package/lib/util/index.ts | 2 +- sdk/package/lib/version/VersionGraph.ts | 24 +- sdk/package/lib/version/VersionInfo.ts | 2 +- sdk/package/package-lock.json | 4 +- sdk/package/package.json | 2 +- sdk/package/tsconfig.json | 2 +- web/angular.json | 24 +- web/package-lock.json | 3821 ++++++++++------- web/package.json | 58 +- web/patchdb-ui-seed.json | 3 +- .../install-wizard/src/app/app.utils.ts | 1 - .../store-icon/store-icon.component.ts | 18 +- .../src/modals/release-notes.component.ts | 52 - .../src/pages/list/item/item.component.scss | 4 +- .../src/pages/show/about.component.ts | 139 + .../src/pages/show/about/about.component.html | 29 - .../src/pages/show/about/about.component.scss | 12 - .../src/pages/show/about/about.component.ts | 29 - .../src/pages/show/about/about.module.ts | 23 - .../additional/additional-link.component.ts | 28 - .../show/additional/additional.component.html | 78 - .../show/additional/additional.component.scss | 46 - .../show/additional/additional.component.ts | 32 - .../show/additional/additional.module.ts | 20 - .../dependencies/dependency-item.component.ts | 19 +- .../show/{flavors => }/flavors.component.ts | 6 +- .../pages/show/{hero => }/hero.component.ts | 31 +- ...al-item.component.ts => item.component.ts} | 7 +- .../src/pages/show/link.component.ts | 23 + .../src/pages/show/links.component.ts | 128 + .../src/pages/show/release-notes.component.ts | 28 + .../screenshots.component.ts | 105 +- .../src/pages/show/versions.component.ts | 102 + web/projects/marketplace/src/public-api.ts | 18 +- .../setup-wizard/src/app/app.component.ts | 3 +- .../app/components/documentation.component.ts | 4 +- .../setup-wizard/src/app/pages/home.page.ts | 2 - .../src/app/pages/loading.page.ts | 55 +- .../src/app/pages/success.page.ts | 2 +- .../src/app/services/api.service.ts | 2 +- .../src/app/services/live-api.service.ts | 5 +- .../src/app/services/mock-api.service.ts | 2 +- .../src/components/initializing.component.ts | 61 - .../initializing/initializing.component.ts | 92 + .../logs-window.component.ts | 4 +- .../shared/src/components/prompt.component.ts | 10 +- .../src/directives/safe-links.directive.ts | 3 +- .../shared/src/i18n/dictionaries/de.ts | 22 +- .../shared/src/i18n/dictionaries/en.ts | 24 +- .../shared/src/i18n/dictionaries/es.ts | 22 +- .../shared/src/i18n/dictionaries/fr.ts | 22 +- .../shared/src/i18n/dictionaries/pl.ts | 22 +- web/projects/shared/src/public-api.ts | 4 +- .../src/services/download-html.service.ts | 3 +- .../shared/src/services/http.service.ts | 3 +- .../shared/src/services/setup-logs.service.ts | 10 +- web/projects/shared/styles/shared.scss | 5 +- .../notifications-toast.component.ts | 6 +- .../{home.page.html => home.component.html} | 45 +- .../app/routes/diagnostic/home/home.page.ts | 2 +- .../routes/initializing/initializing.page.ts | 22 +- .../login/ca-wizard/ca-wizard.component.html | 177 +- .../login/ca-wizard/ca-wizard.component.ts | 4 +- .../{login.page.html => login.component.html} | 18 +- .../ui/src/app/routes/login/login.page.ts | 5 +- .../portal/components/form.component.ts | 28 +- .../form/form-array/form-array.component.html | 49 +- .../form/form-color/form-color.component.html | 21 +- .../form-control/form-control.component.html | 98 +- .../form-datetime.component.html | 95 +- .../form/form-group/form-group.component.html | 59 +- .../form-number/form-number.component.html | 6 +- .../form/form-text/form-text.component.html | 50 +- .../form-textarea.component.html | 4 +- .../components/header/about.component.ts | 19 + .../components/header/menu.component.ts | 2 +- .../components/header/navigation.component.ts | 6 +- .../interfaces/actions.component.ts | 2 +- .../portal/components/logs/logs.pipe.ts | 2 +- .../portal/components/tabs.component.ts | 12 +- .../portal/modals/config-dep.component.ts | 19 +- .../ui/src/app/routes/portal/portal.routes.ts | 16 +- .../routes/backups/modals/edit.component.ts | 30 +- .../backups/modals/recover.component.ts | 14 +- .../backups/modals/targets.component.ts | 2 - .../backups/services/restore.service.ts | 2 +- .../portal/routes/logs/logs.component.ts | 199 - .../components/controls.component.ts | 91 +- .../marketplace/components/tile.component.ts | 87 +- .../marketplace/marketplace.component.ts | 4 +- .../marketplace/modals/preview.component.ts | 150 +- .../marketplace/services/alerts.service.ts | 2 +- .../services/components/controls.component.ts | 7 +- .../components/dependencies.component.ts | 2 +- .../components/interface-item.component.ts | 2 +- .../services/components/progress.component.ts | 6 +- .../services/dashboard/controls.component.ts | 9 +- .../services/dashboard/service.component.ts | 2 +- .../services/dashboard/ui-launch.component.ts | 2 +- .../routes/services/routes/about.component.ts | 41 +- .../services/routes/actions.component.ts | 97 +- .../services/routes/outlet.component.ts | 21 +- .../portal/routes/services/services.routes.ts | 27 +- .../routes/sideload/package.component.ts | 74 +- .../routes/sideload/sideload.component.ts | 3 +- .../portal/routes/sideload/sideload.utils.ts | 3 - .../routes/backups/recover.component.ts | 2 +- .../routes/domains/domains.component.ts | 23 +- .../system/routes/domains/table.component.ts | 5 +- .../routes/general/general.component.ts | 4 +- .../system/routes/general/snek.component.ts | 2 +- .../system/routes/proxies/table.component.ts | 3 +- .../system/routes/router/router.component.ts | 58 +- .../system/routes/router/table.component.ts | 37 +- .../routes/sessions/sessions.component.ts | 5 +- .../system/routes/sessions/table.component.ts | 49 +- .../routes/system/routes/ssh/ssh.component.ts | 148 +- .../system/routes/ssh/table.component.ts | 223 +- .../system/routes/wifi/table.component.ts | 12 +- .../portal/routes/system/system.component.ts | 2 +- .../portal/routes/system/system.const.ts | 5 + .../portal/routes/system/system.routes.ts | 5 + .../portal/routes/updates/item.component.ts | 8 +- web/projects/ui/src/app/routing.module.ts | 4 +- .../ui/src/app/services/api/api.fixures.ts | 41 +- .../app/services/api/embassy-api.service.ts | 6 +- .../services/api/embassy-live-api.service.ts | 29 +- .../services/api/embassy-mock-api.service.ts | 4 +- .../ui/src/app/services/api/mock-patch.ts | 9 +- .../ui/src/app/services/badge.service.ts | 8 +- .../ui/src/app/services/config.service.ts | 3 +- .../src/app/services/marketplace.service.ts | 8 +- .../src/app/services/patch-db/data-model.ts | 1 - .../app/services/standard-actions.service.ts | 5 +- .../ui/src/app/services/state.service.ts | 137 +- .../ui/src/app/services/storage.service.ts | 3 +- .../ui/src/app/utils/system-utilities.ts | 18 +- .../ui/src/app/utils/to-router-link.ts | 2 +- web/projects/ui/src/styles.scss | 3 - web/tsconfig.json | 2 +- 237 files changed, 5953 insertions(+), 4777 deletions(-) delete mode 100644 core/startos/src/install/update.rs create mode 100644 core/startos/src/version/v0_4_0_alpha_9.rs create mode 100644 sdk/base/lib/util/Drop.ts delete mode 100644 sdk/package/lib/util/Drop.ts delete mode 100644 web/projects/marketplace/src/modals/release-notes.component.ts create mode 100644 web/projects/marketplace/src/pages/show/about.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/about/about.component.html delete mode 100644 web/projects/marketplace/src/pages/show/about/about.component.scss delete mode 100644 web/projects/marketplace/src/pages/show/about/about.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/about/about.module.ts delete mode 100644 web/projects/marketplace/src/pages/show/additional/additional-link.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/additional/additional.component.html delete mode 100644 web/projects/marketplace/src/pages/show/additional/additional.component.scss delete mode 100644 web/projects/marketplace/src/pages/show/additional/additional.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/additional/additional.module.ts rename web/projects/marketplace/src/pages/show/{flavors => }/flavors.component.ts (91%) rename web/projects/marketplace/src/pages/show/{hero => }/hero.component.ts (80%) rename web/projects/marketplace/src/pages/show/{additional/additional-item.component.ts => item.component.ts} (82%) create mode 100644 web/projects/marketplace/src/pages/show/link.component.ts create mode 100644 web/projects/marketplace/src/pages/show/links.component.ts create mode 100644 web/projects/marketplace/src/pages/show/release-notes.component.ts rename web/projects/marketplace/src/pages/show/{screenshots => }/screenshots.component.ts (55%) create mode 100644 web/projects/marketplace/src/pages/show/versions.component.ts delete mode 100644 web/projects/shared/src/components/initializing.component.ts create mode 100644 web/projects/shared/src/components/initializing/initializing.component.ts rename web/projects/shared/src/components/{ => initializing}/logs-window.component.ts (90%) rename web/projects/ui/src/app/routes/diagnostic/home/{home.page.html => home.component.html} (57%) rename web/projects/ui/src/app/routes/login/{login.page.html => login.component.html} (58%) delete mode 100644 web/projects/ui/src/app/routes/portal/routes/logs/logs.component.ts diff --git a/.github/workflows/startos-iso.yaml b/.github/workflows/startos-iso.yaml index 3490936b4..839cc35a3 100644 --- a/.github/workflows/startos-iso.yaml +++ b/.github/workflows/startos-iso.yaml @@ -45,7 +45,7 @@ on: - next/* env: - NODEJS_VERSION: "20.16.0" + NODEJS_VERSION: "22.17.1" ENVIRONMENT: '${{ fromJson(format(''["{0}", ""]'', github.event.inputs.environment || ''dev''))[github.event.inputs.environment == ''NONE''] }}' jobs: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 3f47a65a4..7781a60ba 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,7 +11,7 @@ on: - next/* env: - NODEJS_VERSION: "20.16.0" + NODEJS_VERSION: "22.17.1" ENVIRONMENT: dev-unstable jobs: diff --git a/build/lib/scripts/chroot-and-upgrade b/build/lib/scripts/chroot-and-upgrade index 8c3da37b4..346596d13 100755 --- a/build/lib/scripts/chroot-and-upgrade +++ b/build/lib/scripts/chroot-and-upgrade @@ -1,6 +1,6 @@ #!/bin/bash -SOURCE_DIR="$(dirname "${BASH_SOURCE[0]}")" +SOURCE_DIR="$(dirname $(realpath "${BASH_SOURCE[0]}"))" if [ "$UID" -ne 0 ]; then >&2 echo 'Must be run as root' diff --git a/container-runtime/package-lock.json b/container-runtime/package-lock.json index bb1b39e16..39ac8e2d9 100644 --- a/container-runtime/package-lock.json +++ b/container-runtime/package-lock.json @@ -38,7 +38,7 @@ }, "../sdk/dist": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.33", + "version": "0.4.0-beta.36", "license": "MIT", "dependencies": { "@iarna/toml": "^3.0.0", diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index 958141349..05ff5a427 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -289,6 +289,7 @@ function convertProperties( const DEFAULT_REGISTRY = "https://registry.start9.com" export class SystemForEmbassy implements System { + private version: ExtendedVersion currentRunning: MainLoop | undefined static async of(manifestLocation: string = MANIFEST_LOCATION) { const moduleCode = await import(EMBASSY_JS_LOCATION) @@ -310,7 +311,27 @@ export class SystemForEmbassy implements System { constructor( readonly manifest: Manifest, readonly moduleCode: Partial, - ) {} + ) { + this.version = ExtendedVersion.parseEmver(manifest.version) + if ( + this.manifest.id === "bitcoind" && + this.manifest.title.toLowerCase().includes("knots") + ) + this.version.flavor = "knots" + + if ( + this.manifest.id === "lnd" || + this.manifest.id === "ride-the-lightning" || + this.manifest.id === "datum" + ) { + this.version.upstream.prerelease = ["beta"] + } else if ( + this.manifest.id === "lightning-terminal" || + this.manifest.id === "robosats" + ) { + this.version.upstream.prerelease = ["alpha"] + } + } async init( effects: Effects, @@ -394,27 +415,9 @@ export class SystemForEmbassy implements System { reason: "This service must be configured before it can be run", }) } - const version = ExtendedVersion.parseEmver(this.manifest.version) - if ( - this.manifest.id === "bitcoind" && - this.manifest.title.toLowerCase().includes("knots") - ) - version.flavor = "knots" - if ( - this.manifest.id === "lnd" || - this.manifest.id === "ride-the-lightning" || - this.manifest.id === "datum" - ) { - version.upstream.prerelease = ["beta"] - } else if ( - this.manifest.id === "lightning-terminal" || - this.manifest.id === "robosats" - ) { - version.upstream.prerelease = ["alpha"] - } await effects.setDataVersion({ - version: version.toString(), + version: this.version.toString(), }) // @FullMetal: package hacks go here } @@ -599,10 +602,7 @@ export class SystemForEmbassy implements System { timeoutMs?: number | null, ): Promise { await this.currentRunning?.clean({ timeout: timeoutMs ?? undefined }) - if ( - target && - !overlaps(target, ExtendedVersion.parseEmver(this.manifest.version)) - ) { + if (target) { await this.migration(effects, { to: target }, timeoutMs ?? null) } await effects.setMainStatus({ status: "stopped" }) @@ -823,6 +823,7 @@ export class SystemForEmbassy implements System { let migration let args: [string, ...string[]] if ("from" in version) { + if (overlaps(this.version, version.from)) return null args = [version.from.toString(), "from"] if (!this.manifest.migrations) return { configured: true } migration = Object.entries(this.manifest.migrations.from) @@ -832,6 +833,7 @@ export class SystemForEmbassy implements System { ) .find(([versionEmver, _]) => overlaps(versionEmver, version.from)) } else { + if (overlaps(this.version, version.to)) return null args = [version.to.toString(), "to"] if (!this.manifest.migrations) return { configured: true } migration = Object.entries(this.manifest.migrations.to) @@ -1043,10 +1045,10 @@ export class SystemForEmbassy implements System { .withPath(`/media/embassy/${id}/config.json`) .read() .onChange(effects, async (oldConfig: U.Config) => { - if (!oldConfig) return + if (!oldConfig) return { cancel: false } const moduleCode = await this.moduleCode const method = moduleCode?.dependencies?.[id]?.autoConfigure - if (!method) return + if (!method) return { cancel: true } const newConfig = (await method( polyfillEffects(effects, this.manifest), JSON.parse(JSON.stringify(oldConfig)), @@ -1073,6 +1075,7 @@ export class SystemForEmbassy implements System { }, }) } + return { cancel: false } }) } } diff --git a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts index 32f7f3568..0eba3277d 100644 --- a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts +++ b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts @@ -32,7 +32,7 @@ export class SystemForStartOs implements System { target: ExtendedVersion | VersionRange | null, timeoutMs: number | null = null, ): Promise { - // TODO: stop? + await this.stop() return void (await this.abi.uninit({ effects, target })) } diff --git a/core/Cargo.lock b/core/Cargo.lock index 168f20c86..4078946be 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -19,9 +19,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" @@ -232,7 +232,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "synstructure", ] @@ -244,7 +244,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -260,7 +260,7 @@ dependencies = [ "pem", "rcgen", "ring", - "rustls 0.23.27", + "rustls 0.23.29", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -294,9 +294,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue 2.5.0", "event-listener-strategy", @@ -306,9 +306,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.23" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" +checksum = "40f6024f3f856663b45fd0c9b6f2024034a702f453549449e0d84a305900dad4" dependencies = [ "brotli", "flate2", @@ -368,7 +368,7 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-io", "async-lock", "async-signal", @@ -389,7 +389,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -429,7 +429,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -446,7 +446,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -466,15 +466,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "08b5d4e069cbc868041a64bd68dc8cb39a0d79585cd6c5a24caa8c2d622121be" dependencies = [ "aws-lc-sys", "zeroize", @@ -482,9 +482,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ "bindgen", "cc", @@ -736,7 +736,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.101", + "syn 2.0.104", "which", ] @@ -861,11 +861,11 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", "futures-lite", @@ -895,15 +895,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" [[package]] name = "byteorder" @@ -950,9 +950,9 @@ checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "cc" -version = "1.2.25" +version = "1.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" dependencies = [ "jobserver", "libc", @@ -970,9 +970,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -1063,9 +1063,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.39" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -1073,9 +1073,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.39" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -1085,21 +1085,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "cmake" @@ -1170,7 +1170,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "windows-sys 0.59.0", ] @@ -1420,9 +1420,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -1491,9 +1491,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.3" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "373b7c5dbd637569a2cca66e8d66b8c446a1e7bf064ea321d265d7b3dfe7c97e" dependencies = [ "cfg-if", "cpufeatures", @@ -1513,7 +1513,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1537,7 +1537,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1548,7 +1548,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1585,7 +1585,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1622,7 +1622,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1643,7 +1643,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1656,7 +1656,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1677,7 +1677,7 @@ dependencies = [ "convert_case 0.7.1", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1730,7 +1730,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1825,11 +1825,11 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ - "curve25519-dalek 4.1.3", + "curve25519-dalek 4.2.0", "ed25519 2.2.3", "rand_core 0.6.4", "serde", @@ -1919,14 +1919,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1934,13 +1934,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1962,12 +1962,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2073,9 +2073,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.9" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "filetime" @@ -2097,9 +2097,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "libz-rs-sys", @@ -2260,7 +2260,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2363,7 +2363,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -2417,9 +2417,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -2427,7 +2427,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -2477,9 +2477,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -2492,7 +2492,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.4", ] [[package]] @@ -2539,9 +2539,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2708,14 +2708,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.6" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http", "hyper", "hyper-util", - "rustls 0.23.27", + "rustls 0.23.29", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", @@ -2753,9 +2753,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "base64 0.22.1", "bytes", @@ -2969,21 +2969,20 @@ dependencies = [ [[package]] name = "imbl-value" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196915700a024f30561331639c1dad08d2f8313675bfe604e97eb13cd92e73ee" +version = "0.3.0" +source = "git+https://github.com/Start9Labs/imbl-value.git#229506ca83ae26bd78968719e5a78631deb39250" dependencies = [ "imbl", "serde", "serde_json", - "treediff", "yasi", ] [[package]] name = "imbl-value" -version = "0.2.0" -source = "git+https://github.com/Start9Labs/imbl-value.git#16ab02c9bb6fcf10216c57dd6856daa1274e702d" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04359f6198e92e1986d221cfa7de62cd4c9c27880dffb2f98b6eaaec40cde4f" dependencies = [ "imbl", "serde", @@ -3029,12 +3028,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "serde", ] @@ -3048,7 +3047,7 @@ dependencies = [ "number_prefix", "portable-atomic", "tokio", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "web-time", ] @@ -3071,6 +3070,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -3278,10 +3288,9 @@ dependencies = [ name = "json-patch" version = "0.2.7-alpha.0" dependencies = [ - "imbl-value 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imbl-value 0.3.2", "json-ptr", "serde", - "treediff", ] [[package]] @@ -3289,7 +3298,7 @@ name = "json-ptr" version = "0.1.0" dependencies = [ "imbl", - "imbl-value 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imbl-value 0.3.2", "serde", "thiserror 2.0.12", ] @@ -3299,7 +3308,7 @@ name = "jsonpath_lib" version = "0.3.0" source = "git+https://github.com/Start9Labs/jsonpath.git#1cacbd64afa2e1941a21fef06bad14317ba92f30" dependencies = [ - "imbl-value 0.2.0 (git+https://github.com/Start9Labs/imbl-value.git)", + "imbl-value 0.3.0", "log", "serde", "serde_json", @@ -3391,9 +3400,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libloading" @@ -3402,7 +3411,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-targets 0.53.2", ] [[package]] @@ -3413,13 +3422,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", ] [[package]] @@ -3444,9 +3453,9 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" dependencies = [ "zlib-rs", ] @@ -3508,9 +3517,9 @@ dependencies = [ [[package]] name = "lz4_flex" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" +checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] name = "lzma-rs" @@ -3583,7 +3592,7 @@ dependencies = [ "mail-builder", "md5", "rand 0.8.5", - "rustls 0.23.27", + "rustls 0.23.29", "rustls-pki-types", "smtp-proto", "tokio", @@ -3614,9 +3623,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "mbrman" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43cfbd409d2d8b351da0efcbc796e9fe7d7b9d05ddf0d24b561a6d3a1c2a060" +checksum = "76fbcfee7fbe4307a3317ba5d939fd076cad5e8f64a5d9cbc0f6900d513d6f76" dependencies = [ "bincode 2.0.1", "bitvec 1.0.1", @@ -3643,9 +3652,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" @@ -3688,9 +3697,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -3703,7 +3712,7 @@ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -3714,7 +3723,7 @@ dependencies = [ "axum 0.8.4", "base64 0.22.1", "color-eyre", - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "exver", "gpt", "ipnet", @@ -3727,7 +3736,7 @@ dependencies = [ "regex", "reqwest", "rpc-toolkit", - "rustls 0.23.27", + "rustls 0.23.29", "serde", "serde_json", "sqlx", @@ -3959,23 +3968,24 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4062,7 +4072,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4073,9 +4083,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.0+3.5.0" +version = "300.5.1+3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" +checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" dependencies = [ "cc", ] @@ -4111,9 +4121,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "p256" @@ -4177,7 +4187,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", "smallvec", "windows-targets 0.52.6", ] @@ -4190,7 +4200,7 @@ dependencies = [ "fd-lock-rs", "futures", "imbl", - "imbl-value 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imbl-value 0.3.2", "json-patch", "json-ptr", "lazy_static", @@ -4260,9 +4270,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", "thiserror 2.0.12", @@ -4271,9 +4281,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" dependencies = [ "pest", "pest_generator", @@ -4281,24 +4291,23 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "pest_meta" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" dependencies = [ - "once_cell", "pest", "sha2 0.10.9", ] @@ -4310,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.9.0", + "indexmap 2.10.0", ] [[package]] @@ -4345,7 +4354,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4415,9 +4424,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" @@ -4451,12 +4460,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.33" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4488,7 +4497,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.26", + "toml_edit 0.22.27", ] [[package]] @@ -4527,17 +4536,17 @@ dependencies = [ [[package]] name = "proptest" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", "bitflags 2.9.1", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.1", + "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -4553,7 +4562,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4576,7 +4585,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -4596,11 +4605,11 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "pty-process" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8277b026e63da5d2cc435f842b52bedb1d050dfd7d633bba009c3c8e1883a21e" +checksum = "8a480f2bcfed0fee5dd30e529d985c2ff4457dc7468b3c0dcb92b9fd2b14c6b9" dependencies = [ - "rustix 0.38.44", + "rustix 1.0.7", ] [[package]] @@ -4648,9 +4657,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -4766,11 +4775,11 @@ dependencies = [ [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.9.3", ] [[package]] @@ -4821,9 +4830,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags 2.9.1", ] @@ -4845,6 +4854,26 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "regex" version = "1.11.1" @@ -4891,9 +4920,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.19" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", @@ -4910,12 +4939,10 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "rustls-pki-types", @@ -4925,7 +4952,6 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-socks", "tokio-util", "tower 0.5.2", "tower-http", @@ -4992,8 +5018,8 @@ dependencies = [ [[package]] name = "rpc-toolkit" -version = "0.3.0" -source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=master#131d9b291b025cb5277cbad5150e3dd434ed1c09" +version = "0.3.1" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=master#f83d9d9934036c1bc929073cad537774ecdbb5f2" dependencies = [ "async-stream", "async-trait", @@ -5002,7 +5028,7 @@ dependencies = [ "futures", "http", "http-body-util", - "imbl-value 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imbl-value 0.3.2", "itertools 0.14.0", "lazy_format", "lazy_static", @@ -5062,9 +5088,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -5097,8 +5123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.9.1", - "errno 0.3.12", - "itoa", + "errno 0.3.13", "libc", "linux-raw-sys 0.4.15", "windows-sys 0.59.0", @@ -5111,7 +5136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.1", - "errno 0.3.12", + "errno 0.3.13", "libc", "linux-raw-sys 0.9.4", "windows-sys 0.59.0", @@ -5145,16 +5170,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -5209,9 +5234,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -5249,7 +5274,7 @@ dependencies = [ "thingbuf", "thiserror 2.0.12", "unicode-segmentation", - "unicode-width 0.2.0", + "unicode-width 0.2.1", ] [[package]] @@ -5276,6 +5301,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -5372,7 +5421,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5381,7 +5430,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "itoa", "memchr", "ryu", @@ -5417,14 +5466,14 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -5443,15 +5492,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -5461,14 +5512,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5477,7 +5528,7 @@ version = "0.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59e2dd588bf1597a252c3b920e0143eb99b0f76e4e082f4c92ce34fbc9e71ddd" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "itoa", "libyml", "memchr", @@ -5641,18 +5692,15 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -5734,14 +5782,14 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.3", + "hashbrown 0.15.4", "hashlink", - "indexmap 2.9.0", + "indexmap 2.10.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.27", + "rustls 0.23.29", "serde", "serde_json", "sha2 0.10.9", @@ -5764,7 +5812,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -5787,7 +5835,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.101", + "syn 2.0.104", "tokio", "url", ] @@ -5921,7 +5969,7 @@ dependencies = [ "quote", "regex-syntax 0.6.29", "strsim 0.10.0", - "syn 2.0.101", + "syn 2.0.104", "unicode-width 0.1.14", ] @@ -5952,7 +6000,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" dependencies = [ - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "p256", "p384", "p521", @@ -5975,7 +6023,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "start-os" -version = "0.4.0-alpha.8" +version = "0.4.0-alpha.9" dependencies = [ "aes 0.7.5", "async-acme", @@ -6005,7 +6053,7 @@ dependencies = [ "divrem", "ed25519 2.2.3", "ed25519-dalek 1.0.1", - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "exver", "fd-lock-rs", "form_urlencoded", @@ -6020,9 +6068,9 @@ dependencies = [ "hyper-util", "id-pool", "imbl", - "imbl-value 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imbl-value 0.3.2", "include_dir", - "indexmap 2.9.0", + "indexmap 2.10.0", "indicatif", "integer-encoding", "ipnet", @@ -6069,7 +6117,7 @@ dependencies = [ "rpassword", "rpc-toolkit", "rust-argon2", - "rustls 0.23.27", + "rustls 0.23.29", "rustls-pki-types", "rustyline-async", "semver", @@ -6098,7 +6146,7 @@ dependencies = [ "tokio-tar", "tokio-tungstenite", "tokio-util", - "toml 0.8.22", + "toml 0.8.23", "torut", "tower-service", "tracing", @@ -6177,9 +6225,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -6203,7 +6251,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -6241,7 +6289,7 @@ checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", - "xattr 1.5.0", + "xattr 1.5.1", ] [[package]] @@ -6297,7 +6345,7 @@ checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.2.0", + "unicode-width 0.2.1", ] [[package]] @@ -6336,7 +6384,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -6347,7 +6395,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -6363,12 +6411,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -6438,17 +6485,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "tracing", @@ -6463,7 +6512,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -6503,7 +6552,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.27", + "rustls 0.23.29", "tokio", ] @@ -6586,21 +6635,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.26", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] @@ -6611,7 +6660,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "serde", "serde_spanned", "toml_datetime", @@ -6620,23 +6669,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "serde", "serde_spanned", "toml_datetime", "toml_write", - "winnow 0.7.10", + "winnow 0.7.12", ] [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tonic" @@ -6767,20 +6816,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -6846,15 +6895,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "treediff" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ce481b2b7c2534fe7b5242cccebf37f9084392665c6a3783c414a1bada5432" -dependencies = [ - "serde_json", -] - [[package]] name = "trust-dns-proto" version = "0.23.2" @@ -6925,7 +6965,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "termcolor", ] @@ -6965,7 +7005,7 @@ checksum = "60d8d828da2a3d759d3519cdf29a5bac49c77d039ad36d0782edadbf9cd5415b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7050,9 +7090,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "unicode-xid" @@ -7189,9 +7229,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -7230,7 +7270,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -7265,7 +7305,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7318,14 +7358,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.0", + "webpki-roots 1.0.1", ] [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" dependencies = [ "rustls-pki-types", ] @@ -7348,7 +7388,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ - "redox_syscall 0.5.12", + "redox_syscall 0.5.13", "wasite", ] @@ -7410,7 +7450,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7421,20 +7461,20 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-registry" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link", "windows-result", @@ -7486,6 +7526,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -7519,9 +7568,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", @@ -7682,9 +7731,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -7757,9 +7806,9 @@ dependencies = [ [[package]] name = "xattr" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", "rustix 1.0.7", @@ -7833,15 +7882,15 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "synstructure", ] [[package]] name = "zbus" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" dependencies = [ "async-broadcast", "async-executor", @@ -7864,7 +7913,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.10", + "winnow 0.7.12", "zbus_macros", "zbus_names", "zvariant", @@ -7872,14 +7921,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "zbus_names", "zvariant", "zvariant_utils", @@ -7893,28 +7942,28 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.10", + "winnow 0.7.12", "zvariant", ] [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7934,7 +7983,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "synstructure", ] @@ -7955,7 +8004,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -7988,7 +8037,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -8008,7 +8057,7 @@ dependencies = [ "flate2", "getrandom 0.3.3", "hmac", - "indexmap 2.9.0", + "indexmap 2.10.0", "lzma-rs", "memchr", "pbkdf2", @@ -8023,9 +8072,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" [[package]] name = "zopfli" @@ -8069,28 +8118,28 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" +checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" dependencies = [ "endi", "enumflags2", "serde", - "winnow 0.7.10", + "winnow 0.7.12", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" +checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "zvariant_utils", ] @@ -8104,6 +8153,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.101", - "winnow 0.7.10", + "syn 2.0.104", + "winnow 0.7.12", ] diff --git a/core/models/src/id/replay.rs b/core/models/src/id/replay.rs index 299b6160a..77cc3e607 100644 --- a/core/models/src/id/replay.rs +++ b/core/models/src/id/replay.rs @@ -9,6 +9,14 @@ use yasi::InternedString; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, TS)] #[ts(type = "string")] pub struct ReplayId(InternedString); +impl From for ReplayId +where + T: Into, +{ + fn from(value: T) -> Self { + Self(value.into()) + } +} impl FromStr for ReplayId { type Err = Infallible; fn from_str(s: &str) -> Result { diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index 7f5c8f681..9acc84445 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -14,7 +14,7 @@ keywords = [ name = "start-os" readme = "README.md" repository = "https://github.com/Start9Labs/start-os" -version = "0.4.0-alpha.8" # VERSION_BUMP +version = "0.4.0-alpha.9" # VERSION_BUMP license = "MIT" [lib] @@ -117,7 +117,7 @@ id-pool = { version = "0.2.2", default-features = false, features = [ "u16", ] } imbl = "4.0.1" -imbl-value = "0.2.0" +imbl-value = "0.3.2" include_dir = { version = "0.7.3", features = ["metadata"] } indexmap = { version = "2.0.2", features = ["serde"] } indicatif = { version = "0.17.7", features = ["tokio"] } diff --git a/core/startos/src/context/config.rs b/core/startos/src/context/config.rs index 1339cb6d4..b98b07f16 100644 --- a/core/startos/src/context/config.rs +++ b/core/startos/src/context/config.rs @@ -6,11 +6,8 @@ use clap::Parser; use reqwest::Url; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; -use sqlx::postgres::PgConnectOptions; -use sqlx::PgPool; use crate::disk::OsPartitionInfo; -use crate::init::init_postgres; use crate::prelude::*; use crate::util::serde::IoFormat; use crate::version::VersionT; @@ -151,16 +148,4 @@ impl ServerConfig { Ok(db) } - #[instrument(skip_all)] - pub async fn secret_store(&self) -> Result { - init_postgres("/media/startos/data").await?; - let secret_store = - PgPool::connect_with(PgConnectOptions::new().database("secrets").username("root")) - .await?; - sqlx::migrate!() - .run(&secret_store) - .await - .with_kind(crate::ErrorKind::Database)?; - Ok(secret_store) - } } diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index 6e7d1618a..cfbf4375f 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -1,7 +1,9 @@ use std::collections::{BTreeMap, BTreeSet}; +use std::ffi::OsStr; use std::future::Future; use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; use std::ops::Deref; +use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; @@ -28,6 +30,7 @@ use crate::db::model::package::TaskSeverity; use crate::db::model::Database; use crate::disk::OsPartitionInfo; use crate::init::{check_time_is_synchronized, InitResult}; +use crate::install::PKG_ARCHIVE_DIR; use crate::lxc::{ContainerId, LxcContainer, LxcManager}; use crate::net::net_controller::{NetController, NetService}; use crate::net::utils::{find_eth_iface, find_wifi_iface}; @@ -40,8 +43,10 @@ use crate::service::action::update_tasks; use crate::service::effects::callbacks::ServiceCallbacks; use crate::service::ServiceMap; use crate::shutdown::Shutdown; +use crate::util::io::delete_file; use crate::util::lshw::LshwDevice; use crate::util::sync::{SyncMutex, Watch}; +use crate::DATA_DIR; pub struct RpcContextSeed { is_closed: AtomicBool, @@ -103,6 +108,7 @@ impl InitRpcContextPhases { pub struct CleanupInitPhases { cleanup_sessions: PhaseProgressTrackerHandle, init_services: PhaseProgressTrackerHandle, + prune_s9pks: PhaseProgressTrackerHandle, check_tasks: PhaseProgressTrackerHandle, } impl CleanupInitPhases { @@ -110,6 +116,7 @@ impl CleanupInitPhases { Self { cleanup_sessions: handle.add_phase("Cleaning up sessions".into(), Some(1)), init_services: handle.add_phase("Initializing services".into(), Some(10)), + prune_s9pks: handle.add_phase("Pruning S9PKs".into(), Some(1)), check_tasks: handle.add_phase("Checking action requests".into(), Some(1)), } } @@ -307,7 +314,8 @@ impl RpcContext { &self, CleanupInitPhases { mut cleanup_sessions, - init_services, + mut init_services, + mut prune_s9pks, mut check_tasks, }: CleanupInitPhases, ) -> Result<(), Error> { @@ -366,12 +374,38 @@ impl RpcContext { }); cleanup_sessions.complete(); - self.services.init(&self, init_services).await?; - tracing::info!("Initialized Services"); + init_services.start(); + self.services.init(&self).await?; + init_services.complete(); - // TODO - check_tasks.start(); + prune_s9pks.start(); let peek = self.db.peek().await; + let keep = peek + .as_public() + .as_package_data() + .as_entries()? + .into_iter() + .map(|(_, pde)| pde.as_s9pk().de()) + .collect::, Error>>()?; + let installed_dir = &Path::new(DATA_DIR).join(PKG_ARCHIVE_DIR).join("installed"); + if tokio::fs::metadata(&installed_dir).await.is_ok() { + let mut dir = tokio::fs::read_dir(&installed_dir) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("dir {installed_dir:?}")))?; + while let Some(file) = dir + .next_entry() + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("dir {installed_dir:?}")))? + { + let path = file.path(); + if path.extension() == Some(OsStr::new("s9pk")) && !keep.contains(&path) { + delete_file(path).await?; + } + } + } + prune_s9pks.complete(); + + check_tasks.start(); let mut action_input: OrdMap> = OrdMap::new(); let tasks: BTreeSet<_> = peek .as_public() diff --git a/core/startos/src/db/model/package.rs b/core/startos/src/db/model/package.rs index 7c9526d36..34c9c5f5d 100644 --- a/core/startos/src/db/model/package.rs +++ b/core/startos/src/db/model/package.rs @@ -1,4 +1,5 @@ use std::collections::{BTreeMap, BTreeSet}; +use std::path::PathBuf; use chrono::{DateTime, Utc}; use exver::VersionRange; @@ -287,6 +288,7 @@ pub struct InstallingState { #[ts(export)] pub struct UpdatingState { pub manifest: Manifest, + pub s9pk: PathBuf, pub installing_info: InstallingInfo, } @@ -362,7 +364,7 @@ impl Default for ActionVisibility { #[ts(export)] pub struct PackageDataEntry { pub state_info: PackageState, - pub data_version: Option, + pub s9pk: PathBuf, pub status: MainStatus, #[ts(type = "string | null")] pub registry: Option, diff --git a/core/startos/src/db/model/public.rs b/core/startos/src/db/model/public.rs index a91f1b372..1fad92be6 100644 --- a/core/startos/src/db/model/public.rs +++ b/core/startos/src/db/model/public.rs @@ -50,7 +50,7 @@ impl Public { hostname: account.hostname.no_dot_host_name(), last_backup: None, package_version_compat: Current::default().compat().clone(), - post_init_migration_todos: BTreeSet::new(), + post_init_migration_todos: BTreeMap::new(), network: NetworkInfo { host: Host { bindings: [( @@ -155,8 +155,8 @@ pub struct ServerInfo { pub version: Version, #[ts(type = "string")] pub package_version_compat: VersionRange, - #[ts(type = "string[]")] - pub post_init_migration_todos: BTreeSet, + #[ts(type = "Record")] + pub post_init_migration_todos: BTreeMap, #[ts(type = "string | null")] pub last_backup: Option>, pub network: NetworkInfo, diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index 22a286fa3..55b6ef462 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -60,145 +60,6 @@ pub async fn check_time_is_synchronized() -> Result { == "NTPSynchronized=yes") } -// must be idempotent -#[tracing::instrument(skip_all)] -pub async fn init_postgres(datadir: impl AsRef) -> Result<(), Error> { - let db_dir = datadir.as_ref().join("main/postgresql"); - if tokio::process::Command::new("mountpoint") - .arg("/var/lib/postgresql") - .stdout(std::process::Stdio::null()) - .stderr(std::process::Stdio::null()) - .status() - .await? - .success() - { - unmount("/var/lib/postgresql", true).await?; - } - let exists = tokio::fs::metadata(&db_dir).await.is_ok(); - if !exists { - Command::new("cp") - .arg("-ra") - .arg("/var/lib/postgresql") - .arg(&db_dir) - .invoke(crate::ErrorKind::Filesystem) - .await?; - } - Command::new("chown") - .arg("-R") - .arg("postgres:postgres") - .arg(&db_dir) - .invoke(crate::ErrorKind::Database) - .await?; - - let mut pg_paths = tokio::fs::read_dir("/usr/lib/postgresql").await?; - let mut pg_version = None; - while let Some(pg_path) = pg_paths.next_entry().await? { - let pg_path_version = pg_path - .file_name() - .to_str() - .map(|v| v.parse()) - .transpose()? - .unwrap_or(0); - if pg_path_version > pg_version.unwrap_or(0) { - pg_version = Some(pg_path_version) - } - } - let pg_version = pg_version.ok_or_else(|| { - Error::new( - eyre!("could not determine postgresql version"), - crate::ErrorKind::Database, - ) - })?; - - crate::disk::mount::util::bind(&db_dir, "/var/lib/postgresql", false).await?; - - let pg_version_string = pg_version.to_string(); - let pg_version_path = db_dir.join(&pg_version_string); - if exists - // maybe migrate - { - let incomplete_path = db_dir.join(format!("{pg_version}.migration.incomplete")); - if tokio::fs::metadata(&incomplete_path).await.is_ok() // previous migration was incomplete - && tokio::fs::metadata(&pg_version_path).await.is_ok() - { - tokio::fs::remove_dir_all(&pg_version_path).await?; - } - if tokio::fs::metadata(&pg_version_path).await.is_err() - // need to migrate - { - let conf_dir = Path::new("/etc/postgresql").join(pg_version.to_string()); - let conf_dir_tmp = { - let mut tmp = conf_dir.clone(); - tmp.set_extension("tmp"); - tmp - }; - if tokio::fs::metadata(&conf_dir).await.is_ok() { - Command::new("mv") - .arg(&conf_dir) - .arg(&conf_dir_tmp) - .invoke(ErrorKind::Filesystem) - .await?; - } - let mut old_version = pg_version; - while old_version > 13 - /* oldest pg version included in startos */ - { - old_version -= 1; - let old_datadir = db_dir.join(old_version.to_string()); - if tokio::fs::metadata(&old_datadir).await.is_ok() { - create_file(&incomplete_path).await?.sync_all().await?; - Command::new("pg_upgradecluster") - .arg(old_version.to_string()) - .arg("main") - .invoke(crate::ErrorKind::Database) - .await?; - break; - } - } - if tokio::fs::metadata(&conf_dir).await.is_ok() { - if tokio::fs::metadata(&conf_dir).await.is_ok() { - tokio::fs::remove_dir_all(&conf_dir).await?; - } - Command::new("mv") - .arg(&conf_dir_tmp) - .arg(&conf_dir) - .invoke(ErrorKind::Filesystem) - .await?; - } - tokio::fs::remove_file(&incomplete_path).await?; - } - if tokio::fs::metadata(&incomplete_path).await.is_ok() { - unreachable!() // paranoia - } - } - - Command::new("systemctl") - .arg("start") - .arg(format!("postgresql@{pg_version}-main.service")) - .invoke(crate::ErrorKind::Database) - .await?; - if !exists { - Command::new("sudo") - .arg("-u") - .arg("postgres") - .arg("createuser") - .arg("root") - .invoke(crate::ErrorKind::Database) - .await?; - Command::new("sudo") - .arg("-u") - .arg("postgres") - .arg("createdb") - .arg("secrets") - .arg("-O") - .arg("root") - .invoke(crate::ErrorKind::Database) - .await?; - } - - Ok(()) -} - pub struct InitResult { pub net_ctrl: Arc, pub os_net_service: NetService, @@ -336,7 +197,6 @@ pub async fn init( let db = TypedPatchDb::::load_unchecked(db); let peek = db.peek().await; load_database.complete(); - tracing::info!("Opened PatchDB"); load_ssh_keys.start(); crate::ssh::sync_keys( @@ -347,7 +207,6 @@ pub async fn init( ) .await?; load_ssh_keys.complete(); - tracing::info!("Synced SSH Keys"); let account = AccountInfo::load(&peek)?; @@ -398,13 +257,16 @@ pub async fn init( .arg("systemd-journald") .invoke(crate::ErrorKind::Journald) .await?; + Command::new("killall") + .arg("journalctl") + .invoke(crate::ErrorKind::Journald) + .await?; mount_logs.complete(); tokio::io::copy( &mut open_file("/run/startos/init.log").await?, &mut tokio::io::stderr(), ) .await?; - tracing::info!("Mounted Logs"); load_ca_cert.start(); // write to ca cert store @@ -434,7 +296,6 @@ pub async fn init( .result?; crate::net::wifi::synchronize_network_manager(MAIN_DATA, &wifi).await?; load_wifi.complete(); - tracing::info!("Synchronized WiFi"); init_tmp.start(); let tmp_dir = Path::new(PACKAGE_DATA).join("tmp"); @@ -476,7 +337,6 @@ pub async fn init( if let Some(governor) = governor { tracing::info!("Setting CPU Governor to \"{governor}\""); cpupower::set_governor(governor).await?; - tracing::info!("Set CPU Governor"); } set_governor.complete(); @@ -504,8 +364,6 @@ pub async fn init( } if !ntp_synced { tracing::warn!("Timed out waiting for system time to synchronize"); - } else { - tracing::info!("Syncronized system clock"); } sync_clock.complete(); @@ -537,7 +395,6 @@ pub async fn init( }) .await .result?; - tracing::info!("Updated server info"); update_server_info.complete(); launch_service_network.start(); @@ -546,7 +403,6 @@ pub async fn init( .arg("lxc-net.service") .invoke(ErrorKind::Lxc) .await?; - tracing::info!("Launched service intranet"); launch_service_network.complete(); validate_db.start(); @@ -556,7 +412,6 @@ pub async fn init( }) .await .result?; - tracing::info!("Validated database"); validate_db.complete(); if let Some(progress) = postinit { diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index 5a9c64410..2adac3169 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -134,7 +134,7 @@ pub async fn install( "package.get", json!({ "id": id, - "version": VersionRange::exactly(version.deref().clone()), + "targetVersion": VersionRange::exactly(version.deref().clone()), }), RegistryUrlParams { registry: registry.clone(), @@ -476,7 +476,7 @@ pub async fn cli_install( let mut packages: GetPackageResponse = from_value( ctx.call_remote::( "package.get", - json!({ "id": &id, "version": version, "sourceVersion": source_version }), + json!({ "id": &id, "targetVersion": version, "sourceVersion": source_version }), ) .await?, )?; diff --git a/core/startos/src/install/update.rs b/core/startos/src/install/update.rs deleted file mode 100644 index a0374fc80..000000000 --- a/core/startos/src/install/update.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::collections::BTreeMap; - -use models::PackageId; -use rpc_toolkit::command; -use tracing::instrument; - -use crate::config::not_found; -use crate::context::RpcContext; -use crate::db::model::CurrentDependents; -use crate::prelude::*; -use crate::util::serde::display_serializable; -use crate::util::Version; -use crate::Error; - -#[command(subcommands(dry))] -pub async fn update() -> Result<(), Error> { - Ok(()) -} diff --git a/core/startos/src/lxc/mod.rs b/core/startos/src/lxc/mod.rs index eddd5971b..4ad11ecae 100644 --- a/core/startos/src/lxc/mod.rs +++ b/core/startos/src/lxc/mod.rs @@ -584,8 +584,10 @@ pub async fn stats(ctx: RpcContext) -> Result> = - ctx.services.get(&id).await; + let Some(service) = ctx.services.try_get(&id) else { + stats.insert(id, None); + continue; + }; let Some(service_ref) = service.as_ref() else { stats.insert(id, None); diff --git a/core/startos/src/net/network_interface.rs b/core/startos/src/net/network_interface.rs index 80c860c0a..f69989261 100644 --- a/core/startos/src/net/network_interface.rs +++ b/core/startos/src/net/network_interface.rs @@ -410,6 +410,7 @@ async fn watcher( if let Err(e) = res { tracing::error!("{e}"); tracing::debug!("{e:?}"); + tokio::time::sleep(Duration::from_secs(1)).await; } } } @@ -420,7 +421,7 @@ async fn get_wan_ipv4(iface: &str) -> Result, Error> { let client = client.interface(iface); Ok(client .build()? - .get("http://ip4only.me/api/") + .get("https://ip4only.me/api/") .timeout(Duration::from_secs(10)) .send() .await? diff --git a/core/startos/src/net/static_server.rs b/core/startos/src/net/static_server.rs index 8c0330c10..ab38a0d71 100644 --- a/core/startos/src/net/static_server.rs +++ b/core/startos/src/net/static_server.rs @@ -22,6 +22,7 @@ use http::request::Parts as RequestParts; use http::{HeaderValue, Method, StatusCode}; use imbl_value::InternedString; use include_dir::Dir; +use models::PackageId; use new_mime_guess::MimeGuess; use openssl::hash::MessageDigest; use openssl::x509::X509; @@ -32,7 +33,6 @@ use url::Url; use crate::context::{DiagnosticContext, InitContext, InstallContext, RpcContext, SetupContext}; use crate::hostname::Hostname; -use crate::install::PKG_ARCHIVE_DIR; use crate::middleware::auth::{Auth, HasValidSession}; use crate::middleware::cors::Cors; use crate::middleware::db::SyncDb; @@ -46,7 +46,7 @@ use crate::s9pk::S9pk; use crate::util::io::open_file; use crate::util::net::SyncBody; use crate::util::serde::BASE64; -use crate::{diagnostic_api, init_api, install_api, main_api, setup_api, DATA_DIR}; +use crate::{diagnostic_api, init_api, install_api, main_api, setup_api}; const NOT_FOUND: &[u8] = b"Not Found"; const METHOD_NOT_ALLOWED: &[u8] = b"Method Not Allowed"; @@ -263,13 +263,22 @@ fn s9pk_router(ctx: RpcContext) -> Router { any( |x::Path(s9pk): x::Path, request: Request| async move { if_authorized(&ctx, request, |request| async { + let id = s9pk + .strip_suffix(".s9pk") + .unwrap_or(&s9pk) + .parse::()?; let (parts, _) = request.into_parts(); match FileData::from_path( &parts, - &Path::new(DATA_DIR) - .join(PKG_ARCHIVE_DIR) - .join("installed") - .join(s9pk), + &ctx.db + .peek() + .await + .into_public() + .into_package_data() + .into_idx(&id) + .or_not_found(&id)? + .into_s9pk() + .de()?, ) .await? { @@ -289,13 +298,22 @@ fn s9pk_router(ctx: RpcContext) -> Router { x::RawQuery(query): x::RawQuery, request: Request| async move { if_authorized(&ctx, request, |request| async { + let id = s9pk + .strip_suffix(".s9pk") + .unwrap_or(&s9pk) + .parse::()?; let s9pk = S9pk::deserialize( &MultiCursorFile::from( open_file( - Path::new(DATA_DIR) - .join(PKG_ARCHIVE_DIR) - .join("installed") - .join(s9pk), + ctx.db + .peek() + .await + .into_public() + .into_package_data() + .into_idx(&id) + .or_not_found(&id)? + .into_s9pk() + .de()?, ) .await?, ), diff --git a/core/startos/src/net/web_server.rs b/core/startos/src/net/web_server.rs index 005735a4a..b9c5d0703 100644 --- a/core/startos/src/net/web_server.rs +++ b/core/startos/src/net/web_server.rs @@ -24,7 +24,7 @@ use crate::net::static_server::{ }; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; -use crate::util::sync::Watch; +use crate::util::sync::{SyncMutex, Watch}; pub struct Accepted { pub https_redirect: bool, @@ -166,18 +166,20 @@ impl WebServer { let thread = NonDetachingJoinHandle::from(tokio::spawn(async move { #[derive(Clone)] struct QueueRunner { - queue: Arc>>, + queue: Arc>>, } impl hyper::rt::Executor for QueueRunner where Fut: Future + Send + 'static, { fn execute(&self, fut: Fut) { - if let Some(q) = &*self.queue.read().unwrap() { - q.add_job(fut); - } else { - tracing::warn!("job queued after shutdown"); - } + self.queue.peek(|q| { + if let Some(q) = q { + q.add_job(fut); + } else { + tracing::warn!("job queued after shutdown"); + } + }) } } @@ -209,8 +211,7 @@ impl WebServer { } } - let accept = AtomicBool::new(true); - let queue_cell = Arc::new(RwLock::new(None)); + let queue_cell = Arc::new(SyncMutex::new(None)); let graceful = hyper_util::server::graceful::GracefulShutdown::new(); let mut server = hyper_util::server::conn::auto::Builder::new(QueueRunner { queue: queue_cell.clone(), @@ -226,7 +227,7 @@ impl WebServer { .keep_alive_interval(Duration::from_secs(60)) .keep_alive_timeout(Duration::from_secs(300)); let (queue, mut runner) = BackgroundJobQueue::new(); - *queue_cell.write().unwrap() = Some(queue.clone()); + queue_cell.mutate(|q| *q = Some(queue.clone())); let handler = async { loop { @@ -260,9 +261,8 @@ impl WebServer { _ = &mut runner => (), } - accept.store(false, std::sync::atomic::Ordering::SeqCst); drop(queue); - drop(queue_cell.write().unwrap().take()); + drop(queue_cell.mutate(|q| q.take())); if !runner.is_empty() { tokio::time::timeout(Duration::from_secs(60), runner) diff --git a/core/startos/src/progress.rs b/core/startos/src/progress.rs index df3810d6c..d570e8a90 100644 --- a/core/startos/src/progress.rs +++ b/core/startos/src/progress.rs @@ -5,6 +5,7 @@ use futures::future::pending; use futures::stream::BoxStream; use futures::{Future, FutureExt, StreamExt, TryFutureExt}; use helpers::NonDetachingJoinHandle; +use imbl::Vector; use imbl_value::{InOMap, InternedString}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use itertools::Itertools; @@ -219,14 +220,22 @@ impl FullProgress { #[derive(Clone)] pub struct FullProgressTracker { + log: bool, overall: watch::Sender, - phases: watch::Sender>>, + phases: watch::Sender)>>, } impl FullProgressTracker { pub fn new() -> Self { let (overall, _) = watch::channel(Progress::new()); - let (phases, _) = watch::channel(InOMap::new()); - Self { overall, phases } + let (phases, _) = watch::channel(Vector::new()); + Self { + log: false, + overall, + phases, + } + } + pub fn enable_logging(&mut self, log: bool) { + self.log = log; } pub fn snapshot(&self) -> FullProgress { FullProgress { @@ -245,8 +254,8 @@ impl FullProgressTracker { pub fn stream(&self, min_interval: Option) -> BoxStream<'static, FullProgress> { struct StreamState { overall: watch::Receiver, - phases_recv: watch::Receiver>>, - phases: InOMap>, + phases_recv: watch::Receiver)>>, + phases: Vector<(InternedString, watch::Receiver)>, } let mut overall = self.overall.subscribe(); overall.mark_changed(); // make sure stream starts with a value @@ -280,11 +289,14 @@ impl FullProgressTracker { futures::future::select_all(changed).await; } - for (name, phase) in &*phases_recv.borrow_and_update() { - if !phases.contains_key(name) { - phases.insert(name.clone(), phase.clone()); + let phases_ref = phases_recv.borrow_and_update(); + for (idx, (name, recv)) in phases_ref.iter().enumerate() { + if phases.get(idx).map(|(n, _)| n) != Some(name) { + phases.insert(idx, (name.clone(), recv.clone())); } } + phases.truncate(phases_ref.len()); + drop(phases_ref); let o = *overall.borrow_and_update(); @@ -363,10 +375,12 @@ impl FullProgressTracker { .send_modify(|o| o.add_total(overall_contribution)); } let (send, recv) = watch::channel(Progress::new()); + let log = self.log.then(|| name.clone()); self.phases.send_modify(|p| { - p.insert(name, recv); + p.push_back((name, recv)); }); PhaseProgressTrackerHandle { + log, overall: self.overall.clone(), overall_contribution, contributed: 0, @@ -379,6 +393,7 @@ impl FullProgressTracker { } pub struct PhaseProgressTrackerHandle { + log: Option, overall: watch::Sender, overall_contribution: Option, contributed: u64, @@ -404,6 +419,9 @@ impl PhaseProgressTrackerHandle { } } pub fn start(&mut self) { + if let Some(name) = &self.log { + tracing::info!("{}...", name) + } self.progress.send_modify(|p| p.start()); } pub fn set_done(&mut self, done: u64) { @@ -424,6 +442,9 @@ impl PhaseProgressTrackerHandle { pub fn complete(&mut self) { self.progress.send_modify(|p| p.set_complete()); self.update_overall(); + if let Some(name) = &self.log { + tracing::info!("{}: complete", name) + } } pub fn writer(self, writer: W) -> ProgressTrackerWriter { ProgressTrackerWriter { diff --git a/core/startos/src/registry/context.rs b/core/startos/src/registry/context.rs index 828f3e6e1..1da189c91 100644 --- a/core/startos/src/registry/context.rs +++ b/core/startos/src/registry/context.rs @@ -181,24 +181,20 @@ impl CallRemote for CliContext { }; let body = serde_json::to_vec(&rpc_req)?; let host = url.host().or_not_found("registry hostname")?.to_string(); - let res = self + let mut req = self .client .request(Method::POST, url) .header(CONTENT_TYPE, "application/json") .header(ACCEPT, "application/json") - .header(CONTENT_LENGTH, body.len()) - .header( + .header(CONTENT_LENGTH, body.len()); + if let Ok(key) = self.developer_key() { + req = req.header( AUTH_SIG_HEADER, - SignatureHeader::sign( - &AnySigningKey::Ed25519(self.developer_key()?.clone()), - &body, - &host, - )? - .to_header(), - ) - .body(body) - .send() - .await?; + SignatureHeader::sign(&AnySigningKey::Ed25519(key.clone()), &body, &host)? + .to_header(), + ); + } + let res = req.body(body).send().await?; if !res.status().is_success() { let status = res.status(); diff --git a/core/startos/src/registry/package/index.rs b/core/startos/src/registry/package/index.rs index 2081d4771..dc8df7461 100644 --- a/core/startos/src/registry/package/index.rs +++ b/core/startos/src/registry/package/index.rs @@ -84,10 +84,14 @@ pub struct PackageVersionInfo { pub marketing_site: Url, #[ts(type = "string | null")] pub donation_url: Option, + #[ts(type = "string | null")] + pub docs_url: Option, pub alerts: Alerts, pub dependency_metadata: BTreeMap, #[ts(type = "string")] pub os_version: Version, + #[ts(type = "string | null")] + pub sdk_version: Option, pub hardware_requirements: HardwareRequirements, #[ts(type = "string | null")] pub source_version: Option, @@ -121,9 +125,11 @@ impl PackageVersionInfo { support_site: manifest.support_site.clone(), marketing_site: manifest.marketing_site.clone(), donation_url: manifest.donation_url.clone(), + docs_url: manifest.docs_url.clone(), alerts: manifest.alerts.clone(), dependency_metadata, os_version: manifest.os_version.clone(), + sdk_version: manifest.sdk_version.clone(), hardware_requirements: manifest.hardware_requirements.clone(), source_version: None, // TODO s9pk: RegistryAsset { diff --git a/core/startos/src/s9pk/git_hash.rs b/core/startos/src/s9pk/git_hash.rs index a4c9bb2b9..b798d0052 100644 --- a/core/startos/src/s9pk/git_hash.rs +++ b/core/startos/src/s9pk/git_hash.rs @@ -21,6 +21,9 @@ impl GitHash { .invoke(ErrorKind::Git) .await?, )?; + while hash.ends_with(|c: char| c.is_whitespace()) { + hash.pop(); + } if Command::new("git") .arg("diff-index") .arg("--quiet") @@ -44,6 +47,9 @@ impl GitHash { .stdout, ) .ok()?; + while hash.ends_with(|c: char| c.is_whitespace()) { + hash.pop(); + } if !std::process::Command::new("git") .arg("diff-index") .arg("--quiet") diff --git a/core/startos/src/s9pk/merkle_archive/source/mod.rs b/core/startos/src/s9pk/merkle_archive/source/mod.rs index cc9623ab6..6550d1829 100644 --- a/core/startos/src/s9pk/merkle_archive/source/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/source/mod.rs @@ -310,6 +310,18 @@ pub struct Section { position: u64, size: u64, } +impl Section { + pub fn source(&self) -> &S { + &self.source + } + pub fn null(source: S) -> Self { + Self { + source, + position: 0, + size: 0, + } + } +} impl FileSource for Section { type Reader = S::FetchReader; type SliceReader = S::FetchReader; diff --git a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs index 658f3f923..6483a307f 100644 --- a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs +++ b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs @@ -39,7 +39,7 @@ pub struct MultiCursorFile { file: Arc>, } impl MultiCursorFile { - fn path(&self) -> Result { + pub fn path(&self) -> Result { path_from_fd(self.fd) } pub async fn open(fd: &impl AsRawFd) -> Result { diff --git a/core/startos/src/s9pk/v1/docker.rs b/core/startos/src/s9pk/v1/docker.rs index 96c532479..0088ea97d 100644 --- a/core/startos/src/s9pk/v1/docker.rs +++ b/core/startos/src/s9pk/v1/docker.rs @@ -1,6 +1,6 @@ use std::collections::BTreeSet; use std::io::SeekFrom; -use std::path::Path; +use std::path::{Path, PathBuf}; use color_eyre::eyre::eyre; use futures::{FutureExt, TryStreamExt}; @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt}; use tokio_tar::{Archive, Entry}; -use crate::util::io::from_cbor_async_reader; +use crate::util::io::{from_cbor_async_reader, from_json_async_reader}; use crate::{Error, ErrorKind}; #[derive(Default, Deserialize, Serialize)] @@ -26,7 +26,7 @@ pub enum DockerReader { } impl DockerReader { pub async fn list_arches(rdr: &mut R) -> Result, Error> { - if let Some(multiarch) = tokio_tar::Archive::new(rdr) + if let Some(multiarch) = tokio_tar::Archive::new(&mut *rdr) .entries()? .try_filter_map(|e| { async move { @@ -42,21 +42,14 @@ impl DockerReader { .await? { let multiarch: DockerMultiArch = from_cbor_async_reader(multiarch).await?; - Ok(multiarch.available) - } else { - Err(Error::new( - eyre!("Single arch legacy s9pks not supported"), - ErrorKind::ParseS9pk, - )) + return Ok(multiarch.available); } - } - pub async fn new(mut rdr: R, arch: &str) -> Result { - rdr.seek(SeekFrom::Start(0)).await?; - if let Some(image) = tokio_tar::Archive::new(rdr) + + let Some(manifest) = tokio_tar::Archive::new(&mut *rdr) .entries()? .try_filter_map(|e| { async move { - Ok(if &*e.path()? == Path::new(&format!("{}.tar", arch)) { + Ok(if &*e.path()? == Path::new("manifest.json") { Some(e) } else { None @@ -66,13 +59,89 @@ impl DockerReader { }) .try_next() .await? - { - Ok(Self::MultiArch(image)) - } else { - Err(Error::new( - eyre!("Docker image section does not contain tarball for architecture"), + else { + return Err(Error::new( + eyre!("Single arch legacy s9pk is malformed"), ErrorKind::ParseS9pk, - )) + )); + }; + + #[derive(Deserialize)] + #[serde(rename_all = "PascalCase")] + struct Manifest { + config: PathBuf, + } + let Manifest { config } = from_json_async_reader(manifest).await?; + rdr.seek(SeekFrom::Start(0)).await?; + let Some(config) = tokio_tar::Archive::new(rdr) + .entries()? + .try_filter_map(|e| { + let config = config.clone(); + async move { Ok(if &*e.path()? == config { Some(e) } else { None }) }.boxed() + }) + .try_next() + .await? + else { + return Err(Error::new( + eyre!("Single arch legacy s9pk is malformed"), + ErrorKind::ParseS9pk, + )); + }; + + #[derive(Deserialize)] + struct Config { + architecture: String, + } + let Config { architecture } = from_json_async_reader(config).await?; + + let mut arches = BTreeSet::new(); + arches.insert(architecture); + + Ok(arches) + } + pub async fn new(mut rdr: R, arch: &str) -> Result { + rdr.seek(SeekFrom::Start(0)).await?; + if tokio_tar::Archive::new(&mut rdr) + .entries()? + .try_filter_map(|e| { + async move { + Ok(if &*e.path()? == Path::new("multiarch.cbor") { + Some(e) + } else { + None + }) + } + .boxed() + }) + .try_next() + .await? + .is_some() + { + rdr.seek(SeekFrom::Start(0)).await?; + if let Some(image) = tokio_tar::Archive::new(rdr) + .entries()? + .try_filter_map(|e| { + async move { + Ok(if &*e.path()? == Path::new(&format!("{}.tar", arch)) { + Some(e) + } else { + None + }) + } + .boxed() + }) + .try_next() + .await? + { + Ok(Self::MultiArch(image)) + } else { + Err(Error::new( + eyre!("Docker image section does not contain tarball for architecture"), + ErrorKind::ParseS9pk, + )) + } + } else { + Ok(Self::SingleArch(rdr)) } } } diff --git a/core/startos/src/s9pk/v1/reader.rs b/core/startos/src/s9pk/v1/reader.rs index 05f351343..5748d4d1d 100644 --- a/core/startos/src/s9pk/v1/reader.rs +++ b/core/startos/src/s9pk/v1/reader.rs @@ -9,7 +9,6 @@ use std::task::{Context, Poll}; use color_eyre::eyre::eyre; use digest::Output; use ed25519_dalek::VerifyingKey; -use futures::TryStreamExt; use models::{ImageId, PackageId}; use sha2::{Digest, Sha512}; use tokio::fs::File; @@ -157,34 +156,6 @@ impl S9pkReader { } } impl S9pkReader { - #[instrument(skip_all)] - pub async fn image_tags(&mut self, arch: &str) -> Result, Error> { - let mut tar = tokio_tar::Archive::new(self.docker_images(arch).await?); - let mut entries = tar.entries()?; - while let Some(mut entry) = entries.try_next().await? { - if &*entry.path()? != Path::new("manifest.json") { - continue; - } - let mut buf = Vec::with_capacity(entry.header().size()? as usize); - entry.read_to_end(&mut buf).await?; - #[derive(serde::Deserialize)] - struct ManEntry { - #[serde(rename = "RepoTags")] - tags: Vec, - } - let man_entries = serde_json::from_slice::>(&buf) - .with_ctx(|_| (crate::ErrorKind::Deserialization, "manifest.json"))?; - return man_entries - .iter() - .flat_map(|e| &e.tags) - .map(|t| t.parse()) - .collect(); - } - Err(Error::new( - eyre!("image.tar missing manifest.json"), - crate::ErrorKind::ParseS9pk, - )) - } #[instrument(skip_all)] pub async fn from_reader(mut rdr: R, check_sig: bool) -> Result { let header = Header::deserialize(&mut rdr).await?; diff --git a/core/startos/src/s9pk/v2/compat.rs b/core/startos/src/s9pk/v2/compat.rs index 35cfabc01..568d8ed4f 100644 --- a/core/startos/src/s9pk/v2/compat.rs +++ b/core/startos/src/s9pk/v2/compat.rs @@ -68,17 +68,7 @@ impl S9pk> { )), )?; - // instructions.md - let instructions: Arc<[u8]> = reader.instructions().await?.to_vec().await?.into(); - archive.insert_path( - "instructions.md", - Entry::file(TmpSource::new( - tmp_dir.clone(), - PackSource::Buffered(instructions.into()), - )), - )?; - - // icon.md + // icon.* let icon: Arc<[u8]> = reader.icon().await?.to_vec().await?.into(); archive.insert_path( format!("icon.{}", manifest.assets.icon_type()), @@ -214,6 +204,7 @@ impl TryFrom for Manifest { support_site: value.support_site.unwrap_or_else(|| default_url.clone()), marketing_site: value.marketing_site.unwrap_or_else(|| default_url.clone()), donation_url: value.donation_url, + docs_url: None, description: value.description, images: BTreeMap::new(), volumes: value diff --git a/core/startos/src/s9pk/v2/manifest.rs b/core/startos/src/s9pk/v2/manifest.rs index fb1985526..420c5bf9d 100644 --- a/core/startos/src/s9pk/v2/manifest.rs +++ b/core/startos/src/s9pk/v2/manifest.rs @@ -51,6 +51,8 @@ pub struct Manifest { pub marketing_site: Url, #[ts(type = "string | null")] pub donation_url: Option, + #[ts(type = "string | null")] + pub docs_url: Option, pub description: Description, pub images: BTreeMap, pub volumes: BTreeSet, @@ -60,8 +62,6 @@ pub struct Manifest { pub dependencies: Dependencies, #[serde(default)] pub hardware_requirements: HardwareRequirements, - #[ts(optional)] - #[serde(default = "GitHash::load_sync")] pub git_hash: Option, #[serde(default = "current_version")] #[ts(type = "string")] @@ -83,7 +83,6 @@ impl Manifest { .map_or(false, |mime| mime.starts_with("image/")) })?; expected.check_file("LICENSE.md")?; - expected.check_file("instructions.md")?; expected.check_file("javascript.squashfs")?; for (dependency, _) in &self.dependencies.0 { let dep_path = Path::new("dependencies").join(dependency); diff --git a/core/startos/src/s9pk/v2/mod.rs b/core/startos/src/s9pk/v2/mod.rs index 852e7a21d..30a91de18 100644 --- a/core/startos/src/s9pk/v2/mod.rs +++ b/core/startos/src/s9pk/v2/mod.rs @@ -57,11 +57,10 @@ fn priority(s: &str) -> Option { "manifest.json" => Some(0), a if Path::new(a).file_stem() == Some(OsStr::new("icon")) => Some(1), "LICENSE.md" => Some(2), - "instructions.md" => Some(3), - "dependencies" => Some(4), - "javascript.squashfs" => Some(5), - "assets.squashfs" => Some(6), - "images" => Some(7), + "dependencies" => Some(3), + "javascript.squashfs" => Some(4), + "assets.squashfs" => Some(5), + "images" => Some(6), _ => None, } } diff --git a/core/startos/src/s9pk/v2/pack.rs b/core/startos/src/s9pk/v2/pack.rs index 4e1f271ba..fa9f46fc3 100644 --- a/core/startos/src/s9pk/v2/pack.rs +++ b/core/startos/src/s9pk/v2/pack.rs @@ -18,6 +18,7 @@ use crate::context::CliContext; use crate::dependencies::DependencyMetadata; use crate::prelude::*; use crate::rpc_continuations::Guid; +use crate::s9pk::git_hash::GitHash; use crate::s9pk::manifest::Manifest; use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::source::http::HttpSource; @@ -673,13 +674,6 @@ pub async fn pack(ctx: CliContext, params: PackParams) -> Result<(), Error> { PackSource::File(params.license().await?), )), ); - files.insert( - "instructions.md".into(), - Entry::file(TmpSource::new( - tmp_dir.clone(), - PackSource::File(params.instructions()), - )), - ); files.insert( "javascript.squashfs".into(), Entry::file(TmpSource::new( @@ -694,6 +688,8 @@ pub async fn pack(ctx: CliContext, params: PackParams) -> Result<(), Error> { ) .await?; + s9pk.as_manifest_mut().git_hash = Some(GitHash::from_path(params.path()).await?); + if !params.no_assets { let assets_dir = params.assets(); s9pk.as_archive_mut().contents_mut().insert_path( diff --git a/core/startos/src/service/effects/version.rs b/core/startos/src/service/effects/version.rs index 8737ce7bf..8595be3ea 100644 --- a/core/startos/src/service/effects/version.rs +++ b/core/startos/src/service/effects/version.rs @@ -1,4 +1,9 @@ +use std::path::Path; + use crate::service::effects::prelude::*; +use crate::util::io::{delete_file, maybe_read_file_to_string, write_file_atomic}; +use crate::volume::PKG_VOLUME_DIR; +use crate::DATA_DIR; #[derive(Debug, Clone, Serialize, Deserialize, TS, Parser)] #[serde(rename_all = "camelCase")] @@ -7,43 +12,35 @@ pub struct SetDataVersionParams { #[ts(type = "string")] version: Option, } +#[instrument(skip(context))] pub async fn set_data_version( context: EffectContext, SetDataVersionParams { version }: SetDataVersionParams, ) -> Result<(), Error> { let context = context.deref()?; let package_id = &context.seed.id; - context - .seed - .ctx - .db - .mutate(|db| { - db.as_public_mut() - .as_package_data_mut() - .as_idx_mut(package_id) - .or_not_found(package_id)? - .as_data_version_mut() - .ser(&version) - }) - .await - .result?; + let path = Path::new(DATA_DIR) + .join(PKG_VOLUME_DIR) + .join(package_id) + .join("data") + .join(".version"); + if let Some(version) = version { + write_file_atomic(path, version.as_bytes()).await?; + } else { + delete_file(path).await?; + } Ok(()) } +#[instrument(skip_all)] pub async fn get_data_version(context: EffectContext) -> Result, Error> { let context = context.deref()?; let package_id = &context.seed.id; - context - .seed - .ctx - .db - .peek() - .await - .as_public() - .as_package_data() - .as_idx(package_id) - .or_not_found(package_id)? - .as_data_version() - .de() + let path = Path::new(DATA_DIR) + .join(PKG_VOLUME_DIR) + .join(package_id) + .join("data") + .join(".version"); + maybe_read_file_to_string(path).await } diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 914559588..722fd5240 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -39,10 +39,8 @@ use crate::db::model::package::{ }; use crate::disk::mount::filesystem::ReadOnly; use crate::disk::mount::guard::{GenericMountGuard, MountGuard}; -use crate::install::PKG_ARCHIVE_DIR; use crate::lxc::ContainerId; use crate::prelude::*; -use crate::progress::{NamedProgress, Progress}; use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::s9pk::S9pk; use crate::service::action::update_tasks; @@ -50,7 +48,7 @@ use crate::service::rpc::{ExitParams, InitKind}; use crate::service::service_map::InstallProgressHandles; use crate::service::uninstall::cleanup; use crate::util::actor::concurrent::ConcurrentActor; -use crate::util::io::{create_file, AsyncReadStream, TermSize}; +use crate::util::io::{create_file, delete_file, AsyncReadStream, TermSize}; use crate::util::net::WebSocketExt; use crate::util::serde::Pem; use crate::util::Never; @@ -95,9 +93,10 @@ struct RootCommand(pub String); pub struct MiB(pub u64); impl MiB { - fn new(value: u64) -> Self { + pub fn new(value: u64) -> Self { Self(value / 1024 / 1024) } + #[allow(non_snake_case)] fn from_MiB(value: u64) -> Self { Self(value) } @@ -121,7 +120,12 @@ impl ServiceRef { pub fn weak(&self) -> Weak { Arc::downgrade(&self.0) } - pub async fn uninstall(self, uninit: ExitParams, soft: bool, force: bool) -> Result<(), Error> { + pub async fn uninstall( + self, + uninit: ExitParams, + soft: bool, + force: bool, + ) -> Result>, Error> { let id = self.seed.persistent_container.s9pk.as_manifest().id.clone(); let ctx = self.seed.ctx.clone(); let uninit_res = self.shutdown(Some(uninit.clone())).await; @@ -131,10 +135,26 @@ impl ServiceRef { uninit_res?; } - if uninit.is_uninstall() { - uninstall::cleanup(&ctx, &id, soft).await?; + let s9pk_path = ctx + .db + .peek() + .await + .into_public() + .into_package_data() + .into_idx(&id) + .map(|pde| pde.into_s9pk()); + + Ok(async move { + if let Some(s9pk_path) = s9pk_path { + delete_file(s9pk_path.de()?).await?; + } + + if uninit.is_uninstall() { + uninstall::cleanup(&ctx, &id, soft).await?; + } + Ok(()) } - Ok(()) + .boxed()) } pub async fn shutdown(self, uninit: Option) -> Result<(), Error> { if let Some((hdl, shutdown)) = self.seed.persistent_container.rpc_server.send_replace(None) @@ -276,8 +296,6 @@ impl Service { .map(Some) } }; - let s9pk_dir = Path::new(DATA_DIR).join(PKG_ARCHIVE_DIR).join("installed"); // TODO: make this based on hash - let s9pk_path = s9pk_dir.join(id).with_extension("s9pk"); let Some(entry) = ctx .db .peek() @@ -288,21 +306,28 @@ impl Service { else { return Ok(None); }; + let s9pk_path = entry.as_s9pk().de()?; match entry.as_state_info().as_match() { PackageStateMatchModelRef::Installing(_) => { if disposition == LoadDisposition::Retry { - if let Ok(s9pk) = S9pk::open(s9pk_path, Some(id)).await.map_err(|e| { + if let Ok(s9pk) = S9pk::open(&s9pk_path, Some(id)).await.map_err(|e| { tracing::error!("Error opening s9pk for install: {e}"); tracing::debug!("{e:?}") }) { - if let Ok(service) = - Self::install(ctx.clone(), s9pk, &None, None, None::, None) - .await - .map_err(|e| { - tracing::error!("Error installing service: {e}"); - tracing::debug!("{e:?}") - }) - { + if let Ok(service) = Self::install( + ctx.clone(), + s9pk, + &s9pk_path, + &None, + None, + None::, + None, + ) + .await + .map_err(|e| { + tracing::error!("Error installing service: {e}"); + tracing::debug!("{e:?}") + }) { return Ok(Some(service)); } } @@ -315,24 +340,18 @@ impl Service { Ok(None) } PackageStateMatchModelRef::Updating(s) => { + let new_s9pk = s.as_s9pk().de()?; if disposition == LoadDisposition::Retry - && s.as_installing_info() - .as_progress() - .de()? - .phases - .iter() - .any(|NamedProgress { name, progress }| { - name.eq_ignore_ascii_case("download") - && progress == &Progress::Complete(true) - }) + && tokio::fs::metadata(&new_s9pk).await.is_ok() { - if let Ok(s9pk) = S9pk::open(&s9pk_path, Some(id)).await.map_err(|e| { + if let Ok(s9pk) = S9pk::open(&new_s9pk, Some(id)).await.map_err(|e| { tracing::error!("Error opening s9pk for update: {e}"); tracing::debug!("{e:?}") }) { if let Ok(service) = Self::install( ctx.clone(), s9pk, + &s9pk_path, &None, Some(entry.as_status().de()?.run_state()), None::, @@ -411,9 +430,13 @@ impl Service { ) .await { - Ok(service) => match service - .uninstall(ExitParams::uninstall(), false, false) - .await + Ok(service) => match async { + service + .uninstall(ExitParams::uninstall(), false, false) + .await? + .await + } + .await { Err(e) => { tracing::error!("Error uninstalling service: {e}"); @@ -453,6 +476,7 @@ impl Service { pub async fn install( ctx: RpcContext, s9pk: S9pk, + s9pk_path: &PathBuf, registry: &Option, prev_state: Option, recovery_source: Option, @@ -552,6 +576,7 @@ impl Service { entry .as_state_info_mut() .ser(&PackageState::Installed(InstalledState { manifest }))?; + entry.as_s9pk_mut().ser(s9pk_path)?; entry.as_developer_key_mut().ser(&Pem::new(developer_key))?; entry.as_icon_mut().ser(&icon)?; entry.as_registry_mut().ser(registry)?; diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs index 588f8fcc1..c14aca6b4 100644 --- a/core/startos/src/service/service_map.rs +++ b/core/startos/src/service/service_map.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; use std::sync::Arc; use std::time::Duration; @@ -10,7 +10,7 @@ use futures::{Future, FutureExt, StreamExt, TryFutureExt}; use helpers::NonDetachingJoinHandle; use imbl::OrdMap; use models::ErrorData; -use tokio::sync::{oneshot, Mutex, OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock}; +use tokio::sync::{oneshot, OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock}; use tracing::instrument; use url::Url; @@ -22,9 +22,8 @@ use crate::disk::mount::guard::GenericMountGuard; use crate::install::PKG_ARCHIVE_DIR; use crate::notifications::{notify, NotificationLevel}; use crate::prelude::*; -use crate::progress::{ - FullProgressTracker, PhaseProgressTrackerHandle, ProgressTrackerWriter, ProgressUnits, -}; +use crate::progress::{FullProgressTracker, PhaseProgressTrackerHandle, ProgressTrackerWriter}; +use crate::registry::signer::commitment::merkle_archive::MerkleArchiveCommitment; use crate::s9pk::manifest::PackageId; use crate::s9pk::merkle_archive::source::FileSource; use crate::s9pk::S9pk; @@ -32,7 +31,8 @@ use crate::service::rpc::ExitParams; use crate::service::start_stop::StartStop; use crate::service::{LoadDisposition, Service, ServiceRef}; use crate::status::MainStatus; -use crate::util::serde::Pem; +use crate::util::serde::{Base32, Pem}; +use crate::util::sync::SyncMutex; use crate::DATA_DIR; pub type DownloadInstallFuture = BoxFuture<'static, Result>; @@ -43,37 +43,52 @@ pub struct InstallProgressHandles { pub progress: FullProgressTracker, } +fn s9pk_download_path(commitment: &MerkleArchiveCommitment) -> PathBuf { + Path::new(DATA_DIR) + .join(PKG_ARCHIVE_DIR) + .join("downloading") + .join(Base32(commitment.root_sighash.0).to_lower_string()) + .with_extension("s9pk") +} + +fn s9pk_installed_path(commitment: &MerkleArchiveCommitment) -> PathBuf { + Path::new(DATA_DIR) + .join(PKG_ARCHIVE_DIR) + .join("installed") + .join(Base32(commitment.root_sighash.0).to_lower_string()) + .with_extension("s9pk") +} + /// This is the structure to contain all the services #[derive(Default)] -pub struct ServiceMap(Mutex>>>>); +pub struct ServiceMap(SyncMutex>>>>); impl ServiceMap { - async fn entry(&self, id: &PackageId) -> Arc>> { - let mut lock = self.0.lock().await; - lock.entry(id.clone()) - .or_insert_with(|| Arc::new(RwLock::new(None))) - .clone() + fn entry(&self, id: &PackageId) -> Arc>> { + self.0.mutate(|lock| { + lock.entry(id.clone()) + .or_insert_with(|| Arc::new(RwLock::new(None))) + .clone() + }) + } + + #[instrument(skip_all)] + pub fn try_get(&self, id: &PackageId) -> Option>> { + self.entry(id).try_read_owned().ok() } #[instrument(skip_all)] pub async fn get(&self, id: &PackageId) -> OwnedRwLockReadGuard> { - self.entry(id).await.read_owned().await + self.entry(id).read_owned().await } #[instrument(skip_all)] pub async fn get_mut(&self, id: &PackageId) -> OwnedRwLockWriteGuard> { - self.entry(id).await.write_owned().await + self.entry(id).write_owned().await } #[instrument(skip_all)] - pub async fn init( - &self, - ctx: &RpcContext, - mut progress: PhaseProgressTrackerHandle, - ) -> Result<(), Error> { - progress.start(); + pub async fn init(&self, ctx: &RpcContext) -> Result<(), Error> { let ids = ctx.db.peek().await.as_public().as_package_data().keys()?; - progress.set_total(ids.len() as u64); - progress.set_units(Some(ProgressUnits::Steps)); let mut jobs = FuturesUnordered::new(); for id in &ids { jobs.push(self.load(ctx, id, LoadDisposition::Retry)); @@ -83,9 +98,7 @@ impl ServiceMap { tracing::error!("Error loading installed package as service: {e}"); tracing::debug!("{e:?}"); } - progress += 1; } - progress.complete(); Ok(()) } @@ -152,6 +165,13 @@ impl ServiceMap { validate_progress.start(); s9pk.validate_and_filter(ctx.s9pk_arch)?; validate_progress.complete(); + let commitment = s9pk.as_archive().commitment().await?; + let mut installed_path = s9pk_installed_path(&commitment); + while tokio::fs::metadata(&installed_path).await.is_ok() { + let prev = installed_path.file_stem().unwrap_or_default(); + installed_path.set_file_name(prev.to_string_lossy().into_owned() + "x.s9pk"); + // append an x if already exists to avoid reference counting when reinstalling same s9pk + } let manifest = s9pk.as_manifest().clone(); let id = manifest.id.clone(); let icon = s9pk.icon_data_url().await?; @@ -184,6 +204,7 @@ impl ServiceMap { .handle(async { ctx.db .mutate({ + let installed_path = installed_path.clone(); let manifest = manifest.clone(); let id = id.clone(); let install_progress = progress.snapshot(); @@ -196,6 +217,7 @@ impl ServiceMap { pde.as_state_info_mut().ser(&PackageState::Updating( UpdatingState { manifest: prev.manifest, + s9pk: installed_path, installing_info: InstallingInfo { new_manifest: manifest, progress: install_progress, @@ -217,7 +239,7 @@ impl ServiceMap { } else { PackageState::Installing(installing) }, - data_version: None, + s9pk: installed_path, status: MainStatus::Stopped, registry, developer_key: Pem::new(developer_key), @@ -241,13 +263,9 @@ impl ServiceMap { .await?; Ok(async move { - let (installed_path, sync_progress_task) = reload_guard + let sync_progress_task = reload_guard .handle(async { - let download_path = Path::new(DATA_DIR) - .join(PKG_ARCHIVE_DIR) - .join("downloading") - .join(&id) - .with_extension("s9pk"); + let download_path = s9pk_download_path(&commitment); let deref_id = id.clone(); let sync_progress_task = @@ -273,15 +291,9 @@ impl ServiceMap { file.sync_all().await?; unpack_progress.complete(); - let installed_path = Path::new(DATA_DIR) - .join(PKG_ARCHIVE_DIR) - .join("installed") - .join(&id) - .with_extension("s9pk"); - crate::util::io::rename(&download_path, &installed_path).await?; - Ok::<_, Error>((installed_path, sync_progress_task)) + Ok::<_, Error>(sync_progress_task) }) .await?; Ok(reload_guard @@ -325,17 +337,18 @@ impl ServiceMap { .state .borrow() .desired_state; - service.uninstall(uninit, false, false).await?; + let cleanup = service.uninstall(uninit, false, false).await?; progress.complete(); - Some(run_state) + Some((run_state, cleanup)) } else { None }; let new_service = Service::install( ctx, s9pk, + &installed_path, ®istry, - prev, + prev.as_ref().map(|(s, _)| *s), recovery_source, Some(InstallProgressHandles { finalization_progress, @@ -344,6 +357,11 @@ impl ServiceMap { ) .await?; *service = Some(new_service.into()); + + if let Some((_, cleanup)) = prev { + cleanup.await?; + } + drop(service); sync_progress_task.await.map_err(|_| { @@ -391,7 +409,7 @@ impl ServiceMap { .uninstall(ExitParams::uninstall(), soft, force) .await; drop(guard); - res + res?.await } else { if force { super::uninstall::cleanup(&ctx, &id, soft).await?; @@ -414,17 +432,18 @@ impl ServiceMap { } pub async fn shutdown_all(&self) -> Result<(), Error> { - let lock = self.0.lock().await; - let mut futs = Vec::with_capacity(lock.len()); - for service in lock.values().cloned() { - futs.push(async move { - if let Some(service) = service.write_owned().await.take() { - service.shutdown(None).await? - } - Ok::<_, Error>(()) - }); - } - drop(lock); + let futs = self.0.mutate(|lock| { + let mut futs = Vec::with_capacity(lock.len()); + for service in lock.values().cloned() { + futs.push(async move { + if let Some(service) = service.write_owned().await.take() { + service.shutdown(None).await? + } + Ok::<_, Error>(()) + }); + } + futs + }); let mut errors = ErrorCollection::new(); for res in futures::future::join_all(futs).await { errors.handle(res); diff --git a/core/startos/src/service/uninstall.rs b/core/startos/src/service/uninstall.rs index 9a8f14f5b..9a91e7b9e 100644 --- a/core/startos/src/service/uninstall.rs +++ b/core/startos/src/service/uninstall.rs @@ -57,13 +57,6 @@ pub async fn cleanup(ctx: &RpcContext, id: &PackageId, soft: bool) -> Result<(), if tokio::fs::metadata(&logs_dir).await.is_ok() { tokio::fs::remove_dir_all(&logs_dir).await?; } - let archive_path = Path::new(PACKAGE_DATA) - .join("archive") - .join("installed") - .join(&state.manifest.id); - if tokio::fs::metadata(&archive_path).await.is_ok() { - tokio::fs::remove_file(&archive_path).await?; - } } }, ) diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 2f3259615..466fea16f 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -82,6 +82,7 @@ pub async fn list_disks(ctx: SetupContext) -> Result, Error> { crate::disk::util::list(&ctx.os_partitions).await } +#[instrument(skip_all)] async fn setup_init( ctx: &SetupContext, password: Option, @@ -130,6 +131,7 @@ pub struct AttachParams { kiosk: Option, } +#[instrument(skip_all)] pub async fn attach( ctx: SetupContext, AttachParams { diff --git a/core/startos/src/util/actor/concurrent.rs b/core/startos/src/util/actor/concurrent.rs index 0e8cc0c2f..5a24970d4 100644 --- a/core/startos/src/util/actor/concurrent.rs +++ b/core/startos/src/util/actor/concurrent.rs @@ -302,7 +302,7 @@ mod test { async fn test_conflicts() { let actor = super::ConcurrentActor::new(CActor); let guid = Guid::new(); - actor.queue(guid.clone(), Pending); + let pending = actor.queue(guid.clone(), Pending); assert!( tokio::time::timeout(Duration::from_secs(1), actor.send(Guid::new(), Conflicts)) .await @@ -318,5 +318,8 @@ mod test { .await .is_ok() ); + assert!(tokio::time::timeout(Duration::from_secs(1), pending) + .await + .is_err()); } } diff --git a/core/startos/src/util/io.rs b/core/startos/src/util/io.rs index dc4c1eebd..565971bc7 100644 --- a/core/startos/src/util/io.rs +++ b/core/startos/src/util/io.rs @@ -15,7 +15,7 @@ use bytes::{Buf, BytesMut}; use clap::builder::ValueParserFactory; use futures::future::{BoxFuture, Fuse}; use futures::{AsyncSeek, FutureExt, Stream, TryStreamExt}; -use helpers::NonDetachingJoinHandle; +use helpers::{AtomicFile, NonDetachingJoinHandle}; use models::FromStrParser; use nix::unistd::{Gid, Uid}; use serde::{Deserialize, Serialize}; @@ -920,6 +920,7 @@ impl Drop for TmpDir { } } +#[instrument(skip_all)] pub async fn maybe_open_file(path: impl AsRef) -> Result, Error> { let path = path.as_ref(); match File::open(path).await { @@ -930,13 +931,32 @@ pub async fn maybe_open_file(path: impl AsRef) -> Result, Err .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("open {path:?}"))) } +#[instrument(skip_all)] pub async fn open_file(path: impl AsRef) -> Result { - let path = path.as_ref(); - File::open(path) - .await - .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("open {path:?}"))) + maybe_open_file(path.as_ref()) + .await? + .or_not_found(path.as_ref().display()) } +#[instrument(skip_all)] +pub async fn maybe_read_file_to_string(path: impl AsRef) -> Result, Error> { + let Some(mut file) = maybe_open_file(path).await? else { + return Ok(None); + }; + let meta = file.metadata().await?; + let mut res = String::with_capacity(meta.len() as usize); + file.read_to_string(&mut res).await?; + Ok(Some(res)) +} + +#[instrument(skip_all)] +pub async fn read_file_to_string(path: impl AsRef) -> Result { + maybe_read_file_to_string(path.as_ref()) + .await? + .or_not_found(path.as_ref().display()) +} + +#[instrument(skip_all)] pub async fn create_file(path: impl AsRef) -> Result { let path = path.as_ref(); if let Some(parent) = path.parent() { @@ -949,6 +969,7 @@ pub async fn create_file(path: impl AsRef) -> Result { .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("create {path:?}"))) } +#[instrument(skip_all)] pub async fn create_file_mod(path: impl AsRef, mode: u32) -> Result { let path = path.as_ref(); if let Some(parent) = path.parent() { @@ -966,6 +987,7 @@ pub async fn create_file_mod(path: impl AsRef, mode: u32) -> Result) -> Result { let path = path.as_ref(); if let Some(parent) = path.parent() { @@ -981,6 +1003,7 @@ pub async fn append_file(path: impl AsRef) -> Result { .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("create {path:?}"))) } +#[instrument(skip_all)] pub async fn delete_file(path: impl AsRef) -> Result<(), Error> { let path = path.as_ref(); tokio::fs::remove_file(path) @@ -995,6 +1018,7 @@ pub async fn delete_file(path: impl AsRef) -> Result<(), Error> { .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("delete {path:?}"))) } +#[instrument(skip_all)] pub async fn rename(src: impl AsRef, dst: impl AsRef) -> Result<(), Error> { let src = src.as_ref(); let dst = dst.as_ref(); @@ -1008,6 +1032,29 @@ pub async fn rename(src: impl AsRef, dst: impl AsRef) -> Result<(), .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("mv {src:?} -> {dst:?}"))) } +#[instrument(skip_all)] +pub async fn write_file_atomic( + path: impl AsRef, + contents: impl AsRef<[u8]>, +) -> Result<(), Error> { + let path = path.as_ref(); + if let Some(parent) = path.parent() { + tokio::fs::create_dir_all(parent) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("mkdir -p {parent:?}")))?; + } + let mut file = AtomicFile::new(path, None::<&Path>) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("create {path:?}")))?; + file.write_all(contents.as_ref()) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("write {path:?}")))?; + file.save() + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("save {path:?}")))?; + Ok(()) +} + fn poll_flush_prefix( mut writer: Pin<&mut W>, cx: &mut std::task::Context<'_>, diff --git a/core/startos/src/util/serde.rs b/core/startos/src/util/serde.rs index 7e5721884..b7b08529f 100644 --- a/core/startos/src/util/serde.rs +++ b/core/startos/src/util/serde.rs @@ -968,9 +968,31 @@ impl> std::fmt::Display for Base16 { #[derive(TS)] #[ts(type = "string", concrete(T = Vec))] pub struct Base32(pub T); +impl> Base32 { + pub fn to_lower_string(&self) -> String { + base32::encode( + base32::Alphabet::Rfc4648Lower { padding: false }, + self.0.as_ref(), + ) + } +} impl> std::fmt::Display for Base32 { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - base32::encode(base32::Alphabet::Rfc4648 { padding: true }, self.0.as_ref()).fmt(f) + base32::encode( + base32::Alphabet::Rfc4648 { padding: false }, + self.0.as_ref(), + ) + .fmt(f) + } +} +impl>> FromStr for Base32 { + type Err = color_eyre::eyre::Report; + fn from_str(s: &str) -> Result { + base32::decode(base32::Alphabet::Rfc4648 { padding: false }, &s) + .ok_or_else(|| eyre!("{s} is not a valid base32 string"))? + .try_into() + .map_err(|_| eyre!("base32 string is an invalid length")) + .map(Self) } } impl<'de, T: TryFrom>> Deserialize<'de> for Base32 { @@ -978,17 +1000,7 @@ impl<'de, T: TryFrom>> Deserialize<'de> for Base32 { where D: Deserializer<'de>, { - let s = String::deserialize(deserializer)?; - base32::decode(base32::Alphabet::Rfc4648 { padding: true }, &s) - .ok_or_else(|| { - serde::de::Error::invalid_value( - serde::de::Unexpected::Str(&s), - &"a valid base32 string", - ) - })? - .try_into() - .map_err(|_| serde::de::Error::custom("invalid length")) - .map(Self) + deserialize_from_str(deserializer) } } impl> Serialize for Base32 { @@ -1000,10 +1012,13 @@ impl> Serialize for Base32 { } } -pub const BASE64: base64::engine::GeneralPurpose = base64::engine::GeneralPurpose::new( - &base64::alphabet::STANDARD, - base64::engine::GeneralPurposeConfig::new(), -); +pub const BASE64: base64::engine::GeneralPurpose = + base64::engine::general_purpose::GeneralPurpose::new( + &base64::alphabet::STANDARD, + base64::engine::GeneralPurposeConfig::new() + .with_encode_padding(false) + .with_decode_padding_mode(base64::engine::DecodePaddingMode::Indifferent), + ); #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, TS)] #[ts(type = "string", concrete(T = Vec))] diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index f924ea59d..d134b35fc 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -5,7 +5,6 @@ use std::panic::{RefUnwindSafe, UnwindSafe}; use color_eyre::eyre::eyre; use futures::future::BoxFuture; use futures::{Future, FutureExt}; -use imbl::Vector; use imbl_value::{to_value, InternedString}; use patch_db::json_ptr::ROOT; @@ -48,8 +47,9 @@ mod v0_4_0_alpha_5; mod v0_4_0_alpha_6; mod v0_4_0_alpha_7; mod v0_4_0_alpha_8; +mod v0_4_0_alpha_9; -pub type Current = v0_4_0_alpha_8::Version; // VERSION_BUMP +pub type Current = v0_4_0_alpha_9::Version; // VERSION_BUMP impl Current { #[instrument(skip(self, db))] @@ -96,20 +96,19 @@ pub async fn post_init( .de()?; if !todos.is_empty() { progress.set_total(todos.len() as u64); - while let Some(version) = { + while let Some((version, input)) = { peek = ctx.db.peek().await; peek.as_public() .as_server_info() .as_post_init_migration_todos() .de()? - .first() - .cloned() - .map(Version::from_exver_version) - .as_ref() - .map(Version::as_version_t) + .pop_first() + .map(|(version, input)| { + Ok::<_, Error>((Version::from_exver_version(version).as_version_t()?, input)) + }) .transpose()? } { - version.0.post_up(ctx).await?; + version.0.post_up(ctx, input).await?; ctx.db .mutate(|db| { db.as_public_mut() @@ -161,7 +160,8 @@ enum Version { V0_4_0_alpha_5(Wrapper), V0_4_0_alpha_6(Wrapper), V0_4_0_alpha_7(Wrapper), - V0_4_0_alpha_8(Wrapper), // VERSION_BUMP + V0_4_0_alpha_8(Wrapper), + V0_4_0_alpha_9(Wrapper), // VERSION_BUMP Other(exver::Version), } @@ -212,7 +212,8 @@ impl Version { Self::V0_4_0_alpha_5(v) => DynVersion(Box::new(v.0)), Self::V0_4_0_alpha_6(v) => DynVersion(Box::new(v.0)), Self::V0_4_0_alpha_7(v) => DynVersion(Box::new(v.0)), - Self::V0_4_0_alpha_8(v) => DynVersion(Box::new(v.0)), // VERSION_BUMP + Self::V0_4_0_alpha_8(v) => DynVersion(Box::new(v.0)), + Self::V0_4_0_alpha_9(v) => DynVersion(Box::new(v.0)), // VERSION_BUMP Self::Other(v) => { return Err(Error::new( eyre!("unknown version {v}"), @@ -255,12 +256,14 @@ impl Version { Version::V0_4_0_alpha_5(Wrapper(x)) => x.semver(), Version::V0_4_0_alpha_6(Wrapper(x)) => x.semver(), Version::V0_4_0_alpha_7(Wrapper(x)) => x.semver(), - Version::V0_4_0_alpha_8(Wrapper(x)) => x.semver(), // VERSION_BUMP + Version::V0_4_0_alpha_8(Wrapper(x)) => x.semver(), + Version::V0_4_0_alpha_9(Wrapper(x)) => x.semver(), // VERSION_BUMP Version::Other(x) => x.clone(), } } } +#[instrument(skip_all)] fn version_accessor(db: &mut Value) -> Option<&mut Value> { if db.get("public").is_some() { db.get_mut("public")? @@ -271,6 +274,7 @@ fn version_accessor(db: &mut Value) -> Option<&mut Value> { } } +#[instrument(skip_all)] fn version_compat_accessor(db: &mut Value) -> Option<&mut Value> { if db.get("public").is_some() { let server_info = db.get_mut("public")?.get_mut("serverInfo")?; @@ -293,6 +297,7 @@ fn version_compat_accessor(db: &mut Value) -> Option<&mut Value> { } } +#[instrument(skip_all)] fn post_init_migration_todos_accessor(db: &mut Value) -> Option<&mut Value> { let server_info = if db.get("public").is_some() { db.get_mut("public")?.get_mut("serverInfo")? @@ -300,9 +305,10 @@ fn post_init_migration_todos_accessor(db: &mut Value) -> Option<&mut Value> { db.get_mut("server-info")? }; if server_info.get("postInitMigrationTodos").is_none() { - server_info - .as_object_mut()? - .insert("postInitMigrationTodos".into(), Value::Array(Vector::new())); + server_info.as_object_mut()?.insert( + "postInitMigrationTodos".into(), + Value::Object(Default::default()), + ); } server_info.get_mut("postInitMigrationTodos") } @@ -363,8 +369,8 @@ fn migrate_from_unchecked (), }; - to.up(db, pre_ups.value)?; - to.commit(db)?; + let res = to.up(db, pre_ups.value)?; + to.commit(db, res)?; Ok(()) } @@ -375,7 +381,7 @@ fn rollback_to_unchecked ) -> Result<(), Error> { let previous = from.previous(); from.down(db)?; - previous.commit(db)?; + previous.commit(db, Value::Null)?; if to.semver() < previous.semver() { rollback_to_unchecked(&previous, to, db)? } else if to.semver() > previous.semver() { @@ -399,15 +405,16 @@ where type PreUpRes: Send + UnwindSafe; fn semver(self) -> exver::Version; fn compat(self) -> &'static exver::VersionRange; - /// MUST NOT change system state. Intended for async I/O reads + /// MUST be idempotent, and is run before *all* db migrations fn pre_up(self) -> impl Future> + Send + 'static; - fn up(self, db: &mut Value, input: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, db: &mut Value, input: Self::PreUpRes) -> Result { + Ok(Value::Null) } /// MUST be idempotent, and is run after *all* db migrations fn post_up<'a>( self, ctx: &'a RpcContext, + input: Value, ) -> impl Future> + Send + 'a { async { Ok(()) } } @@ -417,20 +424,28 @@ where ErrorKind::InvalidRequest, )) } - fn commit(self, db: &mut Value) -> Result<(), Error> { - *version_accessor(db).or_not_found("`version` in db")? = to_value(&self.semver())?; - *version_compat_accessor(db).or_not_found("`versionCompat` in db")? = + #[instrument(skip_all)] + fn commit(self, db: &mut Value, res: Value) -> Result<(), Error> { + *version_accessor(db).or_not_found("`public.serverInfo.version` in db")? = + to_value(&self.semver())?; + *version_compat_accessor(db).or_not_found("`public.serverInfo.versionCompat` in db")? = to_value(self.compat())?; - post_init_migration_todos_accessor(db) - .or_not_found("`serverInfo` in db")? + if let Some(arr) = post_init_migration_todos_accessor(db) + .or_not_found("`public.serverInfo.postInitMigrationTodos` in db")? .as_array_mut() - .ok_or_else(|| { - Error::new( - eyre!("postInitMigrationTodos is not an array"), - ErrorKind::Database, - ) - })? - .push_back(to_value(&self.semver())?); + { + arr.push_back(to_value(&self.semver())?); + } else if let Some(obj) = post_init_migration_todos_accessor(db) + .or_not_found("`public.serverInfo.postInitMigrationTodos` in db")? + .as_object_mut() + { + obj.insert(InternedString::from_display(&self.semver()), res); + } else { + return Err(Error::new( + eyre!("postInitMigrationTodos is not an array or object"), + ErrorKind::Database, + )); + } Ok(()) } } @@ -443,10 +458,10 @@ trait DynVersionT: RefUnwindSafe + Send + Sync { fn semver(&self) -> exver::Version; fn compat(&self) -> &'static exver::VersionRange; fn pre_up(&self) -> BoxFuture<'static, Result, Error>>; - fn up(&self, db: &mut Value, input: Box) -> Result<(), Error>; - fn post_up<'a>(&self, ctx: &'a RpcContext) -> BoxFuture<'a, Result<(), Error>>; + fn up(&self, db: &mut Value, input: Box) -> Result; + fn post_up<'a>(&self, ctx: &'a RpcContext, input: Value) -> BoxFuture<'a, Result<(), Error>>; fn down(&self, db: &mut Value) -> Result<(), Error>; - fn commit(&self, db: &mut Value) -> Result<(), Error>; + fn commit(&self, db: &mut Value, res: Value) -> Result<(), Error>; } impl DynVersionT for T where @@ -466,7 +481,7 @@ where async move { Ok(Box::new(VersionT::pre_up(v).await?) as Box) } .boxed() } - fn up(&self, db: &mut Value, input: Box) -> Result<(), Error> { + fn up(&self, db: &mut Value, input: Box) -> Result { VersionT::up( *self, db, @@ -478,14 +493,14 @@ where })?, ) } - fn post_up<'a>(&self, ctx: &'a RpcContext) -> BoxFuture<'a, Result<(), Error>> { - VersionT::post_up(*self, ctx).boxed() + fn post_up<'a>(&self, ctx: &'a RpcContext, input: Value) -> BoxFuture<'a, Result<(), Error>> { + VersionT::post_up(*self, ctx, input).boxed() } fn down(&self, db: &mut Value) -> Result<(), Error> { VersionT::down(*self, db) } - fn commit(&self, db: &mut Value) -> Result<(), Error> { - VersionT::commit(*self, db) + fn commit(&self, db: &mut Value, res: Value) -> Result<(), Error> { + VersionT::commit(*self, db, res) } } impl DynVersionT for DynVersion { @@ -501,17 +516,17 @@ impl DynVersionT for DynVersion { fn pre_up(&self) -> BoxFuture<'static, Result, Error>> { self.0.pre_up() } - fn up(&self, db: &mut Value, input: Box) -> Result<(), Error> { + fn up(&self, db: &mut Value, input: Box) -> Result { self.0.up(db, input) } - fn post_up<'a>(&self, ctx: &'a RpcContext) -> BoxFuture<'a, Result<(), Error>> { - self.0.post_up(ctx) + fn post_up<'a>(&self, ctx: &'a RpcContext, input: Value) -> BoxFuture<'a, Result<(), Error>> { + self.0.post_up(ctx, input) } fn down(&self, db: &mut Value) -> Result<(), Error> { self.0.down(db) } - fn commit(&self, db: &mut Value) -> Result<(), Error> { - self.0.commit(db) + fn commit(&self, db: &mut Value, res: Value) -> Result<(), Error> { + self.0.commit(db, res) } } diff --git a/core/startos/src/version/v0_3_5.rs b/core/startos/src/version/v0_3_5.rs index 0217b6738..eec6d0162 100644 --- a/core/startos/src/version/v0_3_5.rs +++ b/core/startos/src/version/v0_3_5.rs @@ -40,8 +40,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_5_1.rs b/core/startos/src/version/v0_3_5_1.rs index 5334cc2a4..808eae3bc 100644 --- a/core/startos/src/version/v0_3_5_1.rs +++ b/core/startos/src/version/v0_3_5_1.rs @@ -24,8 +24,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_5_2.rs b/core/startos/src/version/v0_3_5_2.rs index 780731d09..9bbe38f1c 100644 --- a/core/startos/src/version/v0_3_5_2.rs +++ b/core/startos/src/version/v0_3_5_2.rs @@ -24,8 +24,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_0.rs b/core/startos/src/version/v0_3_6_alpha_0.rs index 3954e80db..80390432f 100644 --- a/core/startos/src/version/v0_3_6_alpha_0.rs +++ b/core/startos/src/version/v0_3_6_alpha_0.rs @@ -1,4 +1,5 @@ use std::collections::BTreeMap; +use std::ffi::OsStr; use std::path::Path; use chrono::{DateTime, Utc}; @@ -6,6 +7,7 @@ use const_format::formatcp; use ed25519_dalek::SigningKey; use exver::{PreReleaseSegment, VersionRange}; use imbl_value::{json, InternedString}; +use models::{PackageId, ReplayId}; use openssl::pkey::PKey; use openssl::x509::X509; use sqlx::postgres::PgConnectOptions; @@ -178,8 +180,26 @@ async fn init_postgres(datadir: impl AsRef) -> Result { .await?; } - let secret_store = - PgPool::connect_with(PgConnectOptions::new().database("secrets").username("root")).await?; + let secret_store = if let Ok(s) = PgPool::connect_with( + PgConnectOptions::new() + .database("secrets") + .username("root") + .port(5432) + .socket("/var/run/postgresql"), + ) + .await + { + s + } else { + PgPool::connect_with( + PgConnectOptions::new() + .database("secrets") + .username("root") + .port(5433) + .socket("/var/run/postgresql"), + ) + .await? + }; sqlx::migrate!() .run(&secret_store) .await @@ -209,7 +229,9 @@ impl VersionT for Version { Ok((account, ssh_keys, cifs)) } - fn up(self, db: &mut Value, (account, ssh_keys, cifs): Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, (account, ssh_keys, cifs): Self::PreUpRes) -> Result { + let prev_package_data = db["package-data"].clone(); + let wifi = json!({ "interface": db["server-info"]["wifi"]["interface"], "ssids": db["server-info"]["wifi"]["ssids"], @@ -236,7 +258,7 @@ impl VersionT for Version { "lanAddress": db["server-info"]["lan-address"], }); - server_info["postInitMigrationTodos"] = json!([]); + server_info["postInitMigrationTodos"] = json!({}); let tor_address: String = from_value(db["server-info"]["tor-address"].clone())?; // Maybe we do this like the Public::init does server_info["torAddress"] = json!(tor_address); @@ -287,7 +309,8 @@ impl VersionT for Version { }); *db = next; - Ok(()) + + Ok(prev_package_data) } fn down(self, _db: &mut Value) -> Result<(), Error> { Err(Error::new( @@ -298,7 +321,7 @@ impl VersionT for Version { #[instrument(skip(self, ctx))] /// MUST be idempotent, and is run after *all* db migrations - async fn post_up(self, ctx: &RpcContext) -> Result<(), Error> { + async fn post_up(self, ctx: &RpcContext, input: Value) -> Result<(), Error> { let path = Path::new(formatcp!("{PACKAGE_DATA}/archive/")); if !path.is_dir() { return Err(Error::new( @@ -312,6 +335,9 @@ impl VersionT for Version { // Should be the name of the package let mut paths = tokio::fs::read_dir(path).await?; while let Some(path) = paths.next_entry().await? { + let Ok(id) = path.file_name().to_string_lossy().parse::() else { + continue; + }; let path = path.path(); if !path.is_dir() { continue; @@ -328,25 +354,62 @@ impl VersionT for Version { let mut paths = tokio::fs::read_dir(path).await?; while let Some(path) = paths.next_entry().await? { let path = path.path(); - if path.is_dir() { + if path.extension() != Some(OsStr::new("s9pk")) { continue; } - let package_s9pk = tokio::fs::File::open(path).await?; - let file = MultiCursorFile::open(&package_s9pk).await?; + let configured = if !input.is_null() { + let Some(configured) = input + .get(&*id) + .and_then(|pde| pde.get("installed")) + .and_then(|i| i.get("status")) + .and_then(|s| s.get("configured")) + .and_then(|c| c.as_bool()) + else { + continue; + }; + configured + } else { + false + }; - let key = ctx.db.peek().await.into_private().into_compat_s9pk_key(); - ctx.services - .install( - ctx.clone(), - || crate::s9pk::load(file.clone(), || Ok(key.de()?.0), None), - None, - None::, - None, - ) - .await? - .await? - .await?; + if let Err(e) = async { + let package_s9pk = tokio::fs::File::open(path).await?; + let file = MultiCursorFile::open(&package_s9pk).await?; + + let key = ctx.db.peek().await.into_private().into_compat_s9pk_key(); + ctx.services + .install( + ctx.clone(), + || crate::s9pk::load(file.clone(), || Ok(key.de()?.0), None), + None, + None::, + None, + ) + .await? + .await? + .await?; + + if configured { + ctx.db + .mutate(|db| { + db.as_public_mut() + .as_package_data_mut() + .as_idx_mut(&id) + .or_not_found(&id)? + .as_tasks_mut() + .remove(&ReplayId::from("needs-config")) + }) + .await + .result?; + } + Ok::<_, Error>(()) + } + .await + { + tracing::error!("Error reinstalling {id}: {e}"); + tracing::debug!("{e:?}"); + } } } } diff --git a/core/startos/src/version/v0_3_6_alpha_1.rs b/core/startos/src/version/v0_3_6_alpha_1.rs index 682486439..2cec81140 100644 --- a/core/startos/src/version/v0_3_6_alpha_1.rs +++ b/core/startos/src/version/v0_3_6_alpha_1.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_10.rs b/core/startos/src/version/v0_3_6_alpha_10.rs index d81fc91ca..6b7f1d73e 100644 --- a/core/startos/src/version/v0_3_6_alpha_10.rs +++ b/core/startos/src/version/v0_3_6_alpha_10.rs @@ -41,7 +41,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { for (_, package) in db["public"]["packageData"] .as_object_mut() .ok_or_else(|| { @@ -86,7 +86,7 @@ impl VersionT for Version { } } - Ok(()) + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_11.rs b/core/startos/src/version/v0_3_6_alpha_11.rs index 8a6dedd6e..0d99cb5be 100644 --- a/core/startos/src/version/v0_3_6_alpha_11.rs +++ b/core/startos/src/version/v0_3_6_alpha_11.rs @@ -28,7 +28,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let acme = std::mem::replace( &mut db["public"]["serverInfo"]["acme"], Value::Object(Default::default()), @@ -75,7 +75,7 @@ impl VersionT for Version { } } - Ok(()) + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_12.rs b/core/startos/src/version/v0_3_6_alpha_12.rs index 3508a27ac..cf86500d1 100644 --- a/core/startos/src/version/v0_3_6_alpha_12.rs +++ b/core/startos/src/version/v0_3_6_alpha_12.rs @@ -30,7 +30,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let bindings: BTreeMap = [( 80, json!({ @@ -60,7 +60,7 @@ impl VersionT for Version { "hostnameInfo": {}, }); - Ok(()) + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_13.rs b/core/startos/src/version/v0_3_6_alpha_13.rs index a5ecc5aad..965b9c04d 100644 --- a/core/startos/src/version/v0_3_6_alpha_13.rs +++ b/core/startos/src/version/v0_3_6_alpha_13.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_14.rs b/core/startos/src/version/v0_3_6_alpha_14.rs index 69422051f..4370239e6 100644 --- a/core/startos/src/version/v0_3_6_alpha_14.rs +++ b/core/startos/src/version/v0_3_6_alpha_14.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_15.rs b/core/startos/src/version/v0_3_6_alpha_15.rs index 7c7425b60..f7e050cce 100644 --- a/core/startos/src/version/v0_3_6_alpha_15.rs +++ b/core/startos/src/version/v0_3_6_alpha_15.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_16.rs b/core/startos/src/version/v0_3_6_alpha_16.rs index 84017de7e..177fd01d2 100644 --- a/core/startos/src/version/v0_3_6_alpha_16.rs +++ b/core/startos/src/version/v0_3_6_alpha_16.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_17.rs b/core/startos/src/version/v0_3_6_alpha_17.rs index 2d58bab5a..92207b9e7 100644 --- a/core/startos/src/version/v0_3_6_alpha_17.rs +++ b/core/startos/src/version/v0_3_6_alpha_17.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_18.rs b/core/startos/src/version/v0_3_6_alpha_18.rs index 2d2c7ad32..b5d27eef7 100644 --- a/core/startos/src/version/v0_3_6_alpha_18.rs +++ b/core/startos/src/version/v0_3_6_alpha_18.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_2.rs b/core/startos/src/version/v0_3_6_alpha_2.rs index cddcc44b2..7787f7e89 100644 --- a/core/startos/src/version/v0_3_6_alpha_2.rs +++ b/core/startos/src/version/v0_3_6_alpha_2.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_3.rs b/core/startos/src/version/v0_3_6_alpha_3.rs index 90164ad60..b2284c909 100644 --- a/core/startos/src/version/v0_3_6_alpha_3.rs +++ b/core/startos/src/version/v0_3_6_alpha_3.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_4.rs b/core/startos/src/version/v0_3_6_alpha_4.rs index 08ff7595e..3890a25a3 100644 --- a/core/startos/src/version/v0_3_6_alpha_4.rs +++ b/core/startos/src/version/v0_3_6_alpha_4.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_5.rs b/core/startos/src/version/v0_3_6_alpha_5.rs index 649fe90ca..b565abdca 100644 --- a/core/startos/src/version/v0_3_6_alpha_5.rs +++ b/core/startos/src/version/v0_3_6_alpha_5.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_6.rs b/core/startos/src/version/v0_3_6_alpha_6.rs index c62bfdec4..0a95a19a5 100644 --- a/core/startos/src/version/v0_3_6_alpha_6.rs +++ b/core/startos/src/version/v0_3_6_alpha_6.rs @@ -26,8 +26,8 @@ impl VersionT for Version { async fn pre_up(self) -> Result { Ok(()) } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_3_6_alpha_7.rs b/core/startos/src/version/v0_3_6_alpha_7.rs index baf7aaa35..2f19dbb15 100644 --- a/core/startos/src/version/v0_3_6_alpha_7.rs +++ b/core/startos/src/version/v0_3_6_alpha_7.rs @@ -4,6 +4,7 @@ use tokio::process::Command; use super::v0_3_5::V0_3_0_COMPAT; use super::{v0_3_6_alpha_6, VersionT}; +use crate::context::RpcContext; use crate::prelude::*; use crate::util::Invoke; @@ -30,7 +31,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let server_info = db["public"]["serverInfo"] .as_object_mut() .or_not_found("public.serverInfo")?; @@ -44,9 +45,9 @@ impl VersionT for Version { manifest["hardwareRequirements"]["device"] = json!([]); } } - Ok(()) + Ok(Value::Null) } - async fn post_up(self, ctx: &crate::context::RpcContext) -> Result<(), Error> { + async fn post_up(self, ctx: &RpcContext, _input: Value) -> Result<(), Error> { Command::new("systemd-firstboot") .arg("--root=/media/startos/config/overlay/") .arg(format!( diff --git a/core/startos/src/version/v0_3_6_alpha_8.rs b/core/startos/src/version/v0_3_6_alpha_8.rs index 99920c767..b76cb6d6a 100644 --- a/core/startos/src/version/v0_3_6_alpha_8.rs +++ b/core/startos/src/version/v0_3_6_alpha_8.rs @@ -5,6 +5,7 @@ use tokio::fs::File; use super::v0_3_5::V0_3_0_COMPAT; use super::{v0_3_6_alpha_7, VersionT}; +use crate::context::RpcContext; use crate::install::PKG_ARCHIVE_DIR; use crate::prelude::*; use crate::s9pk::manifest::{DeviceFilter, Manifest}; @@ -39,10 +40,10 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } - async fn post_up(self, ctx: &crate::context::RpcContext) -> Result<(), Error> { + async fn post_up(self, ctx: &RpcContext, _input: Value) -> Result<(), Error> { let s9pk_dir = Path::new(DATA_DIR).join(PKG_ARCHIVE_DIR).join("installed"); if tokio::fs::metadata(&s9pk_dir).await.is_ok() { diff --git a/core/startos/src/version/v0_3_6_alpha_9.rs b/core/startos/src/version/v0_3_6_alpha_9.rs index e01ad298e..4ccecd43c 100644 --- a/core/startos/src/version/v0_3_6_alpha_9.rs +++ b/core/startos/src/version/v0_3_6_alpha_9.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_0.rs b/core/startos/src/version/v0_4_0_alpha_0.rs index 4b5120bf6..d095fbd65 100644 --- a/core/startos/src/version/v0_4_0_alpha_0.rs +++ b/core/startos/src/version/v0_4_0_alpha_0.rs @@ -3,6 +3,7 @@ use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; use super::{v0_3_6_alpha_18, VersionT}; +use crate::context::RpcContext; use crate::notifications::{notify, NotificationLevel}; use crate::prelude::*; @@ -29,7 +30,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let host = db["public"]["serverInfo"]["host"].clone(); let mut wifi = db["public"]["serverInfo"]["wifi"].clone(); wifi["enabled"] = Value::Bool(!wifi["selected"].is_null()); @@ -51,9 +52,9 @@ impl VersionT for Version { "networkInterfaces": network_interfaces, "acme": acme, }); - Ok(()) + Ok(Value::Null) } - async fn post_up<'a>(self, ctx: &'a crate::context::RpcContext) -> Result<(), Error> { + async fn post_up(self, ctx: &RpcContext, _input: Value) -> Result<(), Error> { let message_update = include_str!("update_details/v0_4_0.md").to_string(); ctx.db diff --git a/core/startos/src/version/v0_4_0_alpha_1.rs b/core/startos/src/version/v0_4_0_alpha_1.rs index f44a5ef51..3e17db8ac 100644 --- a/core/startos/src/version/v0_4_0_alpha_1.rs +++ b/core/startos/src/version/v0_4_0_alpha_1.rs @@ -28,7 +28,7 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let Some(ui) = db["public"]["ui"].as_object_mut() else { return Err(Error::new( eyre!("db.public.ui is not an object"), @@ -64,7 +64,7 @@ impl VersionT for Version { ui.remove("gaming"); ui.remove("theme"); - Ok(()) + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_2.rs b/core/startos/src/version/v0_4_0_alpha_2.rs index 174a564ef..541cc2b20 100644 --- a/core/startos/src/version/v0_4_0_alpha_2.rs +++ b/core/startos/src/version/v0_4_0_alpha_2.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_3.rs b/core/startos/src/version/v0_4_0_alpha_3.rs index 32eb4437e..b5aaa188c 100644 --- a/core/startos/src/version/v0_4_0_alpha_3.rs +++ b/core/startos/src/version/v0_4_0_alpha_3.rs @@ -27,8 +27,8 @@ impl VersionT for Version { fn compat(self) -> &'static VersionRange { &V0_3_0_COMPAT } - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_4.rs b/core/startos/src/version/v0_4_0_alpha_4.rs index 9b8a85c2d..420e1a596 100644 --- a/core/startos/src/version/v0_4_0_alpha_4.rs +++ b/core/startos/src/version/v0_4_0_alpha_4.rs @@ -30,7 +30,7 @@ impl VersionT for Version { &V0_3_0_COMPAT } #[instrument] - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { db["public"]["serverInfo"] .as_object_mut() .or_not_found("public.serverInfo")? @@ -63,9 +63,9 @@ impl VersionT for Version { } pde.insert("tasks".into(), Value::Object(tasks)); } - Ok(()) + Ok(Value::Null) } - async fn post_up(self, _ctx: &RpcContext) -> Result<(), Error> { + async fn post_up(self, _ctx: &RpcContext, _input: Value) -> Result<(), Error> { use tokio::io::AsyncWriteExt; if tokio::fs::metadata("/media/startos/config/overlay/etc/shadow") diff --git a/core/startos/src/version/v0_4_0_alpha_5.rs b/core/startos/src/version/v0_4_0_alpha_5.rs index 0b3d74107..de7a49c58 100644 --- a/core/startos/src/version/v0_4_0_alpha_5.rs +++ b/core/startos/src/version/v0_4_0_alpha_5.rs @@ -28,8 +28,8 @@ impl VersionT for Version { &V0_3_0_COMPAT } #[instrument] - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_6.rs b/core/startos/src/version/v0_4_0_alpha_6.rs index 0f23f4177..ce208e6f4 100644 --- a/core/startos/src/version/v0_4_0_alpha_6.rs +++ b/core/startos/src/version/v0_4_0_alpha_6.rs @@ -28,7 +28,7 @@ impl VersionT for Version { &V0_3_0_COMPAT } #[instrument] - fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { let ui = db["public"]["ui"] .as_object_mut() .or_not_found("public.ui")?; @@ -38,7 +38,7 @@ impl VersionT for Version { } } ui.remove("ackWelcome"); - Ok(()) + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_7.rs b/core/startos/src/version/v0_4_0_alpha_7.rs index fdadced3d..851073362 100644 --- a/core/startos/src/version/v0_4_0_alpha_7.rs +++ b/core/startos/src/version/v0_4_0_alpha_7.rs @@ -28,8 +28,8 @@ impl VersionT for Version { &V0_3_0_COMPAT } #[instrument] - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_8.rs b/core/startos/src/version/v0_4_0_alpha_8.rs index bbcab6049..d03dc357d 100644 --- a/core/startos/src/version/v0_4_0_alpha_8.rs +++ b/core/startos/src/version/v0_4_0_alpha_8.rs @@ -28,8 +28,8 @@ impl VersionT for Version { &V0_3_0_COMPAT } #[instrument] - fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result<(), Error> { - Ok(()) + fn up(self, _db: &mut Value, _: Self::PreUpRes) -> Result { + Ok(Value::Null) } fn down(self, _db: &mut Value) -> Result<(), Error> { Ok(()) diff --git a/core/startos/src/version/v0_4_0_alpha_9.rs b/core/startos/src/version/v0_4_0_alpha_9.rs new file mode 100644 index 000000000..6a3499d28 --- /dev/null +++ b/core/startos/src/version/v0_4_0_alpha_9.rs @@ -0,0 +1,112 @@ +use std::collections::BTreeMap; +use std::path::Path; +use std::sync::Arc; + +use exver::{PreReleaseSegment, VersionRange}; +use imbl_value::{InOMap, InternedString}; +use models::PackageId; + +use super::v0_3_5::V0_3_0_COMPAT; +use super::{v0_4_0_alpha_8, VersionT}; +use crate::context::RpcContext; +use crate::install::PKG_ARCHIVE_DIR; +use crate::prelude::*; +use crate::util::io::write_file_atomic; +use crate::volume::PKG_VOLUME_DIR; +use crate::DATA_DIR; + +lazy_static::lazy_static! { + static ref V0_4_0_alpha_9: exver::Version = exver::Version::new( + [0, 4, 0], + [PreReleaseSegment::String("alpha".into()), 9.into()] + ); +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct Version; + +impl VersionT for Version { + type Previous = v0_4_0_alpha_8::Version; + type PreUpRes = (); + + async fn pre_up(self) -> Result { + Ok(()) + } + fn semver(self) -> exver::Version { + V0_4_0_alpha_9.clone() + } + fn compat(self) -> &'static VersionRange { + &V0_3_0_COMPAT + } + #[instrument] + fn up(self, db: &mut Value, _: Self::PreUpRes) -> Result { + let mut res = InOMap::new(); + let todos = db + .get_mut("public") + .and_then(|p| p.get_mut("serverInfo")) + .and_then(|si| si.get_mut("postInitMigrationTodos")) + .or_not_found("`public.serverInfo.postInitMigrationTodos` in db")?; + if let Some(prev) = todos.as_array().cloned() { + *todos = Value::Object( + prev.iter() + .filter_map(|version| version.as_str()) + .map(InternedString::intern) + .map(|v| (v, Value::Null)) + .collect(), + ); + } + for (id, pde) in db + .get_mut("public") + .and_then(|si| si.get_mut("packageData")) + .and_then(|pd| pd.as_object_mut()) + .into_iter() + .flat_map(|m| m.iter_mut()) + { + let Some(pde) = pde.as_object_mut() else { + continue; + }; + res.insert(id.clone(), pde.remove("dataVersion").unwrap_or_default()); + pde.insert( + "s9pk".into(), + Value::String(Arc::new( + Path::new(DATA_DIR) + .join(PKG_ARCHIVE_DIR) + .join("installed") + .join(id) + .with_extension("s9pk") + .into_os_string() + .into_string() + .map_or_else(|o| o.to_string_lossy().into_owned(), |a| a), + )), + ); + } + + db.get_mut("public") + .and_then(|p| p.get_mut("ui")) + .and_then(|u| u.as_object_mut()) + .or_not_found("`public.ui` in db")? + .remove("ackInstructions"); + + Ok(Value::Object(res)) + } + async fn post_up(self, _ctx: &RpcContext, input: Value) -> Result<(), Error> { + for (id, data_version) in from_value::>>(input)? { + if let Some(data_version) = data_version { + write_file_atomic( + Path::new(DATA_DIR) + .join(PKG_VOLUME_DIR) + .join(&id) + .join("data") + .join(".version"), + data_version.as_bytes(), + ) + .await?; + } + } + + Ok(()) + } + fn down(self, _db: &mut Value) -> Result<(), Error> { + Ok(()) + } +} diff --git a/patch-db b/patch-db index f2f7c3141..f43ee1958 160000 --- a/patch-db +++ b/patch-db @@ -1 +1 @@ -Subproject commit f2f7c3141b5a76b28eb4dd88f12d1a12c7569000 +Subproject commit f43ee195877364fb8aa34bb769515855ab995933 diff --git a/sdk/base/lib/osBindings/Manifest.ts b/sdk/base/lib/osBindings/Manifest.ts index 5a489465b..8e44e2056 100644 --- a/sdk/base/lib/osBindings/Manifest.ts +++ b/sdk/base/lib/osBindings/Manifest.ts @@ -24,13 +24,14 @@ export type Manifest = { supportSite: string marketingSite: string donationUrl: string | null + docsUrl: string | null description: Description images: { [key: ImageId]: ImageConfig } volumes: Array alerts: Alerts dependencies: Dependencies hardwareRequirements: HardwareRequirements - gitHash?: GitHash + gitHash: GitHash | null osVersion: string sdkVersion: string | null } diff --git a/sdk/base/lib/osBindings/PackageDataEntry.ts b/sdk/base/lib/osBindings/PackageDataEntry.ts index 7c855f28a..52e55dd75 100644 --- a/sdk/base/lib/osBindings/PackageDataEntry.ts +++ b/sdk/base/lib/osBindings/PackageDataEntry.ts @@ -12,7 +12,7 @@ import type { TaskEntry } from "./TaskEntry" export type PackageDataEntry = { stateInfo: PackageState - dataVersion: string | null + s9pk: string status: MainStatus registry: string | null developerKey: string diff --git a/sdk/base/lib/osBindings/PackageVersionInfo.ts b/sdk/base/lib/osBindings/PackageVersionInfo.ts index a52b5feaa..f131dedae 100644 --- a/sdk/base/lib/osBindings/PackageVersionInfo.ts +++ b/sdk/base/lib/osBindings/PackageVersionInfo.ts @@ -21,9 +21,11 @@ export type PackageVersionInfo = { supportSite: string marketingSite: string donationUrl: string | null + docsUrl: string | null alerts: Alerts dependencyMetadata: { [key: PackageId]: DependencyMetadata } osVersion: string + sdkVersion: string | null hardwareRequirements: HardwareRequirements sourceVersion: string | null s9pk: RegistryAsset diff --git a/sdk/base/lib/osBindings/ServerInfo.ts b/sdk/base/lib/osBindings/ServerInfo.ts index 99e184308..7fc8718ff 100644 --- a/sdk/base/lib/osBindings/ServerInfo.ts +++ b/sdk/base/lib/osBindings/ServerInfo.ts @@ -12,7 +12,7 @@ export type ServerInfo = { hostname: string version: string packageVersionCompat: string - postInitMigrationTodos: string[] + postInitMigrationTodos: Record lastBackup: string | null network: NetworkInfo statusInfo: ServerStatus diff --git a/sdk/base/lib/osBindings/UpdatingState.ts b/sdk/base/lib/osBindings/UpdatingState.ts index 117124f91..4e43c9443 100644 --- a/sdk/base/lib/osBindings/UpdatingState.ts +++ b/sdk/base/lib/osBindings/UpdatingState.ts @@ -4,5 +4,6 @@ import type { Manifest } from "./Manifest" export type UpdatingState = { manifest: Manifest + s9pk: string installingInfo: InstallingInfo } diff --git a/sdk/base/lib/s9pk/index.ts b/sdk/base/lib/s9pk/index.ts index dfc907438..8d6a2c6ed 100644 --- a/sdk/base/lib/s9pk/index.ts +++ b/sdk/base/lib/s9pk/index.ts @@ -117,17 +117,10 @@ export class S9pk { ) } - async instructions(): Promise { - const file = this.archive.contents.getPath(["instructions.md"]) - if (!file || !(file.contents instanceof FileContents)) - throw new Error("instructions.md not found in archive") - return new TextDecoder().decode(await file.verifiedFileContents()) - } - async license(): Promise { const file = this.archive.contents.getPath(["LICENSE.md"]) if (!file || !(file.contents instanceof FileContents)) - throw new Error("instructions.md not found in archive") + throw new Error("license.md not found in archive") return new TextDecoder().decode(await file.verifiedFileContents()) } } diff --git a/sdk/base/lib/types/ManifestTypes.ts b/sdk/base/lib/types/ManifestTypes.ts index e7b0db48d..6b4e47da7 100644 --- a/sdk/base/lib/types/ManifestTypes.ts +++ b/sdk/base/lib/types/ManifestTypes.ts @@ -42,6 +42,10 @@ export type SDKManifest = { * @example `https://nextcloud.com/contribute/` */ readonly donationUrl: string | null + /** + * URL where users can find instructions on how to use the service + */ + readonly docsUrl: string readonly description: { /** Short description to display on the marketplace list page. Max length 80 chars. */ readonly short: string diff --git a/sdk/base/lib/util/Drop.ts b/sdk/base/lib/util/Drop.ts new file mode 100644 index 000000000..62dd61f0f --- /dev/null +++ b/sdk/base/lib/util/Drop.ts @@ -0,0 +1,153 @@ +const dropId: unique symbol = Symbol("id") +export type DropRef = { [dropId]: number } + +export abstract class Drop { + private static weak: { [id: number]: Drop } = {} + private static registry = new FinalizationRegistry((id: number) => { + const weak = Drop.weak[id] + if (weak) weak.drop() + }) + private static idCtr: number = 0 + private dropId?: number + private dropRef?: DropRef | WeakRef + protected constructor() { + this.dropId = Drop.idCtr++ + this.dropRef = { [dropId]: this.dropId } + const weak = this.weak() + Drop.weak[this.dropId] = weak + Drop.registry.register(this.dropRef, this.dropId, this.dropRef) + + return new Proxy(this, { + set(target: any, prop, value) { + if (prop === "dropRef" || prop == "dropId") return false + target[prop] = value + ;(weak as any)[prop] = value + return true + }, + }) + } + protected register() {} + private weak(): this { + const weak = Object.assign(Object.create(Object.getPrototypeOf(this)), this) + if (this.dropRef) weak.ref = new WeakRef(this.dropRef) + return weak + } + abstract onDrop(): void + drop(): void { + if (!this.dropRef || !this.dropId) return + this.onDrop() + this.leak() + } + leak(): this { + if (!this.dropRef || !this.dropId) return this + Drop.registry.unregister(this.dropRef) + delete Drop.weak[this.dropId] + delete this.dropRef + delete this.dropId + return this + } +} + +export class DropPromise implements Promise { + private static dropFns: { [id: number]: () => void } = {} + private static registry = new FinalizationRegistry((id: number) => { + const drop = DropPromise.dropFns[id] + if (drop) { + drop() + delete DropPromise.dropFns[id] + } + }) + private static idCtr: number = 0 + private dropId: number + private dropRef: DropRef; + [Symbol.toStringTag] = "DropPromise" + private constructor( + private readonly promise: Promise, + dropFnOrRef?: (() => void) | DropRef, + ) { + if (dropFnOrRef && dropId in dropFnOrRef) { + this.dropId = dropFnOrRef[dropId] + this.dropRef = dropFnOrRef + return + } + this.dropId = DropPromise.idCtr++ + this.dropRef = { [dropId]: this.dropId } + if (dropFnOrRef) DropPromise.dropFns[this.dropId] = dropFnOrRef + DropPromise.registry.register(this.dropRef, this.dropId, this.dropRef) + } + static of(promise: Promise, dropFn?: () => void): DropPromise { + return new DropPromise(promise, dropFn) + } + static ref(promise: Promise, dropRef: DropRef): DropPromise { + return new DropPromise(promise, dropRef) + } + then( + onfulfilled?: + | ((value: T) => TResult1 | PromiseLike) + | null + | undefined, + onrejected?: + | ((reason: any) => TResult2 | PromiseLike) + | null + | undefined, + ): Promise { + return DropPromise.ref( + this.promise.then(onfulfilled, onrejected), + this.dropRef, + ) + } + catch( + onrejected?: + | ((reason: any) => TResult | PromiseLike) + | null + | undefined, + ): Promise { + return DropPromise.ref(this.promise.catch(onrejected), this.dropRef) + } + finally(onfinally?: (() => void) | null | undefined): Promise { + return DropPromise.ref(this.promise.finally(onfinally), this.dropRef) + } +} + +export class DropGenerator + implements AsyncGenerator +{ + private static dropFns: { [id: number]: () => void } = {} + private static registry = new FinalizationRegistry((id: number) => { + const drop = DropGenerator.dropFns[id] + if (drop) { + drop() + delete DropGenerator.dropFns[id] + } + }) + private static idCtr: number = 0 + private dropId: number + private dropRef: DropRef; + [Symbol.asyncIterator] = () => this + private constructor( + private readonly generator: AsyncGenerator, + dropFn?: () => void, + ) { + this.dropId = DropGenerator.idCtr++ + this.dropRef = { [dropId]: this.dropId } + if (dropFn) DropGenerator.dropFns[this.dropId] = dropFn + DropGenerator.registry.register(this.dropRef, this.dropId, this.dropRef) + } + static of( + generator: AsyncGenerator, + dropFn?: () => void, + ): DropGenerator { + return new DropGenerator(generator, dropFn) + } + next(...args: [] | [TNext]): Promise> { + return DropPromise.ref(this.generator.next(...args), this.dropRef) + } + return( + value: TReturn | PromiseLike, + ): Promise> { + return DropPromise.ref(this.generator.return(value), this.dropRef) + } + throw(e: any): Promise> { + return DropPromise.ref(this.generator.throw(e), this.dropRef) + } +} diff --git a/sdk/base/lib/util/GetSystemSmtp.ts b/sdk/base/lib/util/GetSystemSmtp.ts index 56ac25d2e..f874b10e3 100644 --- a/sdk/base/lib/util/GetSystemSmtp.ts +++ b/sdk/base/lib/util/GetSystemSmtp.ts @@ -1,5 +1,6 @@ import { Effects } from "../Effects" import * as T from "../types" +import { DropGenerator, DropPromise } from "./Drop" export class GetSystemSmtp { constructor(readonly effects: Effects) {} @@ -21,15 +22,13 @@ export class GetSystemSmtp { return this.effects.getSystemSmtp({}) } - /** - * Watches the system SMTP credentials. Returns an async iterator that yields whenever the value changes - */ - async *watch() { + private async *watchGen(abort?: AbortSignal) { const resolveCell = { resolve: () => {} } this.effects.onLeaveContext(() => { resolveCell.resolve() }) - while (this.effects.isInContext) { + abort?.addEventListener("abort", () => resolveCell.resolve()) + while (this.effects.isInContext && !abort?.aborted) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { callback = resolve @@ -42,6 +41,17 @@ export class GetSystemSmtp { } } + /** + * Watches the system SMTP credentials. Returns an async iterator that yields whenever the value changes + */ + watch( + abort?: AbortSignal, + ): AsyncGenerator { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of(this.watchGen(ctrl.signal), () => ctrl.abort()) + } + /** * Watches the system SMTP credentials. Takes a custom callback function to run whenever the credentials change */ @@ -49,12 +59,17 @@ export class GetSystemSmtp { callback: ( value: T.SmtpValue | null, error?: Error, - ) => void | Promise, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) { ;(async () => { - for await (const value of this.watch()) { + const ctrl = new AbortController() + for await (const value of this.watch(ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) { + ctrl.abort() + break + } } catch (e) { console.error( "callback function threw an error @ GetSystemSmtp.onChange", @@ -75,26 +90,20 @@ export class GetSystemSmtp { /** * Watches the system SMTP credentials. Returns when the predicate is true */ - async waitFor(pred: (value: T.SmtpValue | null) => boolean) { - const resolveCell = { resolve: () => {} } - this.effects.onLeaveContext(() => { - resolveCell.resolve() - }) - while (this.effects.isInContext) { - let callback: () => void = () => {} - const waitForNext = new Promise((resolve) => { - callback = resolve - resolveCell.resolve = resolve - }) - const res = await this.effects.getSystemSmtp({ - callback: () => callback(), - }) - if (pred(res)) { - resolveCell.resolve() - return res - } - await waitForNext - } - return null + waitFor( + pred: (value: T.SmtpValue | null) => boolean, + ): Promise { + const ctrl = new AbortController() + return DropPromise.of( + Promise.resolve().then(async () => { + for await (const next of this.watchGen(ctrl.signal)) { + if (pred(next)) { + return next + } + } + return null + }), + () => ctrl.abort(), + ) } } diff --git a/sdk/base/lib/util/getServiceInterface.ts b/sdk/base/lib/util/getServiceInterface.ts index 8c660f4db..d51fb8880 100644 --- a/sdk/base/lib/util/getServiceInterface.ts +++ b/sdk/base/lib/util/getServiceInterface.ts @@ -2,6 +2,7 @@ import { ServiceInterfaceType } from "../types" import { knownProtocols } from "../interfaces/Host" import { AddressInfo, Host, Hostname, HostnameInfo } from "../types" import { Effects } from "../Effects" +import { DropGenerator, DropPromise } from "./Drop" export type UrlString = string export type HostId = string @@ -312,16 +313,14 @@ export class GetServiceInterface { return interfaceFilled } - /** - * Watches the requested service interface. Returns an async iterator that yields whenever the value changes - */ - async *watch() { + private async *watchGen(abort?: AbortSignal) { const { id, packageId } = this.opts const resolveCell = { resolve: () => {} } this.effects.onLeaveContext(() => { resolveCell.resolve() }) - while (this.effects.isInContext) { + abort?.addEventListener("abort", () => resolveCell.resolve()) + while (this.effects.isInContext && !abort?.aborted) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { callback = resolve @@ -337,6 +336,17 @@ export class GetServiceInterface { } } + /** + * Watches the requested service interface. Returns an async iterator that yields whenever the value changes + */ + watch( + abort?: AbortSignal, + ): AsyncGenerator { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of(this.watchGen(ctrl.signal), () => ctrl.abort()) + } + /** * Watches the requested service interface. Takes a custom callback function to run whenever the value changes */ @@ -344,12 +354,17 @@ export class GetServiceInterface { callback: ( value: ServiceInterfaceFilled | null, error?: Error, - ) => void | Promise, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) { ;(async () => { - for await (const value of this.watch()) { + const ctrl = new AbortController() + for await (const value of this.watch(ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) { + ctrl.abort() + break + } } catch (e) { console.error( "callback function threw an error @ GetServiceInterface.onChange", @@ -370,31 +385,21 @@ export class GetServiceInterface { /** * Watches the requested service interface. Returns when the predicate is true */ - async waitFor(pred: (value: ServiceInterfaceFilled | null) => boolean) { - const { id, packageId } = this.opts - const resolveCell = { resolve: () => {} } - this.effects.onLeaveContext(() => { - resolveCell.resolve() - }) - while (this.effects.isInContext) { - let callback: () => void = () => {} - const waitForNext = new Promise((resolve) => { - callback = resolve - resolveCell.resolve = resolve - }) - const res = await makeInterfaceFilled({ - effects: this.effects, - id, - packageId, - callback, - }) - if (pred(res)) { - resolveCell.resolve() - return res - } - await waitForNext - } - return null + waitFor( + pred: (value: ServiceInterfaceFilled | null) => boolean, + ): Promise { + const ctrl = new AbortController() + return DropPromise.of( + Promise.resolve().then(async () => { + for await (const next of this.watchGen(ctrl.signal)) { + if (pred(next)) { + return next + } + } + return null + }), + () => ctrl.abort(), + ) } } export function getServiceInterface( diff --git a/sdk/base/lib/util/getServiceInterfaces.ts b/sdk/base/lib/util/getServiceInterfaces.ts index d2289a070..34636981a 100644 --- a/sdk/base/lib/util/getServiceInterfaces.ts +++ b/sdk/base/lib/util/getServiceInterfaces.ts @@ -1,4 +1,5 @@ import { Effects } from "../Effects" +import { DropGenerator, DropPromise } from "./Drop" import { ServiceInterfaceFilled, filledAddress, @@ -77,16 +78,14 @@ export class GetServiceInterfaces { return interfaceFilled } - /** - * Watches the service interfaces for the package. Returns an async iterator that yields whenever the value changes - */ - async *watch() { + private async *watchGen(abort?: AbortSignal) { const { packageId } = this.opts const resolveCell = { resolve: () => {} } this.effects.onLeaveContext(() => { resolveCell.resolve() }) - while (this.effects.isInContext) { + abort?.addEventListener("abort", () => resolveCell.resolve()) + while (this.effects.isInContext && !abort?.aborted) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { callback = resolve @@ -101,6 +100,17 @@ export class GetServiceInterfaces { } } + /** + * Watches the service interfaces for the package. Returns an async iterator that yields whenever the value changes + */ + watch( + abort?: AbortSignal, + ): AsyncGenerator { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of(this.watchGen(ctrl.signal), () => ctrl.abort()) + } + /** * Watches the service interfaces for the package. Takes a custom callback function to run whenever the value changes */ @@ -108,12 +118,17 @@ export class GetServiceInterfaces { callback: ( value: ServiceInterfaceFilled[] | null, error?: Error, - ) => void | Promise, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) { ;(async () => { - for await (const value of this.watch()) { + const ctrl = new AbortController() + for await (const value of this.watch(ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) { + ctrl.abort() + break + } } catch (e) { console.error( "callback function threw an error @ GetServiceInterfaces.onChange", @@ -134,30 +149,21 @@ export class GetServiceInterfaces { /** * Watches the service interfaces for the package. Returns when the predicate is true */ - async waitFor(pred: (value: ServiceInterfaceFilled[] | null) => boolean) { - const { packageId } = this.opts - const resolveCell = { resolve: () => {} } - this.effects.onLeaveContext(() => { - resolveCell.resolve() - }) - while (this.effects.isInContext) { - let callback: () => void = () => {} - const waitForNext = new Promise((resolve) => { - callback = resolve - resolveCell.resolve = resolve - }) - const res = await makeManyInterfaceFilled({ - effects: this.effects, - packageId, - callback, - }) - if (pred(res)) { - resolveCell.resolve() - return res - } - await waitForNext - } - return null + waitFor( + pred: (value: ServiceInterfaceFilled[] | null) => boolean, + ): Promise { + const ctrl = new AbortController() + return DropPromise.of( + Promise.resolve().then(async () => { + for await (const next of this.watchGen(ctrl.signal)) { + if (pred(next)) { + return next + } + } + return null + }), + () => ctrl.abort(), + ) } } export function getServiceInterfaces( diff --git a/sdk/base/lib/util/graph.ts b/sdk/base/lib/util/graph.ts index 682ccf63e..fccccbf70 100644 --- a/sdk/base/lib/util/graph.ts +++ b/sdk/base/lib/util/graph.ts @@ -1,4 +1,5 @@ import { boolean } from "ts-matches" +import { ExtendedVersion } from "../exver" export type Vertex = { metadata: VMetadata @@ -14,6 +15,22 @@ export type Edge = { export class Graph { private readonly vertices: Array> = [] constructor() {} + dump( + metadataRepr: (metadata: VMetadata | EMetadata) => any = (a) => a, + ): string { + const seen = new WeakSet() + + return JSON.stringify( + this.vertices, + (k, v) => { + if (k === "metadata") return metadataRepr(v) + if (k === "from") return metadataRepr(v.metadata) + if (k === "to") return metadataRepr(v.metadata) + return v + }, + 2, + ) + } addVertex( metadata: VMetadata, fromEdges: Array, "to">>, diff --git a/sdk/package/lib/StartSdk.ts b/sdk/package/lib/StartSdk.ts index ff6f98b3f..3f74b172a 100644 --- a/sdk/package/lib/StartSdk.ts +++ b/sdk/package/lib/StartSdk.ts @@ -59,8 +59,9 @@ import { setupOnInit, setupOnUninit, } from "../../base/lib/inits" +import { DropGenerator } from "../../base/lib/util/Drop" -export const OSVersion = testTypeVersion("0.4.0-alpha.8") +export const OSVersion = testTypeVersion("0.4.0-alpha.9") // prettier-ignore type AnyNeverCond = @@ -191,12 +192,13 @@ export class StartSdk { "callback" > = {}, ) => { - async function* watch() { + async function* watch(abort?: AbortSignal) { const resolveCell = { resolve: () => {} } effects.onLeaveContext(() => { resolveCell.resolve() }) - while (effects.isInContext) { + abort?.addEventListener("abort", () => resolveCell.resolve()) + while (effects.isInContext && !abort?.aborted) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { callback = resolve @@ -215,17 +217,26 @@ export class StartSdk { (() => effects.constRetry && effects.constRetry()), }), once: () => effects.getContainerIp(options), - watch, + watch: (abort?: AbortSignal) => { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of(watch(ctrl.signal), () => ctrl.abort()) + }, onChange: ( callback: ( value: string | null, error?: Error, - ) => void | Promise, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) => { ;(async () => { - for await (const value of watch()) { + const ctrl = new AbortController() + for await (const value of watch(ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) { + ctrl.abort() + break + } } catch (e) { console.error( "callback function threw an error @ getContainerIp.onChange", diff --git a/sdk/package/lib/mainFn/CommandController.ts b/sdk/package/lib/mainFn/CommandController.ts index 7fba975f4..156792dcf 100644 --- a/sdk/package/lib/mainFn/CommandController.ts +++ b/sdk/package/lib/mainFn/CommandController.ts @@ -35,7 +35,7 @@ export class CommandController< const abort = new AbortController() const cell: { ctrl: CommandController } = { ctrl: new CommandController( - exec.fn(subcontainer, abort).then(async (command) => { + exec.fn(subcontainer, abort.signal).then(async (command) => { if (subcontainer && command && !abort.signal.aborted) { const newCtrl = ( await CommandController.of< diff --git a/sdk/package/lib/mainFn/Daemon.ts b/sdk/package/lib/mainFn/Daemon.ts index e4ee36e5f..cbd17f9c7 100644 --- a/sdk/package/lib/mainFn/Daemon.ts +++ b/sdk/package/lib/mainFn/Daemon.ts @@ -49,7 +49,11 @@ export class Daemon< (subc?.rc() ?? null) as C, exec, ) - return new Daemon(subc, startCommand) + const res = new Daemon(subc, startCommand) + effects.onLeaveContext(() => { + res.stop().catch((e) => console.error(asError(e))) + }) + return res } } async start() { @@ -66,6 +70,11 @@ export class Daemon< .catch((err) => console.error(err)) try { this.commandController = await this.startCommand() + if (!this.shouldBeRunning) { + // handles race condition if stopped while starting + await this.stop() + break + } const success = await this.commandController.wait().then( (_) => true, (err) => { @@ -107,12 +116,14 @@ export class Daemon< }) { this.shouldBeRunning = false this.exitedSuccess = false - await this.commandController - ?.term({ ...termOptions }) - .catch((e) => console.error(asError(e))) - this.commandController = null - this.onExitFns = [] - await this.subcontainer?.destroy() + if (this.commandController) { + await this.commandController + .term({ ...termOptions }) + .catch((e) => console.error(asError(e))) + this.commandController = null + this.onExitFns = [] + await this.subcontainer?.destroy() + } } subcontainerRc(): SubContainerRc | null { return this.subcontainer?.rc() ?? null diff --git a/sdk/package/lib/mainFn/Daemons.ts b/sdk/package/lib/mainFn/Daemons.ts index 01b61150c..4a8e6110a 100644 --- a/sdk/package/lib/mainFn/Daemons.ts +++ b/sdk/package/lib/mainFn/Daemons.ts @@ -17,6 +17,7 @@ import { CommandController } from "./CommandController" import { HealthCheck } from "../health/HealthCheck" import { Oneshot } from "./Oneshot" import { Manifest } from "../test/output.sdk" +import { asError } from "../util" export const cpExec = promisify(CP.exec) export const cpExecFile = promisify(CP.execFile) @@ -69,7 +70,7 @@ export type ExecFnOptions< > = { fn: ( subcontainer: C, - abort: AbortController, + abort: AbortSignal, ) => Promise // Defaults to the DEFAULT_SIGTERM_TIMEOUT = 30_000ms sigtermTimeout?: number @@ -379,6 +380,9 @@ export class Daemons } async build() { + this.effects.onLeaveContext(() => { + this.term().catch((e) => console.error(asError(e))) + }) for (const daemon of this.healthDaemons) { await daemon.init() } diff --git a/sdk/package/lib/manifest/setupManifest.ts b/sdk/package/lib/manifest/setupManifest.ts index 17d7d7d3a..9b886e16e 100644 --- a/sdk/package/lib/manifest/setupManifest.ts +++ b/sdk/package/lib/manifest/setupManifest.ts @@ -54,6 +54,7 @@ export function buildManifest< ) return { ...manifest, + gitHash: null, osVersion: manifest.osVersion ?? OSVersion, sdkVersion, version: versions.current.options.version, diff --git a/sdk/package/lib/test/inputSpecBuilder.test.ts b/sdk/package/lib/test/inputSpecBuilder.test.ts index a1db193bd..fbad4b8f1 100644 --- a/sdk/package/lib/test/inputSpecBuilder.test.ts +++ b/sdk/package/lib/test/inputSpecBuilder.test.ts @@ -396,14 +396,13 @@ describe("values", () => { supportSite: "", marketingSite: "", donationUrl: null, + docsUrl: "", description: { short: "", long: "", }, - containers: {}, images: {}, volumes: [], - assets: [], alerts: { install: null, update: null, diff --git a/sdk/package/lib/test/output.sdk.ts b/sdk/package/lib/test/output.sdk.ts index f29316ec9..bafcc30ae 100644 --- a/sdk/package/lib/test/output.sdk.ts +++ b/sdk/package/lib/test/output.sdk.ts @@ -9,17 +9,16 @@ export const sdk = StartSdk.of() id: "testOutput", title: "", license: "", - replaces: [], wrapperRepo: "", upstreamRepo: "", supportSite: "", marketingSite: "", donationUrl: null, + docsUrl: "", description: { short: "", long: "", }, - containers: {}, images: { main: { source: { @@ -30,7 +29,6 @@ export const sdk = StartSdk.of() }, }, volumes: [], - assets: [], alerts: { install: null, update: null, diff --git a/sdk/package/lib/util/Drop.ts b/sdk/package/lib/util/Drop.ts deleted file mode 100644 index 1cd12b516..000000000 --- a/sdk/package/lib/util/Drop.ts +++ /dev/null @@ -1,46 +0,0 @@ -export abstract class Drop { - private static weak: { [id: number]: Drop } = {} - private static registry = new FinalizationRegistry((id: number) => { - const weak = Drop.weak[id] - if (weak) weak.drop() - }) - private static idCtr: number = 0 - private dropId?: number - private dropRef?: { id: number } | WeakRef<{ id: number }> - protected constructor() { - this.dropId = Drop.idCtr++ - this.dropRef = { id: this.dropId } - const weak = this.weak() - Drop.weak[this.dropId] = weak - Drop.registry.register(this.dropRef, this.dropId, this.dropRef) - - return new Proxy(this, { - set(target: any, prop, value) { - if (prop === "dropRef" || prop == "dropId") return false - target[prop] = value - ;(weak as any)[prop] = value - return true - }, - }) - } - protected register() {} - protected weak(): this { - const weak = Object.assign(Object.create(Object.getPrototypeOf(this)), this) - if (this.dropRef) weak.ref = new WeakRef(this.dropRef) - return weak - } - abstract onDrop(): void - drop(): void { - if (!this.dropRef || !this.dropId) return - this.onDrop() - this.leak() - } - leak(): this { - if (!this.dropRef || !this.dropId) return this - Drop.registry.unregister(this.dropRef) - delete Drop.weak[this.dropId] - delete this.dropRef - delete this.dropId - return this - } -} diff --git a/sdk/package/lib/util/GetSslCertificate.ts b/sdk/package/lib/util/GetSslCertificate.ts index 5eee31bd0..9d6c8dccf 100644 --- a/sdk/package/lib/util/GetSslCertificate.ts +++ b/sdk/package/lib/util/GetSslCertificate.ts @@ -1,5 +1,6 @@ import { T } from ".." import { Effects } from "../../../base/lib/Effects" +import { DropGenerator, DropPromise } from "../../../base/lib/util/Drop" export class GetSslCertificate { constructor( @@ -30,15 +31,13 @@ export class GetSslCertificate { }) } - /** - * Watches the SSL Certificate for the given hostnames if permitted. Returns an async iterator that yields whenever the value changes - */ - async *watch() { + private async *watchGen(abort?: AbortSignal) { const resolveCell = { resolve: () => {} } this.effects.onLeaveContext(() => { resolveCell.resolve() }) - while (this.effects.isInContext) { + abort?.addEventListener("abort", () => resolveCell.resolve()) + while (this.effects.isInContext && !abort?.aborted) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { callback = resolve @@ -53,6 +52,17 @@ export class GetSslCertificate { } } + /** + * Watches the SSL Certificate for the given hostnames if permitted. Returns an async iterator that yields whenever the value changes + */ + watch( + abort?: AbortSignal, + ): AsyncGenerator<[string, string, string], void, unknown> { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of(this.watchGen(ctrl.signal), () => ctrl.abort()) + } + /** * Watches the SSL Certificate for the given hostnames if permitted. Takes a custom callback function to run whenever it changes */ @@ -60,12 +70,17 @@ export class GetSslCertificate { callback: ( value: [string, string, string] | null, error?: Error, - ) => void | Promise, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) { ;(async () => { - for await (const value of this.watch()) { + const ctrl = new AbortController() + for await (const value of this.watch(ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) { + ctrl.abort() + break + } } catch (e) { console.error( "callback function threw an error @ GetSslCertificate.onChange", @@ -86,28 +101,20 @@ export class GetSslCertificate { /** * Watches the SSL Certificate for the given hostnames if permitted. Returns when the predicate is true */ - async waitFor(pred: (value: [string, string, string] | null) => boolean) { - const resolveCell = { resolve: () => {} } - this.effects.onLeaveContext(() => { - resolveCell.resolve() - }) - while (this.effects.isInContext) { - let callback: () => void = () => {} - const waitForNext = new Promise((resolve) => { - callback = resolve - resolveCell.resolve = resolve - }) - const res = await this.effects.getSslCertificate({ - hostnames: this.hostnames, - algorithm: this.algorithm, - callback: () => callback(), - }) - if (pred(res)) { - resolveCell.resolve() - return res - } - await waitForNext - } - return null + waitFor( + pred: (value: [string, string, string] | null) => boolean, + ): Promise<[string, string, string] | null> { + const ctrl = new AbortController() + return DropPromise.of( + Promise.resolve().then(async () => { + for await (const next of this.watchGen(ctrl.signal)) { + if (pred(next)) { + return next + } + } + return null + }), + () => ctrl.abort(), + ) } } diff --git a/sdk/package/lib/util/SubContainer.ts b/sdk/package/lib/util/SubContainer.ts index 8473d3b3a..9f89d6115 100644 --- a/sdk/package/lib/util/SubContainer.ts +++ b/sdk/package/lib/util/SubContainer.ts @@ -4,7 +4,7 @@ import * as cp from "child_process" import { promisify } from "util" import { Buffer } from "node:buffer" import { once } from "../../../base/lib/util/once" -import { Drop } from "./Drop" +import { Drop } from "../../../base/lib/util/Drop" import { Mounts } from "../mainFn/Mounts" import { BackupEffects } from "../backup/Backups" diff --git a/sdk/package/lib/util/fileHelper.ts b/sdk/package/lib/util/fileHelper.ts index 4bf1e4047..d6f83a68a 100644 --- a/sdk/package/lib/util/fileHelper.ts +++ b/sdk/package/lib/util/fileHelper.ts @@ -4,10 +4,38 @@ import * as TOML from "@iarna/toml" import * as INI from "ini" import * as T from "../../../base/lib/types" import * as fs from "node:fs/promises" -import { asError, partialDiff } from "../../../base/lib/util" +import { asError } from "../../../base/lib/util" +import { DropGenerator, DropPromise } from "../../../base/lib/util/Drop" const previousPath = /(.+?)\/([^/]*)$/ +const deepEq = (left: unknown, right: unknown) => { + if (left === right) return true + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length === right.length) { + for (const idx in left) { + if (!deepEq(left[idx], right[idx])) return false + } + return true + } + } else if ( + typeof left === "object" && + typeof right === "object" && + left && + right + ) { + const keys = new Set([ + ...(Object.keys(left) as (keyof typeof left)[]), + ...(Object.keys(right) as (keyof typeof right)[]), + ]) + for (let key of keys) { + if (!deepEq(left[key], right[key])) return false + } + return true + } + return false +} + const exists = (path: string) => fs.access(path).then( () => true, @@ -99,10 +127,16 @@ type Validator = matches.Validator | matches.Validator type ReadType = { once: () => Promise const: (effects: T.Effects) => Promise - watch: (effects: T.Effects) => AsyncGenerator + watch: ( + effects: T.Effects, + abort?: AbortSignal, + ) => AsyncGenerator onChange: ( effects: T.Effects, - callback: (value: A | null, error?: Error) => void | Promise, + callback: ( + value: A | null, + error?: Error, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) => void waitFor: ( effects: T.Effects, @@ -151,7 +185,12 @@ type ReadType = { * ``` */ export class FileHelper { - private consts: (() => void)[] = [] + private consts: [ + () => void, + any, + (a: any) => any, + (left: any, right: any) => any, + ][] = [] protected constructor( readonly path: string, readonly writeData: (dataIn: A) => string, @@ -209,10 +248,15 @@ export class FileHelper { const watch = this.readWatch(effects, map, eq) const res = await watch.next() if (effects.constRetry) { - if (!this.consts.includes(effects.constRetry)) - this.consts.push(effects.constRetry) + const record: (typeof this.consts)[number] = [ + effects.constRetry, + res.value, + map, + eq, + ] + this.consts.push(record) watch.next().then(() => { - this.consts = this.consts.filter((a) => a === effects.constRetry) + this.consts = this.consts.filter((r) => r !== record) effects.constRetry && effects.constRetry() }) } @@ -223,11 +267,13 @@ export class FileHelper { effects: T.Effects, map: (value: A) => B, eq: (left: B | null | undefined, right: B | null) => boolean, + abort?: AbortSignal, ) { let res - while (effects.isInContext) { + while (effects.isInContext && !abort?.aborted) { if (await exists(this.path)) { const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) const watch = fs.watch(this.path, { persistent: false, signal: ctrl.signal, @@ -254,14 +300,19 @@ export class FileHelper { private readOnChange( effects: T.Effects, - callback: (value: B | null, error?: Error) => void | Promise, + callback: ( + value: B | null, + error?: Error, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, map: (value: A) => B, eq: (left: B | null | undefined, right: B | null) => boolean, ) { ;(async () => { - for await (const value of this.readWatch(effects, map, eq)) { + const ctrl = new AbortController() + for await (const value of this.readWatch(effects, map, eq, ctrl.signal)) { try { - await callback(value) + const res = await callback(value) + if (res.cancel) ctrl.abort() } catch (e) { console.error( "callback function threw an error @ FileHelper.read.onChange", @@ -279,38 +330,36 @@ export class FileHelper { ) } - private async readWaitFor( + private readWaitFor( effects: T.Effects, pred: (value: B | null, error?: Error) => boolean, map: (value: A) => B, ): Promise { - while (effects.isInContext) { - if (await exists(this.path)) { - const ctrl = new AbortController() - const watch = fs.watch(this.path, { - persistent: false, - signal: ctrl.signal, - }) - const newRes = await this.readOnce(map) - const listen = Promise.resolve() - .then(async () => { - for await (const _ of watch) { + const ctrl = new AbortController() + return DropPromise.of( + Promise.resolve().then(async () => { + const watch = this.readWatch(effects, map, (_) => false, ctrl.signal) + while (true) { + try { + const res = await watch.next() + if (pred(res.value)) { ctrl.abort() - return null + return res.value } - }) - .catch((e) => console.error(asError(e))) - if (pred(newRes)) { - ctrl.abort() - return newRes + if (res.done) { + break + } + } catch (e) { + if (pred(null, e as Error)) { + break + } + } } - await listen - } else { - if (pred(null)) return null - await onCreated(this.path).catch((e) => console.error(asError(e))) - } - } - return null + ctrl.abort() + return null + }), + () => ctrl.abort(), + ) } read(): ReadType @@ -323,14 +372,24 @@ export class FileHelper { eq?: (left: any, right: any) => boolean, ): ReadType { map = map ?? ((a: A) => a) - eq = eq ?? ((left: any, right: any) => !partialDiff(left, right)) + eq = eq ?? deepEq return { once: () => this.readOnce(map), const: (effects: T.Effects) => this.readConst(effects, map, eq), - watch: (effects: T.Effects) => this.readWatch(effects, map, eq), + watch: (effects: T.Effects, abort?: AbortSignal) => { + const ctrl = new AbortController() + abort?.addEventListener("abort", () => ctrl.abort()) + return DropGenerator.of( + this.readWatch(effects, map, eq, ctrl.signal), + () => ctrl.abort(), + ) + }, onChange: ( effects: T.Effects, - callback: (value: A | null, error?: Error) => void | Promise, + callback: ( + value: A | null, + error?: Error, + ) => { cancel: boolean } | Promise<{ cancel: boolean }>, ) => this.readOnChange(effects, callback, map, eq), waitFor: (effects: T.Effects, pred: (value: A | null) => boolean) => this.readWaitFor(effects, pred, map), @@ -345,13 +404,17 @@ export class FileHelper { data: T.AllowReadonly | A, options: { allowWriteAfterConst?: boolean } = {}, ) { - await this.writeFile(this.validate(data)) - if ( - !options.allowWriteAfterConst && - effects.constRetry && - this.consts.includes(effects.constRetry) - ) - throw new Error(`Canceled: write after const: ${this.path}`) + const newData = this.validate(data) + await this.writeFile(newData) + if (!options.allowWriteAfterConst && effects.constRetry) { + const records = this.consts.filter(([c]) => c === effects.constRetry) + for (const record of records) { + const [_, prev, map, eq] = record + if (!eq(prev, map(newData))) { + throw new Error(`Canceled: write after const: ${this.path}`) + } + } + } return null } @@ -372,16 +435,14 @@ export class FileHelper { const toWrite = this.writeData(mergeData) if (toWrite !== fileDataRaw) { this.writeFile(mergeData) - if ( - !options.allowWriteAfterConst && - effects.constRetry && - this.consts.includes(effects.constRetry) - ) { - const diff = partialDiff(fileData, mergeData as any) - if (!diff) { - return null + if (!options.allowWriteAfterConst && effects.constRetry) { + const records = this.consts.filter(([c]) => c === effects.constRetry) + for (const record of records) { + const [_, prev, map, eq] = record + if (!eq(prev, map(mergeData))) { + throw new Error(`Canceled: write after const: ${this.path}`) + } } - throw new Error(`Canceled: write after const: ${this.path}`) } } return null diff --git a/sdk/package/lib/util/index.ts b/sdk/package/lib/util/index.ts index d5f024686..879a512d5 100644 --- a/sdk/package/lib/util/index.ts +++ b/sdk/package/lib/util/index.ts @@ -2,4 +2,4 @@ export * from "../../../base/lib/util" export { GetSslCertificate } from "./GetSslCertificate" export { hostnameInfoToAddress } from "../../../base/lib/util/Hostname" -export { Drop } from "./Drop" +export { Drop } from "../../../base/lib/util/Drop" diff --git a/sdk/package/lib/version/VersionGraph.ts b/sdk/package/lib/version/VersionGraph.ts index adb6a303d..840421a3b 100644 --- a/sdk/package/lib/version/VersionGraph.ts +++ b/sdk/package/lib/version/VersionGraph.ts @@ -58,6 +58,9 @@ export class VersionGraph ExtendedVersion | VersionRange, ((opts: { effects: T.Effects }) => Promise) | undefined > + dump(): string { + return this.graph().dump((metadata) => metadata?.toString()) + } private constructor( readonly current: VersionInfo, versions: Array>, @@ -97,7 +100,7 @@ export class VersionGraph VersionInfo, Vertex< ExtendedVersion | VersionRange, - (opts: { effects: T.Effects }) => Promise + ((opts: { effects: T.Effects }) => Promise) | undefined >, ] | undefined = undefined @@ -146,6 +149,8 @@ export class VersionGraph } } } + + prev = [v, version, vertex] } } return graph @@ -198,6 +203,23 @@ export class VersionGraph (v) => overlaps(v.metadata, to), ) if (path) { + console.log( + `Migrating ${ + path.reduce<{ acc: string; prev: string | null }>( + ({ acc, prev }, x) => ({ + acc: + acc + + (prev && prev != x.from.metadata.toString() + ? ` (as ${prev})` + : "") + + " -> " + + x.to.metadata.toString(), + prev: x.to.metadata.toString(), + }), + { acc: from.toString(), prev: null }, + ).acc + }`, + ) let dataVersion = from for (let edge of path) { if (edge.metadata) { diff --git a/sdk/package/lib/version/VersionInfo.ts b/sdk/package/lib/version/VersionInfo.ts index e52c71346..0d6bd1c62 100644 --- a/sdk/package/lib/version/VersionInfo.ts +++ b/sdk/package/lib/version/VersionInfo.ts @@ -1,7 +1,7 @@ import { ValidateExVer } from "../../../base/lib/exver" import * as T from "../../../base/lib/types" -export const IMPOSSIBLE = Symbol("IMPOSSIBLE") +export const IMPOSSIBLE: unique symbol = Symbol("IMPOSSIBLE") export type VersionOptions = { /** The exver-compliant version number */ diff --git a/sdk/package/package-lock.json b/sdk/package/package-lock.json index d2da630aa..6be167d70 100644 --- a/sdk/package/package-lock.json +++ b/sdk/package/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.33", + "version": "0.4.0-beta.36", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.33", + "version": "0.4.0-beta.36", "license": "MIT", "dependencies": { "@iarna/toml": "^3.0.0", diff --git a/sdk/package/package.json b/sdk/package/package.json index 0fb5673d0..9b1fc87fc 100644 --- a/sdk/package/package.json +++ b/sdk/package/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.33", + "version": "0.4.0-beta.36", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./package/lib/index.js", "types": "./package/lib/index.d.ts", diff --git a/sdk/package/tsconfig.json b/sdk/package/tsconfig.json index 2e903eaab..cee6dad33 100644 --- a/sdk/package/tsconfig.json +++ b/sdk/package/tsconfig.json @@ -15,6 +15,6 @@ "target": "es2021", "resolveJsonModule": true }, - "include": ["lib/**/*", "../base/lib/util/Hostname.ts"], + "include": ["lib/**/*"], "exclude": ["lib/**/*.spec.ts", "lib/**/*.gen.ts", "list", "node_modules"] } diff --git a/web/angular.json b/web/angular.json index 0080f59eb..a90d5c00a 100644 --- a/web/angular.json +++ b/web/angular.json @@ -385,7 +385,29 @@ "changeDetection": "OnPush", "style": "scss", "skipTests": true, - "skipImport": true + "skipImport": true, + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." } } } diff --git a/web/package-lock.json b/web/package-lock.json index db49af3ec..3e4bb536a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,43 +1,43 @@ { "name": "startos-ui", - "version": "0.4.0-alpha.8", + "version": "0.4.0-alpha.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "startos-ui", - "version": "0.4.0-alpha.8", + "version": "0.4.0-alpha.9", "license": "MIT", "dependencies": { - "@angular/animations": "^19.2.11", - "@angular/cdk": "^19.2.16", - "@angular/common": "^19.2.11", - "@angular/compiler": "^19.2.11", - "@angular/core": "^19.2.11", - "@angular/forms": "^19.2.11", - "@angular/platform-browser": "^19.2.11", - "@angular/platform-browser-dynamic": "^19.2.11", - "@angular/pwa": "^19.2.12", - "@angular/router": "^19.2.11", - "@angular/service-worker": "^19.2.11", + "@angular/animations": "^20.1.0", + "@angular/cdk": "^20.1.0", + "@angular/common": "^20.1.0", + "@angular/compiler": "^20.1.0", + "@angular/core": "^20.1.0", + "@angular/forms": "^20.1.0", + "@angular/platform-browser": "^20.1.0", + "@angular/platform-browser-dynamic": "^20.1.0", + "@angular/pwa": "^20.1.0", + "@angular/router": "^20.1.0", + "@angular/service-worker": "^20.1.0", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.3.0", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.41.0", - "@taiga-ui/addon-commerce": "4.41.0", - "@taiga-ui/addon-mobile": "4.41.0", - "@taiga-ui/addon-table": "4.41.0", - "@taiga-ui/cdk": "4.41.0", - "@taiga-ui/core": "4.41.0", + "@taiga-ui/addon-charts": "4.44.0", + "@taiga-ui/addon-commerce": "4.44.0", + "@taiga-ui/addon-mobile": "4.44.0", + "@taiga-ui/addon-table": "4.44.0", + "@taiga-ui/cdk": "4.44.0", + "@taiga-ui/core": "4.44.0", "@taiga-ui/dompurify": "4.1.11", "@taiga-ui/event-plugins": "4.6.0", - "@taiga-ui/experimental": "4.41.0", - "@taiga-ui/icons": "4.41.0", - "@taiga-ui/kit": "4.41.0", - "@taiga-ui/layout": "4.41.0", - "@taiga-ui/legacy": "4.41.0", + "@taiga-ui/experimental": "4.44.0", + "@taiga-ui/icons": "4.44.0", + "@taiga-ui/kit": "4.44.0", + "@taiga-ui/layout": "4.44.0", + "@taiga-ui/legacy": "4.44.0", "@taiga-ui/polymorpheus": "4.9.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -57,7 +57,7 @@ "mime": "^4.0.3", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^19.0.1", + "ng-qrcode": "^20.0.0", "node-jose": "^2.2.0", "patch-db-client": "file:../patch-db/client", "pbkdf2": "^3.1.2", @@ -69,10 +69,10 @@ }, "devDependencies": { "@angular-experts/hawkeye": "^1.7.2", - "@angular/build": "^19.2.12", - "@angular/cli": "^19.2.12", - "@angular/compiler-cli": "^19.2.11", - "@angular/language-service": "^19.2.11", + "@angular/build": "^20.1.0", + "@angular/cli": "^20.1.0", + "@angular/compiler-cli": "^20.1.0", + "@angular/language-service": "^20.1.0", "@types/dompurify": "3.0.5", "@types/estree": "^0.0.51", "@types/js-yaml": "^4.0.5", @@ -84,7 +84,7 @@ "@types/uuid": "^8.3.1", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^19.2.2", + "ng-packagr": "^20.1.0", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", "prettier": "^3.5.3", @@ -157,25 +157,25 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1902.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.12.tgz", - "integrity": "sha512-LfUc7k84YL290hAxsG+FvjQpXugQXyw5aDzrQQB4iTYhBgaABu2aaNOU4eu3JH+F8NeXd2EBF/YMr2LDSkYlMw==", + "version": "0.2001.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.0.tgz", + "integrity": "sha512-IDBG+YP0nPaA/tIjtJ1ZPh0VEfbxSn0yCvbS7dTfqyrnmanPUFpU5qsT9vJTU6yzkuzBEhNFRzkUCQaUAziLRA==", "devOptional": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.12", - "rxjs": "7.8.1" + "@angular-devkit/core": "20.1.0", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.12.tgz", - "integrity": "sha512-v5pdfZHZ8MTZozfpkhKoPFBpXQW+2GFbTfdyis8FBtevJWCbIsCR3xhodgI4jwzkSEAraN4oVtWvSytdNyBC6A==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.0.tgz", + "integrity": "sha512-i2t22bklvKsqdwmUtjXltRyxmJ+lJW8isrdc7XeN0N6VW/lDHSJqFlucT1+pO9+FxXJQyz3Hc1dpRd6G65mGyw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -183,11 +183,11 @@ "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "source-map": "0.7.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -200,24 +200,6 @@ } } }, - "node_modules/@angular-devkit/architect/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@angular-devkit/architect/node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -252,16 +234,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-devkit/core": { "version": "18.2.19", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.19.tgz", @@ -290,24 +262,6 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -319,38 +273,38 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.12.tgz", - "integrity": "sha512-vK5NI/asi1snWFkw02DpmC8tLq6u5ZbUwwXxgALKuVwGl3g1VLzrHrkoSCrcsOO9Nu6GQOPbxax2lR/DICmytg==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.0.tgz", + "integrity": "sha512-0UtJAptrqsfABi0DxrY7cyvlGe5kHRiqVwB+h3g2DEv3ikXKZh1dOFR3o2bK+sVhUqgFaV8qgSnCmR9a48xY0g==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.12", + "@angular-devkit/core": "20.1.0", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" + "ora": "8.2.0", + "rxjs": "7.8.2" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.12.tgz", - "integrity": "sha512-v5pdfZHZ8MTZozfpkhKoPFBpXQW+2GFbTfdyis8FBtevJWCbIsCR3xhodgI4jwzkSEAraN4oVtWvSytdNyBC6A==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.0.tgz", + "integrity": "sha512-i2t22bklvKsqdwmUtjXltRyxmJ+lJW8isrdc7XeN0N6VW/lDHSJqFlucT1+pO9+FxXJQyz3Hc1dpRd6G65mGyw==", "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "source-map": "0.7.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -363,23 +317,6 @@ } } }, - "node_modules/@angular-devkit/schematics/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@angular-devkit/schematics/node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -412,15 +349,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-experts/hawkeye": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@angular-experts/hawkeye/-/hawkeye-1.7.2.tgz", @@ -463,81 +391,91 @@ } }, "node_modules/@angular/animations": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.11.tgz", - "integrity": "sha512-NR33bZVho7EgTc1fmCnmkwc2/U266n311Wfvk7VVtz+0Q9WliNdDLBon654V8IWSKvlqKXyU3W+fp0VjH/FvSw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-20.1.0.tgz", + "integrity": "sha512-5ILngsvu5VPQYaIm7lRyegZaDaAEtLUIPSS8h1dzWPaCxBIJ4uwzx9RDMiF32zhbxi+q0mAO2w2FdDlzWTT3og==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.11", - "@angular/core": "19.2.11" + "@angular/common": "20.1.0", + "@angular/core": "20.1.0" } }, "node_modules/@angular/build": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.12.tgz", - "integrity": "sha512-G28ux1T5QDlWporwupWbcodBN3rcyHfK2Dh5M3UC5hj0GstpfEHcpBHxawZzIxhqPKy//tdVLlzORUgvAwnqbA==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.0.tgz", + "integrity": "sha512-Sl4rkq5PQIrbVNk8cXx2JQhQ156H4bXLvfAYpgXPHAfSfbIIzaV25LJIfTdWSEjMzBGdIX5E0Vpi0SGwcNS7Uw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.12", - "@babel/core": "7.26.10", - "@babel/helper-annotate-as-pure": "7.25.9", + "@angular-devkit/architect": "0.2001.0", + "@babel/core": "7.27.7", + "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.26.0", - "@inquirer/confirm": "5.1.6", - "@vitejs/plugin-basic-ssl": "1.2.0", - "beasties": "0.3.2", + "@inquirer/confirm": "5.1.13", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.4", "browserslist": "^4.23.0", - "esbuild": "0.25.4", - "fast-glob": "3.3.3", + "esbuild": "0.25.5", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", "magic-string": "0.30.17", "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "7.0.0", + "parse5-html-rewriting-stream": "7.1.0", "picomatch": "4.0.2", - "piscina": "4.8.0", - "rollup": "4.34.8", - "sass": "1.85.0", - "semver": "7.7.1", + "piscina": "5.1.2", + "rollup": "4.44.1", + "sass": "1.89.2", + "semver": "7.7.2", "source-map-support": "0.5.21", - "vite": "6.2.7", - "watchpack": "2.4.2" + "tinyglobby": "0.2.14", + "vite": "7.0.0", + "watchpack": "2.4.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.2.6" + "lmdb": "3.4.1" }, "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.12", + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.1.0", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "ng-packagr": "^20.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.5 <5.9" + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, @@ -561,26 +499,29 @@ }, "tailwindcss": { "optional": true + }, + "vitest": { + "optional": true } } }, "node_modules/@angular/build/node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -606,16 +547,16 @@ } }, "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", - "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.21.3" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^6.0.0 || ^7.0.0" } }, "node_modules/@angular/build/node_modules/ansi-escapes": { @@ -660,22 +601,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular/build/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@angular/build/node_modules/cli-truncate": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", @@ -731,9 +656,9 @@ } }, "node_modules/@angular/build/node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -785,52 +710,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@angular/build/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular/build/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular/build/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@angular/build/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -866,21 +745,24 @@ } }, "node_modules/@angular/build/node_modules/vite": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", - "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", + "integrity": "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" + "fdir": "^6.4.6", + "picomatch": "^4.0.2", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -889,14 +771,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -956,9 +838,9 @@ } }, "node_modules/@angular/build/node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "optional": true, @@ -967,62 +849,63 @@ "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/@angular/cdk": { - "version": "19.2.16", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.16.tgz", - "integrity": "sha512-67nbWqoiZIBc8nEaCn7GHd02bM5T9qAbJ5w+Zq4V19CL3oCtrCrS4CV3Lsoi5HETSmn4iZcYS/Dph8omCvNkew==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.1.0.tgz", + "integrity": "sha512-JhgbSOv7xZqWNZjuCh8A3A7pGv0mhtmGjHo36157LrxRO6R7x2yJJjxC5nQeroKZWhgN+X/jG/EJlzEvl9PxTw==", "license": "MIT", "dependencies": { "parse5": "^7.1.2", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.12.tgz", - "integrity": "sha512-cZkHpM16uh3VouHG1XdWSk0ZWisQRxMVADk5IJlM9jMcPqnFyJwD/UXCS+XTaW3POpNDwsmbh2UB9Xabdgo7rw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.0.tgz", + "integrity": "sha512-jZudpHlPVAvrywVZuhUkUr5K7ThW/6CPjT7qxZBSdOvu7cD49JPpDivCdlMh0kCBSHsJ0ZbLx35oi6zF8PegiA==", "devOptional": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.12", - "@angular-devkit/core": "19.2.12", - "@angular-devkit/schematics": "19.2.12", - "@inquirer/prompts": "7.3.2", - "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.2.12", + "@angular-devkit/architect": "0.2001.0", + "@angular-devkit/core": "20.1.0", + "@angular-devkit/schematics": "20.1.0", + "@inquirer/prompts": "7.6.0", + "@listr2/prompt-adapter-inquirer": "2.0.22", + "@modelcontextprotocol/sdk": "1.13.3", + "@schematics/angular": "20.1.0", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", - "listr2": "8.2.5", + "listr2": "8.3.3", "npm-package-arg": "12.0.2", "npm-pick-manifest": "10.0.0", - "pacote": "20.0.0", + "pacote": "21.0.0", "resolve": "1.22.10", - "semver": "7.7.1", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "3.25.75" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.12.tgz", - "integrity": "sha512-v5pdfZHZ8MTZozfpkhKoPFBpXQW+2GFbTfdyis8FBtevJWCbIsCR3xhodgI4jwzkSEAraN4oVtWvSytdNyBC6A==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.0.tgz", + "integrity": "sha512-i2t22bklvKsqdwmUtjXltRyxmJ+lJW8isrdc7XeN0N6VW/lDHSJqFlucT1+pO9+FxXJQyz3Hc1dpRd6G65mGyw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1030,11 +913,11 @@ "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "source-map": "0.7.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -1047,24 +930,6 @@ } } }, - "node_modules/@angular/cli/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@angular/cli/node_modules/ansi-escapes": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", @@ -1125,22 +990,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular/cli/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@angular/cli/node_modules/cli-truncate": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", @@ -1189,9 +1038,9 @@ } }, "node_modules/@angular/cli/node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1243,22 +1092,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@angular/cli/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@angular/cli/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -1275,46 +1108,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular/cli/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular/cli/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "devOptional": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@angular/cli/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -1368,60 +1161,64 @@ } }, "node_modules/@angular/common": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.11.tgz", - "integrity": "sha512-/ZnF2Nfp6S6TAu3VlvUAIp4NVd81WE1Q95wuwSSuoEx2aSyXzI+1myyKWSYe/jYCyGuppmocjTciEh8mAInmOw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.1.0.tgz", + "integrity": "sha512-RsHClHJux+4lXrHdGHVw22wekRbSjYtx6Xwjox2S+IRPP51CbX0KskAALZ9ZmtCttkYSFVtvr0S+SQrU2cu5WA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "19.2.11", + "@angular/core": "20.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.11.tgz", - "integrity": "sha512-/ZGFAEO2TyqkaE4neR8lGL9I2QeO2sRVFqulQv7Bu8zKTPStjcsFCwNkp+TNX8Oq/1rLcY9XWAOsUk1//AZd8Q==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.1.0.tgz", + "integrity": "sha512-sM8H3dJotIDDmI1u8qGuAn16XVfR7A4+/5s5cKLI/osnnIjafi5HHqAf76R5IlGoIv0ZHVQIYaJ/Qdvfyvdhfg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.11.tgz", - "integrity": "sha512-15aoOg+qj7Z3Uap1JKHMy51y12M09AOnseDBa0SYKidSx15XwZi8d01hv7sRaQJX/6Ie5cug9GiAbLKts6R33w==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.1.0.tgz", + "integrity": "sha512-ajbCmvYYFxeXRdKSfdHjp62MZ2lCMUS0UzswBDAbT9sPd/ThppbvLXLsMBj8SlwaXSSBeTAa1oSHEO1MeuVvGQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.28.0", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", - "yargs": "^17.2.1" + "yargs": "^18.0.0" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" + "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.11", - "typescript": ">=5.5 <5.9" + "@angular/compiler": "20.1.0", + "typescript": ">=5.8 <5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@angular/compiler-cli/node_modules/chokidar": { @@ -1455,64 +1252,73 @@ } }, "node_modules/@angular/core": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.11.tgz", - "integrity": "sha512-kmtJQB7B5F2V1JIzy1oBPS6WrRyedSYkuge+XoX1mCSFJDef8HRNd7GopnQ0Zaz0vOTGvCCkWvvaH/+7s2lmAQ==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.1.0.tgz", + "integrity": "sha512-/dJooZi+OAACkjWgGMPrOOGikdtlTJXwdeXPJTgZSUD5L8oQMbhZFG0XW/1Hldvsti87wPjZPz67ivB7zR86VA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { + "@angular/compiler": "20.1.0", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, "node_modules/@angular/forms": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.11.tgz", - "integrity": "sha512-ZH9ccuT6rTirNSbiMRtGRkRrj69a2/+BVaa/kEpUHjh41wDQXxhOlOfPZd/sfj04QiAzIpsYmVJrmoV7/LxPSw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.1.0.tgz", + "integrity": "sha512-NgQxowyyG2yiSOXxtQS1xK1vAQT+4GRoMFuzmS3uBshIifgCgFckSxJHQXhlQOInuv2NsZ1Q0HuCvao+yZfIow==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.11", - "@angular/core": "19.2.11", - "@angular/platform-browser": "19.2.11", + "@angular/common": "20.1.0", + "@angular/core": "20.1.0", + "@angular/platform-browser": "20.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.2.11.tgz", - "integrity": "sha512-dhfHlTOp6rephWjp+YFZq2iTradXE2OgcYG0eI+Qi+e/uzUfQBMPTjYMjbcH/agv4DaMtOfB6KqWnkbHO5CFlg==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-20.1.0.tgz", + "integrity": "sha512-qHZk5LI2uaDRk0QOIdg2AZqyij00XOgZb3yiP7C3fjv3YkyRjXvobTRCLieTq10vdMt9TuCwdOISFK7g1/1eEg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.11.tgz", - "integrity": "sha512-wAPJtgzmxBEpW31sa2eg9QssCHBZ52Zc9nm6azTflDlOAyfm9bzqec7y3wqy5sgVue/qID2gzHqmpS3Nx3o0xg==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.1.0.tgz", + "integrity": "sha512-l3+Ijq5SFxT0v10DbOyMc7NzGdbK76yot2i8pXyArlPSPmpWvbbjXbiBqzrv3TSTrksHBhG3mMvyhTmHQ1cQFA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "19.2.11", - "@angular/common": "19.2.11", - "@angular/core": "19.2.11" + "@angular/animations": "20.1.0", + "@angular/common": "20.1.0", + "@angular/core": "20.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1521,40 +1327,40 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.11.tgz", - "integrity": "sha512-1/0FmjSAvsK+A6gWLgEc60YMnWQchP9fP6y4sE1uQOThIgK+qLnLjZqZn7uOw8zMDBMtxB7SlepajnXftVXddw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.0.tgz", + "integrity": "sha512-s+Rm2akzYTE2UFdXZPvf02TxDCDskGdUxAxa/jmJbVuOpniuY0RlbnxIKDUD0qj3bYMUkbr7f2KJwHVldqJP6w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.11", - "@angular/compiler": "19.2.11", - "@angular/core": "19.2.11", - "@angular/platform-browser": "19.2.11" + "@angular/common": "20.1.0", + "@angular/compiler": "20.1.0", + "@angular/core": "20.1.0", + "@angular/platform-browser": "20.1.0" } }, "node_modules/@angular/pwa": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-19.2.12.tgz", - "integrity": "sha512-c2l/hQV1UJyHZj4EK3Wo5OBYC2RnH0ZXI36VBKU/0GTSecv8mW6gKS3SToM92EyhoY2+YqRP05fBjZALgJwP7A==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-20.1.0.tgz", + "integrity": "sha512-X11zbxlONAnNADMie9ISmFk0dMFO9u/0qN+fenYdwjZ+QtkZeFXy4gtsjFgym0gtsX2yuVxY4TiJ57R1QKa4MA==", "license": "MIT", "dependencies": { - "@angular-devkit/schematics": "19.2.12", - "@schematics/angular": "19.2.12", - "parse5-html-rewriting-stream": "7.0.0" + "@angular-devkit/schematics": "20.1.0", + "@schematics/angular": "20.1.0", + "parse5-html-rewriting-stream": "7.1.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/cli": "^19.2.12" + "@angular/cli": "^20.1.0" }, "peerDependenciesMeta": { "@angular/cli": { @@ -1563,27 +1369,27 @@ } }, "node_modules/@angular/router": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.11.tgz", - "integrity": "sha512-nBwMwRgQ3s1c1CPItPnTJTf81NDOQHvK41r2MIJGHa3H9LONlcbY07q/9p49fqt/xn/dgoOmQTtJ22b/nbIJAQ==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.1.0.tgz", + "integrity": "sha512-fuUX1+AhcVSDgSSx85o6VOtXKM3oXAza+44jQ+nJGf316P0xpLKA586DKRNPjS4sRsWM7otKuOOTXXc4AMUHpQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "19.2.11", - "@angular/core": "19.2.11", - "@angular/platform-browser": "19.2.11", + "@angular/common": "20.1.0", + "@angular/core": "20.1.0", + "@angular/platform-browser": "20.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "19.2.11", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-19.2.11.tgz", - "integrity": "sha512-ZM5iEERfRILYeQ9MvhDP0zV9kOl9o2Etmg/gtd05lhGFJeAxF5FqyNGxUIfpTYoP4nY3KLI7oL8S36zNqBhLdw==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-20.1.0.tgz", + "integrity": "sha512-ulJwc6L6QCYEjKNycsDHhzUneGqADFkdqeEBctXWym0adkngsjUUBzF4jCtT0KoCRHOcENfPLa1o1TaF0KkC7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1592,10 +1398,10 @@ "ngsw-config": "ngsw-config.js" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "19.2.11", + "@angular/core": "20.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1625,22 +1431,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1673,16 +1479,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -1690,13 +1496,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -1729,6 +1535,16 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -1744,15 +1560,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -1761,16 +1577,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", @@ -1815,27 +1621,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1844,22 +1650,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -1876,45 +1666,28 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1950,9 +1723,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -1967,9 +1740,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -1984,9 +1757,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -2001,9 +1774,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -2018,9 +1791,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -2035,9 +1808,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -2052,9 +1825,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -2069,9 +1842,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -2086,9 +1859,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -2103,9 +1876,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -2120,9 +1893,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -2137,9 +1910,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -2154,9 +1927,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -2171,9 +1944,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -2188,9 +1961,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -2205,9 +1978,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -2222,9 +1995,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -2239,9 +2012,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -2256,9 +2029,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -2273,9 +2046,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -2290,9 +2063,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -2307,9 +2080,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -2324,9 +2097,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -2341,9 +2114,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -2358,9 +2131,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -2375,15 +2148,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.6.tgz", - "integrity": "sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.9.tgz", + "integrity": "sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -2399,15 +2172,33 @@ } } }, + "node_modules/@inquirer/checkbox/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/confirm": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", - "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.13.tgz", + "integrity": "sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.7", - "@inquirer/type": "^3.0.4" + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7" }, "engines": { "node": ">=18" @@ -2421,15 +2212,33 @@ } } }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/core": { - "version": "10.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.11.tgz", - "integrity": "sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==", + "version": "10.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.14.tgz", + "integrity": "sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", @@ -2449,6 +2258,24 @@ } } }, + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -2463,14 +2290,14 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.11.tgz", - "integrity": "sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.14.tgz", + "integrity": "sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7", "external-editor": "^3.1.0" }, "engines": { @@ -2485,15 +2312,33 @@ } } }, + "node_modules/@inquirer/editor/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/expand": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.13.tgz", - "integrity": "sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.16.tgz", + "integrity": "sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2508,10 +2353,28 @@ } } }, + "node_modules/@inquirer/expand/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", "devOptional": true, "license": "MIT", "engines": { @@ -2519,14 +2382,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.10.tgz", - "integrity": "sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.0.tgz", + "integrity": "sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6" + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7" }, "engines": { "node": ">=18" @@ -2540,15 +2403,33 @@ } } }, + "node_modules/@inquirer/input/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/number": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.13.tgz", - "integrity": "sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.16.tgz", + "integrity": "sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6" + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7" }, "engines": { "node": ">=18" @@ -2562,15 +2443,33 @@ } } }, + "node_modules/@inquirer/number/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/password": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.13.tgz", - "integrity": "sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.16.tgz", + "integrity": "sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2" }, "engines": { @@ -2585,23 +2484,41 @@ } } }, + "node_modules/@inquirer/password/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.6.0.tgz", + "integrity": "sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" + "@inquirer/checkbox": "^4.1.9", + "@inquirer/confirm": "^5.1.13", + "@inquirer/editor": "^4.2.14", + "@inquirer/expand": "^4.0.16", + "@inquirer/input": "^4.2.0", + "@inquirer/number": "^3.0.16", + "@inquirer/password": "^4.0.16", + "@inquirer/rawlist": "^4.1.4", + "@inquirer/search": "^3.0.16", + "@inquirer/select": "^4.2.4" }, "engines": { "node": ">=18" @@ -2616,14 +2533,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.1.tgz", - "integrity": "sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.4.tgz", + "integrity": "sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/type": "^3.0.7", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2638,16 +2555,34 @@ } } }, + "node_modules/@inquirer/rawlist/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/search": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.13.tgz", - "integrity": "sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.16.tgz", + "integrity": "sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2662,16 +2597,34 @@ } } }, + "node_modules/@inquirer/search/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.1.tgz", - "integrity": "sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.4.tgz", + "integrity": "sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==", "devOptional": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", + "@inquirer/core": "^10.1.14", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -2687,11 +2640,29 @@ } } }, + "node_modules/@inquirer/select/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/type": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2832,18 +2803,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2856,29 +2823,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -2886,9 +2830,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2897,9 +2841,9 @@ } }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", - "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz", + "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2936,9 +2880,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", - "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.1.tgz", + "integrity": "sha512-kKeP5PaY3bFrrF6GY5aDd96iuh1eoS+5CHJ+7hIP629KIEwzGNwbIzBmEX9TAhRJOivSRDTHCIsbu//+NsYKkg==", "cpu": [ "arm64" ], @@ -2950,9 +2894,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", - "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.1.tgz", + "integrity": "sha512-9CMB3seTyHs3EOVWdKiB8IIEDBJ3Gq00Tqyi0V7DS3HL90BjM/AkbZGuhzXwPrfeFazR24SKaRrUQF74f+CmWw==", "cpu": [ "x64" ], @@ -2964,9 +2908,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", - "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.1.tgz", + "integrity": "sha512-1Mi69vU0akHgCI7tF6YbimPaNEKJiBm/p5A+aM8egr0joj27cQmCCOm2mZQ+Ht2BqmCfZaIgQnMg4gFYNMlpCA==", "cpu": [ "arm" ], @@ -2978,9 +2922,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", - "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.1.tgz", + "integrity": "sha512-d0vuXOdoKjHHJYZ/CRWopnkOiUpev+bgBBW+1tXtWsYWUj8uxl9ZmTBEmsL5mjUlpQDrlYiJSrhOU1hg5QWBSw==", "cpu": [ "arm64" ], @@ -2992,9 +2936,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", - "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.1.tgz", + "integrity": "sha512-00RbEpvfnyPodlICiGFuiOmyvWaL9nzCRSqZz82BVFsGTiSQnnF0gpD1C8tO6OvtptELbtRuM7BS9f97LcowZw==", "cpu": [ "x64" ], @@ -3005,10 +2949,24 @@ "linux" ] }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.1.tgz", + "integrity": "sha512-4h8tm3i1ODf+28UyqQZLP7c2jmRM26AyEEyYp994B4GiBdGvGAsYUu3oiHANYK9xFpvLuFzyGeqFm1kdNC0D1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", - "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.1.tgz", + "integrity": "sha512-HqqKIhTbq6piJhkJpTTf3w1m/CgrmwXRAL9R9j7Ru5xdZSeO7Mg4AWiBC9B00uXR+LvVZKtUyRMVZfhmIZztmQ==", "cpu": [ "x64" ], @@ -3020,9 +2978,9 @@ ] }, "node_modules/@maskito/angular": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-3.9.0.tgz", - "integrity": "sha512-vNKEa1Rc2xmtOEba75I4SrjFNE9oTPQemthvfTlkKDLYQYrKmlWBon1C5KKsMUv6zDLXnVhh0piT66fpNlJuUw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-3.10.0.tgz", + "integrity": "sha512-5WwzV12MLJoCUD4ROEafUmyrElzGesWI4BqAFkh9jzzQRtrF1QNomK9tOVBXmXUBWb5sohiiNViAvRCtGdyXiA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -3031,35 +2989,35 @@ "peerDependencies": { "@angular/core": ">=16.0.0", "@angular/forms": ">=16.0.0", - "@maskito/core": "^3.9.0" + "@maskito/core": "^3.10.0" } }, "node_modules/@maskito/core": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-3.9.0.tgz", - "integrity": "sha512-OgzzgzJTXFZH79mqyHFVUZ5/bUhSW147+JzYVX+DdmQ5zc+mxmFQqsUS5ffVxd2C7/bnEmC7+savYbcae2IhBw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-3.10.0.tgz", + "integrity": "sha512-T3PaMb4ipMmN9hkaAj8uyN0Mqj8XcXMZ1GRZ2WfZePRPHoi/L3tEEEh7vjg1m4TpI3lReRkNQs9yaPZV9ce8HA==", "license": "Apache-2.0", "peer": true }, "node_modules/@maskito/kit": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-3.9.0.tgz", - "integrity": "sha512-CD7TQ7WUMtZ8jkhOsislbqht1gMuNHVQsLJG9tXcGvZbegkgJ6wdkggkol1y1/0F5eh/fT+RzzKD9dVjSQon2g==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-3.10.0.tgz", + "integrity": "sha512-b/aN200U0w/tNfLPRiXJaHGZRNVimq7UnhjKYoLXejX1+pKKhQ6S/dVg9k0+30IXdmUJ5Uk29y5X3UBc5d1w8A==", "license": "Apache-2.0", "peer": true, "peerDependencies": { - "@maskito/core": "^3.9.0" + "@maskito/core": "^3.10.0" } }, "node_modules/@maskito/phone": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@maskito/phone/-/phone-3.9.0.tgz", - "integrity": "sha512-EUCOmOscoQM+vnJwOAiBXVpZVVYkHc7rhnqLqfkslXsZCg5VLNNpzAb8SuFQMxYJYM2NnMawErvL7CjOdVDmvQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@maskito/phone/-/phone-3.10.0.tgz", + "integrity": "sha512-FrjC0l/SyLvSH7w+MG9v3lVT3OnD098dVCBR8HZlL6l5oI1Y69LTEBgRrNWIso841V8AEmj1ryJwrjHWX/zF5Q==", "license": "Apache-2.0", "peer": true, "peerDependencies": { - "@maskito/core": "^3.9.0", - "@maskito/kit": "^3.9.0", + "@maskito/core": "^3.10.0", + "@maskito/kit": "^3.10.0", "libphonenumber-js": ">=1.0.0" } }, @@ -3076,6 +3034,54 @@ "rxjs": ">=6.0.0" } }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.13.3.tgz", + "integrity": "sha512-bGwA78F/U5G2jrnsdRkPY3IwIwZeWUEfb5o764b79lb0rJmMT76TLwKhdNZOWakOQtedYefwIR4emisEMvInKA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -3161,9 +3167,9 @@ ] }, "node_modules/@napi-rs/nice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", - "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.4.tgz", + "integrity": "sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==", "dev": true, "license": "MIT", "optional": true, @@ -3175,28 +3181,28 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/nice-android-arm-eabi": "1.0.1", - "@napi-rs/nice-android-arm64": "1.0.1", - "@napi-rs/nice-darwin-arm64": "1.0.1", - "@napi-rs/nice-darwin-x64": "1.0.1", - "@napi-rs/nice-freebsd-x64": "1.0.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", - "@napi-rs/nice-linux-arm64-gnu": "1.0.1", - "@napi-rs/nice-linux-arm64-musl": "1.0.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", - "@napi-rs/nice-linux-s390x-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-gnu": "1.0.1", - "@napi-rs/nice-linux-x64-musl": "1.0.1", - "@napi-rs/nice-win32-arm64-msvc": "1.0.1", - "@napi-rs/nice-win32-ia32-msvc": "1.0.1", - "@napi-rs/nice-win32-x64-msvc": "1.0.1" + "@napi-rs/nice-android-arm-eabi": "1.0.4", + "@napi-rs/nice-android-arm64": "1.0.4", + "@napi-rs/nice-darwin-arm64": "1.0.4", + "@napi-rs/nice-darwin-x64": "1.0.4", + "@napi-rs/nice-freebsd-x64": "1.0.4", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.4", + "@napi-rs/nice-linux-arm64-gnu": "1.0.4", + "@napi-rs/nice-linux-arm64-musl": "1.0.4", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.4", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.4", + "@napi-rs/nice-linux-s390x-gnu": "1.0.4", + "@napi-rs/nice-linux-x64-gnu": "1.0.4", + "@napi-rs/nice-linux-x64-musl": "1.0.4", + "@napi-rs/nice-win32-arm64-msvc": "1.0.4", + "@napi-rs/nice-win32-ia32-msvc": "1.0.4", + "@napi-rs/nice-win32-x64-msvc": "1.0.4" } }, "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", - "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.4.tgz", + "integrity": "sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==", "cpu": [ "arm" ], @@ -3211,9 +3217,9 @@ } }, "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", - "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.4.tgz", + "integrity": "sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==", "cpu": [ "arm64" ], @@ -3228,9 +3234,9 @@ } }, "node_modules/@napi-rs/nice-darwin-arm64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", - "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==", "cpu": [ "arm64" ], @@ -3245,9 +3251,9 @@ } }, "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", - "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.4.tgz", + "integrity": "sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==", "cpu": [ "x64" ], @@ -3262,9 +3268,9 @@ } }, "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", - "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.4.tgz", + "integrity": "sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==", "cpu": [ "x64" ], @@ -3279,9 +3285,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", - "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.4.tgz", + "integrity": "sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==", "cpu": [ "arm" ], @@ -3296,9 +3302,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", - "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.4.tgz", + "integrity": "sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==", "cpu": [ "arm64" ], @@ -3313,9 +3319,9 @@ } }, "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", - "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.4.tgz", + "integrity": "sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==", "cpu": [ "arm64" ], @@ -3330,9 +3336,9 @@ } }, "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", - "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.4.tgz", + "integrity": "sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==", "cpu": [ "ppc64" ], @@ -3347,9 +3353,9 @@ } }, "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", - "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.4.tgz", + "integrity": "sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==", "cpu": [ "riscv64" ], @@ -3364,9 +3370,9 @@ } }, "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", - "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.4.tgz", + "integrity": "sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==", "cpu": [ "s390x" ], @@ -3381,9 +3387,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", - "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.4.tgz", + "integrity": "sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==", "cpu": [ "x64" ], @@ -3398,9 +3404,9 @@ } }, "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", - "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.4.tgz", + "integrity": "sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==", "cpu": [ "x64" ], @@ -3415,9 +3421,9 @@ } }, "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", - "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.4.tgz", + "integrity": "sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==", "cpu": [ "arm64" ], @@ -3432,9 +3438,9 @@ } }, "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", - "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.4.tgz", + "integrity": "sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==", "cpu": [ "ia32" ], @@ -3449,9 +3455,9 @@ } }, "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", - "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.4.tgz", + "integrity": "sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==", "cpu": [ "x64" ], @@ -3578,8 +3584,8 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3592,8 +3598,8 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "devOptional": true, "license": "MIT", + "optional": true, "engines": { "node": ">= 8" } @@ -3602,8 +3608,8 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3730,9 +3736,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz", - "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "devOptional": true, "license": "ISC", "dependencies": { @@ -4206,9 +4212,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -4229,16 +4235,16 @@ } }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -4250,9 +4256,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -4264,9 +4270,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -4278,9 +4284,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -4292,9 +4298,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -4306,9 +4312,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -4320,9 +4326,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -4334,9 +4340,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -4348,9 +4354,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -4362,9 +4368,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -4376,9 +4382,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -4390,9 +4396,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -4404,9 +4410,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -4418,9 +4438,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -4432,9 +4452,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -4446,9 +4466,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -4460,9 +4480,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -4474,9 +4494,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -4488,9 +4508,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -4502,13 +4522,13 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.40.2.tgz", - "integrity": "sha512-rl60ew3oh38IrtETrAf0A0qTByOsHSi7Sx1BZH4+vrIzL/DqxFx+FgTUFVViL3ZQqs95gIOm9mZQ1fUOopnkmA==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.44.2.tgz", + "integrity": "sha512-bKl9rKDle9BbO/Tb5RFU4PDYtRcxNdllUL2cC6vixXkxV0U5XOIoi11KUNVoKyB2RLRSk3BHouMfw9fJdMsJkg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -4522,43 +4542,43 @@ } }, "node_modules/@rollup/wasm-node/node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.12.tgz", - "integrity": "sha512-6S6tclFctLrjMvhpi8eVvswIpXqlybRpZLCTWyVeWIC6PHYLEyFmFoOhuhcSmOdtnwudvzOt6xWnWEVb3qXZbQ==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.0.tgz", + "integrity": "sha512-sAEwygjY/j0tvo+EDFUAc54Hfp++K43ISe1/fdCU/M3Pseuf7oPPIm6VxxTrRc6fu4Lp5DBaD/PBkXNt/FqZpg==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.12", - "@angular-devkit/schematics": "19.2.12", + "@angular-devkit/core": "20.1.0", + "@angular-devkit/schematics": "20.1.0", "jsonc-parser": "3.3.1" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "19.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.12.tgz", - "integrity": "sha512-v5pdfZHZ8MTZozfpkhKoPFBpXQW+2GFbTfdyis8FBtevJWCbIsCR3xhodgI4jwzkSEAraN4oVtWvSytdNyBC6A==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.0.tgz", + "integrity": "sha512-i2t22bklvKsqdwmUtjXltRyxmJ+lJW8isrdc7XeN0N6VW/lDHSJqFlucT1+pO9+FxXJQyz3Hc1dpRd6G65mGyw==", "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "source-map": "0.7.4" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -4571,23 +4591,6 @@ } } }, - "node_modules/@schematics/angular/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@schematics/angular/node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -4620,15 +4623,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@sigstore/bundle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", @@ -4653,9 +4647,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.1.tgz", - "integrity": "sha512-7MJXQhIm7dWF9zo7rRtMYh8d2gSnc3+JddeQOTIg6gUN7FjcuckZ9EwGq+ReeQtbbl3Tbf5YqRrWxA1DMfIn+w==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -4719,9 +4713,9 @@ "link": true }, "node_modules/@taiga-ui/addon-charts": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-4.41.0.tgz", - "integrity": "sha512-HksmSqKCQm2BXP5jhLXdFouZNru+0LFH0m5F22zbQ/6EG5uCttIztY+jcorcKqZzl29PEM8dFxg6EZe2JHYtlQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-4.44.0.tgz", + "integrity": "sha512-NiwY1P1NkDEOiSWgo3EGmXBWFmltmKA+Xkbu7fHnH7+8oenYLWd/orNvQEU5ey6qiSGj6wVr7kyeQMP8aau3NQ==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4730,15 +4724,15 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/common": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-4.41.0.tgz", - "integrity": "sha512-f30Yidpx+J37E2/Iz+FKq9/IPL0uBb/pQXxseTKGSkFm3wiMvOVAHGdWsGrFts0aKbLG5Jv4RkfXp3HhXhy4cw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-4.44.0.tgz", + "integrity": "sha512-hpYDis6cFDewm1PR6CTXDoOvGmPbqJwcrl1wOyAfmGWCY4rle9+Jj1P1fW4tDMkOY/TVhQ3GIuSUYn/UZN9v4A==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4747,22 +4741,22 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@angular/forms": ">=16.0.0", - "@maskito/angular": "^3.9.0", - "@maskito/core": "^3.9.0", - "@maskito/kit": "^3.9.0", + "@maskito/angular": "^3.10.0", + "@maskito/core": "^3.10.0", + "@maskito/kit": "^3.10.0", "@ng-web-apis/common": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/i18n": "^4.41.0", - "@taiga-ui/kit": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/i18n": "^4.44.0", + "@taiga-ui/kit": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-4.41.0.tgz", - "integrity": "sha512-BgIMCvSFE+qezVvRJhmtPsuYUkiFa5mtuUTNTVE63dz+JqXciXcT3mbOFZpjEjTB8QWsPgYVZL6DCNnmuk0sIg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-4.44.0.tgz", + "integrity": "sha512-NTV6DpyrI6Pv9FuXiYwOsOljyKkrKX+HJ35SRev1hrxzw9ECKrnOA1Q0aUCn09PgWIUY7rV+OXUZJ/w/Hmlm5Q==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4772,18 +4766,18 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/common": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/kit": "^4.41.0", - "@taiga-ui/layout": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/kit": "^4.44.0", + "@taiga-ui/layout": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/addon-table": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-4.41.0.tgz", - "integrity": "sha512-kAlWqsBx6RGx2eeSON9bihyfSxu3MWtMAjFKW4vfzVrIEegtNODJmGJRc8dQYVwhHyId/qJil8aaWnJpXjCclw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-table/-/addon-table-4.44.0.tgz", + "integrity": "sha512-DmWZCPouoF21gWOpABepncWdg8W4Enk2z8FTiwGMsN0nGXmQ1SnU2QwEHCLumW2XNiNP8EHUpU42MZf9CuwIeA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4792,18 +4786,18 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@ng-web-apis/intersection-observer": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/i18n": "^4.41.0", - "@taiga-ui/kit": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/i18n": "^4.44.0", + "@taiga-ui/kit": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-4.41.0.tgz", - "integrity": "sha512-Oe6MQFut/bhnWK3U9J0u4iv+sGY8zXEXuyHScbMQhEe2a3g5XJjXXaBOngnp4jq2687PIQBtZcYvrM5/wcjXEw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-4.44.0.tgz", + "integrity": "sha512-4x0ISp+0oYhTC2E9SN2yDhA+rFC707m/rL4lf7RSTIbdefMyP3TdmsN2Emuhc0WSXcNs0OgYYEOaIx9jr7OqDw==", "license": "Apache-2.0", "dependencies": { "tslib": "2.8.1" @@ -4832,9 +4826,9 @@ } }, "node_modules/@taiga-ui/core": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-4.41.0.tgz", - "integrity": "sha512-ArND7zOBKlbGKdVrrsCWi3oZCkwmPCa3mS2wVD4JV0cq9N2KSw3KPp5mg77ZIEabIY9DM3ekXU8FDMyuhE3O2g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-4.44.0.tgz", + "integrity": "sha512-KQPD63ZoFJKBZS/m1XkyTXDzUH3IYDcgNE3CVeZ9bmEkRwS0x7/fpFFdbr06sR/ej/eEzgop3LKOk4JHoQgFCA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4848,9 +4842,9 @@ "@angular/router": ">=16.0.0", "@ng-web-apis/common": "^4.12.0", "@ng-web-apis/mutation-observer": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", "@taiga-ui/event-plugins": "^4.6.0", - "@taiga-ui/i18n": "^4.41.0", + "@taiga-ui/i18n": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } @@ -4885,9 +4879,9 @@ } }, "node_modules/@taiga-ui/experimental": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-4.41.0.tgz", - "integrity": "sha512-X8mxCk2FN/sJpfB7bBeub+B2IMhOAogoh8fx/HDNspZfmKDpxLPYxJ+TosCrOyIA3nDtYpt3A2pmZ1cnxb11oQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-4.44.0.tgz", + "integrity": "sha512-ef/fSFjSOTwgsqRoWlwlXQkQrPcbuAlmEyGj4gMhdZC99HvKuYzUdihH4eZX4nx8fDyBOOZbM7QnW7ETQbKWHg==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4895,18 +4889,18 @@ "peerDependencies": { "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", - "@taiga-ui/addon-commerce": "^4.41.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/kit": "^4.41.0", + "@taiga-ui/addon-commerce": "^4.44.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/kit": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-4.41.0.tgz", - "integrity": "sha512-wvqOBf56eta1Q3RgRwKwmkj/HzvH4BVqOviN7QA4wN4q1e4BEh4N2k30CYuLr90Eoxo2+5fDaKGzE91INenbGA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-4.44.0.tgz", + "integrity": "sha512-SnRQQPKI1k3Tkn17yByuB1ix4Nj9v70RLxVM84GX3okgQk2NIAj9hn8WXd36ljZUlcy7TqtJ+xlii0FqQVv7Sw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -4919,18 +4913,18 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-4.41.0.tgz", - "integrity": "sha512-Zc9ufZiAhTfnly8eF1UW0138y1UnZfPZPhmNEd0BRObM6R+aK9EeYcIPE54SMNVzBLB4AtwmMJ/fCOU0VJbv3g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-4.44.0.tgz", + "integrity": "sha512-KiIxxkG59kJDFV/g6e1YAbBff7y7EynNbmKY6sGo+CLcAQ52Y7Cz6i9us6ySf8fbOQRm4hKDXL3M10TKDeS+cg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" } }, "node_modules/@taiga-ui/kit": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-4.41.0.tgz", - "integrity": "sha512-v27dmJtp05JQgwZhqRglc3iD7CYzW5R6ncBjmJKke556VlL1D1ruQSc2OYL4nUAt/dwaYYkpqhfBWwTbhehC6Q==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-4.44.0.tgz", + "integrity": "sha512-X8JNEE/WR7ftEx/bmibe2JTPOwge/o1VYHk1Z2vDx53e8JWWG+lLce2xx7NYexFPqP+4Ey2bPxn1Vx+rgGZYgA==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4940,25 +4934,25 @@ "@angular/core": ">=16.0.0", "@angular/forms": ">=16.0.0", "@angular/router": ">=16.0.0", - "@maskito/angular": "^3.9.0", - "@maskito/core": "^3.9.0", - "@maskito/kit": "^3.9.0", - "@maskito/phone": "^3.9.0", + "@maskito/angular": "^3.10.0", + "@maskito/core": "^3.10.0", + "@maskito/kit": "^3.10.0", + "@maskito/phone": "^3.10.0", "@ng-web-apis/common": "^4.12.0", "@ng-web-apis/intersection-observer": "^4.12.0", "@ng-web-apis/mutation-observer": "^4.12.0", "@ng-web-apis/resize-observer": "^4.12.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/i18n": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/i18n": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/layout": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-4.41.0.tgz", - "integrity": "sha512-czIU2suGUL6HqDjCKAYxSpyhOnVAtJLhhxt8MajS9mAuov1WzpBC85X3rqZsfc2x3j1XbCEuXyW43ns5994ilQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/layout/-/layout-4.44.0.tgz", + "integrity": "sha512-aidH7MgEAcz0nxauc5tm+0a5Z7PmG9bsSq+tsfkiOd6mV4BOf5xyYlpDyQn9gUBK8UYSxtMojp9Zs/2jH57gmw==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -4966,17 +4960,17 @@ "peerDependencies": { "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", - "@taiga-ui/cdk": "^4.41.0", - "@taiga-ui/core": "^4.41.0", - "@taiga-ui/kit": "^4.41.0", + "@taiga-ui/cdk": "^4.44.0", + "@taiga-ui/core": "^4.44.0", + "@taiga-ui/kit": "^4.44.0", "@taiga-ui/polymorpheus": "^4.9.0", "rxjs": ">=7.0.0" } }, "node_modules/@taiga-ui/legacy": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/legacy/-/legacy-4.41.0.tgz", - "integrity": "sha512-ezxG3iCnvs435f5pG5BvGhGAAScTr3bUOgCdKhEV7e/8MZUbZ4eUTi5RoBXzjBBBO87e1x7bJw8EGlUh2QbR4g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/legacy/-/legacy-4.44.0.tgz", + "integrity": "sha512-vVXEj2BkKAS3ShOQ8OV6+j2yGFcRqtXMxZEU3kX8iM4fWRYS3C1669LLK7f0VzZd1miNex79SZx3NJM4Rvx7Kg==", "license": "Apache-2.0", "dependencies": { "tslib": ">=2.8.1" @@ -5228,6 +5222,20 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -5280,6 +5288,23 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -5481,9 +5506,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", - "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", + "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5514,39 +5539,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "devOptional": true, "license": "MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/boolbase": { @@ -5669,6 +5680,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cacache": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", @@ -5758,7 +5779,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5772,7 +5793,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5845,6 +5866,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -5921,15 +5943,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -6026,47 +6051,105 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "devOptional": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "devOptional": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/code-block-writer": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", @@ -6109,12 +6192,12 @@ "node": ">=16" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true, - "license": "MIT" + "license": "ISC" }, "node_modules/compare-versions": { "version": "3.6.0", @@ -6130,6 +6213,29 @@ "devOptional": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -6137,6 +6243,26 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/copy-anything": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", @@ -6161,6 +6287,20 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -6257,9 +6397,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6287,9 +6427,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6352,18 +6492,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -6377,6 +6505,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dependency-graph": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", @@ -6496,7 +6634,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -6514,6 +6652,13 @@ "devOptional": true, "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "devOptional": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.96", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.96.tgz", @@ -6527,6 +6672,16 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -6538,20 +6693,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -6619,7 +6760,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6629,7 +6770,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6639,7 +6780,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -6655,9 +6796,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6668,31 +6809,31 @@ "node": ">=18" }, "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" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -6705,6 +6846,13 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "devOptional": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -6736,6 +6884,16 @@ "dev": true, "license": "MIT" }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -6743,6 +6901,29 @@ "dev": true, "license": "MIT" }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -6774,6 +6955,65 @@ "devOptional": true, "license": "Apache-2.0" }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6789,6 +7029,19 @@ "node": ">=4" } }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6799,8 +7052,8 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6818,6 +7071,13 @@ "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", "license": "MIT" }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/fast-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", @@ -6838,16 +7098,16 @@ "version": "1.19.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -6872,6 +7132,41 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-directory": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz", + "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6885,6 +7180,19 @@ "node": ">=8" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-versions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", @@ -6952,6 +7260,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -7028,7 +7356,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -7041,7 +7368,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -7066,7 +7393,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -7114,8 +7441,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -7146,21 +7473,11 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7180,6 +7497,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7189,7 +7507,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7289,9 +7607,9 @@ } }, "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7308,6 +7626,33 @@ "devOptional": true, "license": "BSD-2-Clause" }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -7522,13 +7867,13 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "devOptional": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -7598,9 +7943,9 @@ } }, "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", "dev": true, "license": "MIT" }, @@ -7706,58 +8051,6 @@ } } }, - "node_modules/inquirer/node_modules/@inquirer/confirm": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", - "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.11", - "@inquirer/type": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/inquirer/node_modules/@inquirer/prompts": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz", - "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.6", - "@inquirer/confirm": "^5.1.10", - "@inquirer/editor": "^4.2.11", - "@inquirer/expand": "^4.0.13", - "@inquirer/input": "^4.1.10", - "@inquirer/number": "^3.0.13", - "@inquirer/password": "^4.0.13", - "@inquirer/rawlist": "^4.1.1", - "@inquirer/search": "^3.0.13", - "@inquirer/select": "^4.2.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -7772,6 +8065,16 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7829,8 +8132,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -7852,8 +8155,8 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7881,12 +8184,15 @@ } }, "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -7899,6 +8205,13 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -7913,12 +8226,12 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7997,18 +8310,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -8103,9 +8404,9 @@ "license": "MIT" }, "node_modules/less": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", - "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", + "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8117,7 +8418,7 @@ "lessc": "bin/lessc" }, "engines": { - "node": ">=6" + "node": ">=14" }, "optionalDependencies": { "errno": "^0.1.1", @@ -8400,9 +8701,9 @@ } }, "node_modules/lmdb": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", - "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.1.tgz", + "integrity": "sha512-hoG9RIv42kdGJiieyElgWcKCTaw5S6Jqwyd1gLSVdsJ3+8MVm8e4yLronThiRJI9DazFAAs9xfB9nWeMQ2DWKA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8418,12 +8719,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "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" + "@lmdb/lmdb-darwin-arm64": "3.4.1", + "@lmdb/lmdb-darwin-x64": "3.4.1", + "@lmdb/lmdb-linux-arm": "3.4.1", + "@lmdb/lmdb-linux-arm64": "3.4.1", + "@lmdb/lmdb-linux-x64": "3.4.1", + "@lmdb/lmdb-win32-arm64": "3.4.1", + "@lmdb/lmdb-win32-x64": "3.4.1" } }, "node_modules/locate-path": { @@ -8445,16 +8747,40 @@ "license": "MIT" }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8759,7 +9085,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8776,6 +9102,29 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8787,8 +9136,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "devOptional": true, "license": "MIT", + "optional": true, "engines": { "node": ">= 8" } @@ -8797,8 +9146,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8811,8 +9160,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, "license": "MIT", + "optional": true, "engines": { "node": ">=8.6" }, @@ -8835,6 +9184,29 @@ "node": ">=16" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -8852,7 +9224,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -9077,9 +9448,9 @@ "license": "MIT" }, "node_modules/msgpackr": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz", + "integrity": "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==", "dev": true, "license": "MIT", "optional": true, @@ -9174,9 +9545,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -9210,20 +9581,6 @@ "node": ">= 4.4.x" } }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -9253,47 +9610,48 @@ } }, "node_modules/ng-packagr": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.2.tgz", - "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-20.1.0.tgz", + "integrity": "sha512-objHk39HWnSSv54KD0Ct4A02rug6HiqbmXo1KJW39npzuVc37QWfiZy94afltH1zIx+mQqollmGaCmwibmagvQ==", "dev": true, "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.3.0", "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", "ajv": "^8.17.1", "ansi-colors": "^4.1.3", "browserslist": "^4.22.1", "chokidar": "^4.0.1", - "commander": "^13.0.0", - "convert-source-map": "^2.0.0", + "commander": "^14.0.0", "dependency-graph": "^1.0.0", "esbuild": "^0.25.0", - "fast-glob": "^3.3.2", - "find-cache-dir": "^3.3.2", + "find-cache-directory": "^6.0.0", "injection-js": "^2.4.0", "jsonc-parser": "^3.3.1", "less": "^4.2.0", - "ora": "^5.1.0", - "piscina": "^4.7.0", + "ora": "^8.2.0", + "piscina": "^5.0.0", "postcss": "^8.4.47", + "rollup-plugin-dts": "^6.2.0", "rxjs": "^7.8.1", - "sass": "^1.81.0" + "sass": "^1.81.0", + "tinyglobby": "^0.2.12" }, "bin": { - "ng-packagr": "cli/main.js" + "ng-packagr": "src/cli/main.js" }, "engines": { - "node": "^18.19.1 || >=20.11.1" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "optionalDependencies": { "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^20.0.0 || ^20.1.0-next.0 || ^20.2.0-next.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.5 <5.9" + "typescript": ">=5.8 <5.9" }, "peerDependenciesMeta": { "tailwindcss": { @@ -9318,67 +9676,13 @@ } }, "node_modules/ng-packagr/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - } - }, - "node_modules/ng-packagr/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ng-packagr/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/ng-packagr/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ng-packagr/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=20" } }, "node_modules/ng-packagr/node_modules/readdirp": { @@ -9395,28 +9699,18 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/ng-packagr/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/ng-qrcode": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-19.0.1.tgz", - "integrity": "sha512-8m4dqxSY7OSxJA7X0BEC7zJVLZ1QRw4ez5m440J7yq3HA8ixIa/hvQUjQLXJjbGUl33bjR9HNUPd9ZKxBmxnyA==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-20.0.0.tgz", + "integrity": "sha512-uAUVn9UXdTOY4IjB8+JtXfNWSIkpK7e9jgD8MPrzSftKA4KJZV6sX5VuJHKpTOFMM5SOVBSlO21U844OVjbXWA==", "license": "MIT", "dependencies": { "qrcode": "^1.5.3", "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/common": ">=19 <20", - "@angular/core": ">=19 <20" + "@angular/common": ">=20 <21", + "@angular/core": ">=20 <21" } }, "node_modules/node-addon-api": { @@ -9748,16 +10042,16 @@ } }, "node_modules/npm-packlist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", - "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz", + "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==", "devOptional": true, "license": "ISC", "dependencies": { "ignore-walk": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { @@ -9838,6 +10132,16 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -9851,7 +10155,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9860,11 +10164,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -9926,32 +10243,94 @@ } }, "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/ordered-binary": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", - "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", "dev": true, "license": "MIT", "optional": true @@ -10023,9 +10402,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz", - "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", "devOptional": true, "license": "ISC", "dependencies": { @@ -10038,7 +10417,7 @@ "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", - "npm-packlist": "^9.0.0", + "npm-packlist": "^10.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", @@ -10051,7 +10430,7 @@ "pacote": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/pako": { @@ -10122,12 +10501,12 @@ } }, "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", + "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", "license": "MIT", "dependencies": { - "entities": "^4.3.0", + "entities": "^6.0.0", "parse5": "^7.0.0", "parse5-sax-parser": "^7.0.0" }, @@ -10136,9 +10515,9 @@ } }, "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -10171,6 +10550,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/patch-db-client": { "resolved": "../patch-db/client", "link": true @@ -10242,6 +10631,16 @@ "devOptional": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -10312,15 +10711,44 @@ } }, "node_modules/piscina": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", - "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.2.tgz", + "integrity": "sha512-9cE/BTA/xhDiyNUEj6EKWLEQC17fh/24ydYzQwcA7QdYh75K6kzL2GHvxDF5i9rFGtUaaKk7/u4xp07qiKXccQ==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20.x" + }, "optionalDependencies": { "@napi-rs/nice": "^1.0.1" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -10355,9 +10783,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -10375,7 +10803,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -10439,6 +10867,20 @@ "node": ">=10" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10447,6 +10889,16 @@ "license": "MIT", "optional": true }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -10520,7 +10972,7 @@ "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -10536,7 +10988,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "devOptional": true, "funding": [ { "type": "github", @@ -10551,7 +11002,34 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/readable-stream": { "version": "3.6.2", @@ -10655,42 +11133,48 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -10705,8 +11189,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "devOptional": true, "license": "MIT", + "optional": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10817,13 +11301,13 @@ } }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -10833,35 +11317,76 @@ "npm": ">=8.0.0" }, "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", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-dts": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.1.tgz", + "integrity": "sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.26.2" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" + } + }, "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -10889,7 +11414,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "devOptional": true, "funding": [ { "type": "github", @@ -10905,6 +11429,7 @@ } ], "license": "MIT", + "optional": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -10946,9 +11471,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "dev": true, "license": "MIT", "dependencies": { @@ -11012,9 +11537,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "devOptional": true, "license": "ISC", "bin": { @@ -11044,12 +11569,58 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "devOptional": true, + "license": "ISC" + }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -11090,7 +11661,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11110,7 +11681,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11127,7 +11698,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11146,7 +11717,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -11166,6 +11737,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/sigstore": { @@ -11228,9 +11800,9 @@ } }, "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11353,6 +11925,28 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11464,6 +12058,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -11485,16 +12080,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -11583,40 +12168,10 @@ "devOptional": true, "license": "ISC" }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11656,6 +12211,16 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-matches": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-6.3.2.tgz", @@ -11958,15 +12523,15 @@ "license": "0BSD" }, "node_modules/tuf-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", - "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", "devOptional": true, "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -11985,6 +12550,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -12044,6 +12624,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", @@ -12075,6 +12665,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -12116,19 +12716,29 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", "devOptional": true, "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "license": "MIT", "dependencies": { @@ -12139,15 +12749,6 @@ "node": ">=10.13.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -12169,19 +12770,6 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12251,7 +12839,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/y18n": { @@ -12282,32 +12870,85 @@ } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "devOptional": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "devOptional": true, "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/yn": { @@ -12346,6 +12987,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.25.75", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.75.tgz", + "integrity": "sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "devOptional": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "node_modules/zone.js": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", diff --git a/web/package.json b/web/package.json index 1e1212220..86ee962ab 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "startos-ui", - "version": "0.4.0-alpha.8", + "version": "0.4.0-alpha.9", "author": "Start9 Labs, Inc", "homepage": "https://start9.com/", "license": "MIT", @@ -30,34 +30,34 @@ "build-config": "node build-config.js" }, "dependencies": { - "@angular/animations": "^19.2.11", - "@angular/cdk": "^19.2.16", - "@angular/common": "^19.2.11", - "@angular/compiler": "^19.2.11", - "@angular/core": "^19.2.11", - "@angular/forms": "^19.2.11", - "@angular/platform-browser": "^19.2.11", - "@angular/platform-browser-dynamic": "^19.2.11", - "@angular/pwa": "^19.2.12", - "@angular/router": "^19.2.11", - "@angular/service-worker": "^19.2.11", + "@angular/animations": "^20.1.0", + "@angular/cdk": "^20.1.0", + "@angular/common": "^20.1.0", + "@angular/compiler": "^20.1.0", + "@angular/core": "^20.1.0", + "@angular/forms": "^20.1.0", + "@angular/platform-browser": "^20.1.0", + "@angular/platform-browser-dynamic": "^20.1.0", + "@angular/pwa": "^20.1.0", + "@angular/router": "^20.1.0", + "@angular/service-worker": "^20.1.0", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.4.0", "@start9labs/argon2": "^0.3.0", "@start9labs/start-sdk": "file:../sdk/baseDist", - "@taiga-ui/addon-charts": "4.41.0", - "@taiga-ui/addon-commerce": "4.41.0", - "@taiga-ui/addon-mobile": "4.41.0", - "@taiga-ui/addon-table": "4.41.0", - "@taiga-ui/cdk": "4.41.0", - "@taiga-ui/core": "4.41.0", + "@taiga-ui/addon-charts": "4.44.0", + "@taiga-ui/addon-commerce": "4.44.0", + "@taiga-ui/addon-mobile": "4.44.0", + "@taiga-ui/addon-table": "4.44.0", + "@taiga-ui/cdk": "4.44.0", + "@taiga-ui/core": "4.44.0", "@taiga-ui/event-plugins": "4.6.0", - "@taiga-ui/experimental": "4.41.0", - "@taiga-ui/icons": "4.41.0", - "@taiga-ui/kit": "4.41.0", - "@taiga-ui/layout": "4.41.0", - "@taiga-ui/legacy": "4.41.0", + "@taiga-ui/experimental": "4.44.0", + "@taiga-ui/icons": "4.44.0", + "@taiga-ui/kit": "4.44.0", + "@taiga-ui/layout": "4.44.0", + "@taiga-ui/legacy": "4.44.0", "@taiga-ui/polymorpheus": "4.9.0", "@taiga-ui/dompurify": "4.1.11", "ansi-to-html": "^0.7.2", @@ -78,7 +78,7 @@ "mime": "^4.0.3", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^19.0.1", + "ng-qrcode": "^20.0.0", "node-jose": "^2.2.0", "patch-db-client": "file:../patch-db/client", "pbkdf2": "^3.1.2", @@ -89,10 +89,10 @@ "zone.js": "^0.15.0" }, "devDependencies": { - "@angular/build": "^19.2.12", - "@angular/cli": "^19.2.12", - "@angular/compiler-cli": "^19.2.11", - "@angular/language-service": "^19.2.11", + "@angular/build": "^20.1.0", + "@angular/cli": "^20.1.0", + "@angular/compiler-cli": "^20.1.0", + "@angular/language-service": "^20.1.0", "@angular-experts/hawkeye": "^1.7.2", "@types/dompurify": "3.0.5", "@types/estree": "^0.0.51", @@ -105,7 +105,7 @@ "@types/uuid": "^8.3.1", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^19.2.2", + "ng-packagr": "^20.1.0", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", "prettier": "^3.5.3", diff --git a/web/patchdb-ui-seed.json b/web/patchdb-ui-seed.json index 2473812b4..8008dd6a3 100644 --- a/web/patchdb-ui-seed.json +++ b/web/patchdb-ui-seed.json @@ -5,6 +5,5 @@ "https://community-registry.start9.com/": "Community Registry" }, "startosRegistry": "https://registry.start9.com/", - "snakeHighScore": 0, - "ackInstructions": {} + "snakeHighScore": 0 } diff --git a/web/projects/install-wizard/src/app/app.utils.ts b/web/projects/install-wizard/src/app/app.utils.ts index 515365c67..9ed8e5fce 100644 --- a/web/projects/install-wizard/src/app/app.utils.ts +++ b/web/projects/install-wizard/src/app/app.utils.ts @@ -5,7 +5,6 @@ import { TuiConfirmData } from '@taiga-ui/kit' export const SUCCESS: Partial> = { label: 'Install Success', closeable: false, - dismissible: false, size: 's', data: { button: 'Reboot' }, } diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts index 071eff821..6a41e3ad8 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts @@ -4,20 +4,20 @@ import { knownRegistries, sameUrl } from '@start9labs/shared' @Component({ selector: 'store-icon', template: ` - Registry Icon - + @if (icon) { + Registry Icon + } @else { Registry Icon - + } `, styles: ':host { overflow: hidden; }', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/web/projects/marketplace/src/modals/release-notes.component.ts b/web/projects/marketplace/src/modals/release-notes.component.ts deleted file mode 100644 index a30513a94..000000000 --- a/web/projects/marketplace/src/modals/release-notes.component.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { CommonModule } from '@angular/common' -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { Exver, MarkdownPipe } from '@start9labs/shared' -import { TuiDialogContext } from '@taiga-ui/core' -import { NgDompurifyPipe } from '@taiga-ui/dompurify' -import { TuiAccordion } from '@taiga-ui/kit' -import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' -import { MarketplacePkg } from '../../src/types' - -@Component({ - template: ` - - @for (note of notes | keyvalue: asIsOrder; track $index) { - - {{ note.key }} - -
-
-
- } -
- `, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, TuiAccordion, MarkdownPipe, NgDompurifyPipe], -}) -export class ReleaseNotesComponent { - private readonly exver = inject(Exver) - private readonly pkg = - injectContext>().data - - readonly notes = Object.entries(this.pkg.otherVersions) - .filter( - ([v, _]) => - this.exver.getFlavor(v) === this.pkg.flavor && - this.exver.compareExver(this.pkg.version, v) === 1, - ) - .reduce( - (obj, [version, info]) => ({ - ...obj, - [version]: info.releaseNotes, - }), - { - [`${this.pkg.version} (current)`]: this.pkg.releaseNotes, - }, - ) - - asIsOrder(a: any, b: any) { - return 0 - } -} - -export const RELEASE_NOTES = new PolymorpheusComponent(ReleaseNotesComponent) diff --git a/web/projects/marketplace/src/pages/list/item/item.component.scss b/web/projects/marketplace/src/pages/list/item/item.component.scss index 901c0f67d..f108a26af 100644 --- a/web/projects/marketplace/src/pages/list/item/item.component.scss +++ b/web/projects/marketplace/src/pages/list/item/item.component.scss @@ -16,8 +16,8 @@ position: absolute; width: 100%; height: 100%; - top: 0px; - left: 0px; + top: 0; + left: 0; z-index: -50; border-radius: 1.5rem; background-color: rgb(39 39 42); diff --git a/web/projects/marketplace/src/pages/show/about.component.ts b/web/projects/marketplace/src/pages/show/about.component.ts new file mode 100644 index 000000000..ecd83b62b --- /dev/null +++ b/web/projects/marketplace/src/pages/show/about.component.ts @@ -0,0 +1,139 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + input, + output, +} from '@angular/core' +import { MarketplacePkgBase } from '../../types' +import { CopyService } from '@start9labs/shared' +import { DatePipe } from '@angular/common' +import { MarketplaceItemComponent } from './item.component' + +@Component({ + selector: 'marketplace-about', + template: ` +
+
+
+ + + + @if (pkg().s9pk?.publishedAt; as published) { + + } + + + + @if (pkg().gitHash; as gitHash) { + + } @else { +
+ +
+ } + + +
+
+
+ +
+
+

+
+
+ `, + styles: ` + .box-container { + background-color: rgb(39 39 42); + border-radius: 0.75rem; + padding: 1.25rem 1.75rem; + + p { + font-size: 1rem; + line-height: 1.5rem; + margin-bottom: 0.75rem; + pointer-events: none; + } + } + + .detail-container { + display: grid; + grid-auto-flow: row; + grid-auto-columns: minmax(0, 1fr); + + & > * + * { + border-top-width: 1px; + border-bottom-width: 0; + border-color: rgb(113 113 122); + } + } + + .item-pointer:hover { + cursor: pointer; + + ::ng-deep label { + cursor: pointer; + } + } + + .item-copy:hover { + cursor: copy; + + ::ng-deep label { + cursor: copy; + } + } + + .item-padding { + padding: 0.75rem 0.25rem; + } + + * { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: rgb(var(--tw-color-gray-200) / 1); + } + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [MarketplaceItemComponent, DatePipe], +}) +export class MarketplaceAboutComponent { + readonly copyService = inject(CopyService) + + readonly pkg = input.required() + + readonly static = output<'license'>() +} diff --git a/web/projects/marketplace/src/pages/show/about/about.component.html b/web/projects/marketplace/src/pages/show/about/about.component.html deleted file mode 100644 index c0cfcee1c..000000000 --- a/web/projects/marketplace/src/pages/show/about/about.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
diff --git a/web/projects/marketplace/src/pages/show/about/about.component.scss b/web/projects/marketplace/src/pages/show/about/about.component.scss deleted file mode 100644 index 957581046..000000000 --- a/web/projects/marketplace/src/pages/show/about/about.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -.box-container { - background-color: rgb(39 39 42); - border-radius: 0.75rem; - padding: 1.75rem; - - p { - font-size: 1rem; - line-height: 1.5rem; - margin-bottom: 0.75rem; - pointer-events: none; - } -} diff --git a/web/projects/marketplace/src/pages/show/about/about.component.ts b/web/projects/marketplace/src/pages/show/about/about.component.ts deleted file mode 100644 index d4cdcb094..000000000 --- a/web/projects/marketplace/src/pages/show/about/about.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - inject, - Input, -} from '@angular/core' -import { TuiDialogService } from '@taiga-ui/core' -import { RELEASE_NOTES } from '../../../modals/release-notes.component' -import { MarketplacePkgBase } from '../../../types' - -@Component({ - selector: 'marketplace-about', - templateUrl: 'about.component.html', - styleUrls: ['about.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class AboutComponent { - private readonly dialogs = inject(TuiDialogService) - - @Input({ required: true }) - pkg!: MarketplacePkgBase - - async onPast() { - this.dialogs - .open(RELEASE_NOTES, { label: 'Past Release Notes', data: this.pkg }) - .subscribe() - } -} diff --git a/web/projects/marketplace/src/pages/show/about/about.module.ts b/web/projects/marketplace/src/pages/show/about/about.module.ts deleted file mode 100644 index 2ee715791..000000000 --- a/web/projects/marketplace/src/pages/show/about/about.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule } from '@angular/router' -import { MarkdownPipe, SafeLinksDirective } from '@start9labs/shared' -import { TuiButton } from '@taiga-ui/core' -import { NgDompurifyPipe } from '@taiga-ui/dompurify' -import { TuiTagModule } from '@taiga-ui/legacy' -import { AboutComponent } from './about.component' - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - TuiTagModule, - NgDompurifyPipe, - SafeLinksDirective, - MarkdownPipe, - TuiButton, - ], - declarations: [AboutComponent], - exports: [AboutComponent], -}) -export class AboutModule {} diff --git a/web/projects/marketplace/src/pages/show/additional/additional-link.component.ts b/web/projects/marketplace/src/pages/show/additional/additional-link.component.ts deleted file mode 100644 index 42446d589..000000000 --- a/web/projects/marketplace/src/pages/show/additional/additional-link.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { CommonModule } from '@angular/common' -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { MarketplaceAdditionalItemComponent } from './additional-item.component' - -@Component({ - selector: 'marketplace-additional-link', - template: ` - - - - `, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, MarketplaceAdditionalItemComponent], -}) -export class MarketplaceAdditionalLinkComponent { - @Input({ required: true }) - label!: string - - @Input({ required: true }) - icon!: string - - @Input({ required: true }) - url!: string -} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.html b/web/projects/marketplace/src/pages/show/additional/additional.component.html deleted file mode 100644 index f7e58147d..000000000 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.html +++ /dev/null @@ -1,78 +0,0 @@ -
-
-

Information

-
- - - - - -
- -
-
- - - - - - - - - - - -
-
-
diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.scss b/web/projects/marketplace/src/pages/show/additional/additional.component.scss deleted file mode 100644 index 37bce5a39..000000000 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.scss +++ /dev/null @@ -1,46 +0,0 @@ -.box-container { - background-color: rgb(39 39 42); - border-radius: 0.75rem; - padding: 1.75rem; -} - -.detail-container { - display: grid; - grid-auto-flow: row; - grid-auto-columns: minmax(0, 1fr); - - & > * + * { - border-top-width: 1px; - border-bottom-width: 0; - border-color: rgb(113 113 122); - } -} - -.item-pointer:hover { - cursor: pointer; - - ::ng-deep label { - cursor: pointer; - } -} - -.item-copy:hover { - cursor: copy; - - ::ng-deep label { - cursor: copy; - } -} - -.item-padding { - padding: 0.75rem 0.25rem; -} - -*, -::before, -::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: rgb(var(--tw-color-gray-200) / 1); -} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.ts b/web/projects/marketplace/src/pages/show/additional/additional.component.ts deleted file mode 100644 index 4118c374c..000000000 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - Output, -} from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { CopyService } from '@start9labs/shared' -import { MarketplacePkgBase } from '../../../types' - -@Component({ - selector: 'marketplace-additional', - templateUrl: 'additional.component.html', - styleUrls: ['additional.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class AdditionalComponent { - @Input({ required: true }) - pkg!: MarketplacePkgBase - - @Output() - readonly static = new EventEmitter<'license' | 'instructions'>() - - constructor( - readonly copyService: CopyService, - private readonly route: ActivatedRoute, - ) {} - - readonly url = this.route.snapshot.queryParamMap.get('url') || undefined -} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.module.ts b/web/projects/marketplace/src/pages/show/additional/additional.module.ts deleted file mode 100644 index 174127e04..000000000 --- a/web/projects/marketplace/src/pages/show/additional/additional.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { AdditionalComponent } from './additional.component' -import { TuiButton, TuiLabel, TuiTitle } from '@taiga-ui/core' -import { MarketplaceAdditionalItemComponent } from './additional-item.component' -import { MarketplaceAdditionalLinkComponent } from './additional-link.component' - -@NgModule({ - imports: [ - CommonModule, - TuiButton, - TuiLabel, - MarketplaceAdditionalItemComponent, - MarketplaceAdditionalLinkComponent, - TuiTitle, - ], - declarations: [AdditionalComponent], - exports: [AdditionalComponent], -}) -export class AdditionalModule {} diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts index a47e41e00..f6e696855 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts @@ -1,4 +1,4 @@ -import { CommonModule, KeyValue } from '@angular/common' +import { KeyValue } from '@angular/common' import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { RouterModule } from '@angular/router' import { ExverPipesModule } from '@start9labs/shared' @@ -19,10 +19,11 @@ import { MarketplacePkgBase } from '../../../types' {{ getTitle(dep.key) }}

- - (optional) - (required) - + @if (dep.value.optional) { + (optional) + } @else { + (required) + }

@@ -87,13 +88,7 @@ import { MarketplacePkgBase } from '../../../types' } `, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - CommonModule, - RouterModule, - TuiAvatar, - ExverPipesModule, - TuiLineClamp, - ], + imports: [RouterModule, TuiAvatar, ExverPipesModule, TuiLineClamp], }) export class MarketplaceDepItemComponent { @Input({ required: true }) diff --git a/web/projects/marketplace/src/pages/show/flavors/flavors.component.ts b/web/projects/marketplace/src/pages/show/flavors.component.ts similarity index 91% rename from web/projects/marketplace/src/pages/show/flavors/flavors.component.ts rename to web/projects/marketplace/src/pages/show/flavors.component.ts index b8dbd9bf5..d3d33486f 100644 --- a/web/projects/marketplace/src/pages/show/flavors/flavors.component.ts +++ b/web/projects/marketplace/src/pages/show/flavors.component.ts @@ -4,7 +4,7 @@ import { SharedPipesModule } from '@start9labs/shared' import { TuiTitle } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' import { TuiCell } from '@taiga-ui/layout' -import { MarketplacePkg } from '../../../types' +import { MarketplacePkg } from '../../types' @Component({ selector: 'marketplace-flavors', @@ -33,7 +33,7 @@ import { MarketplacePkg } from '../../../types' .box-container { background-color: rgb(39 39 42); border-radius: 0.75rem; - padding: 1.75rem; + padding: 1.25rem 1.75rem; } [tuiCell] { @@ -44,7 +44,7 @@ import { MarketplacePkg } from '../../../types' changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, TuiCell, TuiTitle, SharedPipesModule, TuiAvatar], }) -export class FlavorsComponent { +export class MarketplaceFlavorsComponent { @Input() pkgs!: MarketplacePkg[] } diff --git a/web/projects/marketplace/src/pages/show/hero/hero.component.ts b/web/projects/marketplace/src/pages/show/hero.component.ts similarity index 80% rename from web/projects/marketplace/src/pages/show/hero/hero.component.ts rename to web/projects/marketplace/src/pages/show/hero.component.ts index 7d751b377..488773d0f 100644 --- a/web/projects/marketplace/src/pages/show/hero/hero.component.ts +++ b/web/projects/marketplace/src/pages/show/hero.component.ts @@ -1,4 +1,3 @@ -import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { SharedPipesModule, TickerComponent } from '@start9labs/shared' @@ -17,8 +16,6 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared'

{{ pkg.title }}

-

{{ pkg.version }}

-

{{ pkg.description.short }}

@@ -43,7 +40,7 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared' min-height: 32vh; position: relative; border-radius: 1.5rem; - padding: 4rem 2rem 0 2rem; + padding: 3rem 2rem 0 2rem; @media (min-width: 376px) { min-height: 20vh; @@ -66,7 +63,7 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared' } .inner-container-title { - margin: 1rem 0; + margin: 0.5rem 0 1rem 0; color: rgb(250 250 250); mix-blend-mode: plus-lighter; z-index: 1; @@ -77,29 +74,11 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared' } h2 { - font-size: 2rem; + font-size: 2.5rem; line-height: 3rem; font-weight: normal; display: inline-block; - margin-left: -1px; - } - - h3 { - font-size: 1.1rem; - font-weight: normal; - margin-bottom: 1rem; - pointer-events: none; - } - - p { - font-size: 1rem; - line-height: 1.5rem; - font-weight: 300; - pointer-events: none; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; + margin: 1rem 0 1rem 0; } } @@ -138,7 +117,7 @@ import { SharedPipesModule, TickerComponent } from '@start9labs/shared' } `, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, SharedPipesModule, TickerComponent], + imports: [SharedPipesModule, TickerComponent], }) export class MarketplacePackageHeroComponent { @Input({ required: true }) diff --git a/web/projects/marketplace/src/pages/show/additional/additional-item.component.ts b/web/projects/marketplace/src/pages/show/item.component.ts similarity index 82% rename from web/projects/marketplace/src/pages/show/additional/additional-item.component.ts rename to web/projects/marketplace/src/pages/show/item.component.ts index 8979bf160..b46facebd 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional-item.component.ts +++ b/web/projects/marketplace/src/pages/show/item.component.ts @@ -1,10 +1,9 @@ -import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { TuiIcon, TuiTitle } from '@taiga-ui/core' import { TuiFade } from '@taiga-ui/kit' @Component({ - selector: 'marketplace-additional-item', + selector: 'marketplace-item', template: `