diff --git a/.env.build b/.env.build new file mode 100644 index 0000000..c444841 --- /dev/null +++ b/.env.build @@ -0,0 +1,2 @@ +# Currently not working as not in production +REGISTRY_URL=https://api.nanoforge.dev diff --git a/.env.build.local b/.env.build.local new file mode 100644 index 0000000..ac18fb5 --- /dev/null +++ b/.env.build.local @@ -0,0 +1 @@ +REGISTRY_URL=http://localhost:3000 diff --git a/.github/labeler.yml b/.github/labeler.yml index 1ef9ad0..0c5d217 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,32 +1,50 @@ command:build: - changed-files: - any-glob-to-any-file: - - src/command/commands/build.ts - - src/action/actions/build.ts + - src/command/commands/build.command.ts + - src/action/actions/build.action.ts + +command:dev: + - changed-files: + - any-glob-to-any-file: + - src/command/commands/dev.command.ts + - src/action/actions/dev.action.ts command:generate: - changed-files: - any-glob-to-any-file: - - src/command/commands/generate.ts - - src/action/actions/generate.ts + - src/command/commands/generate.command.ts + - src/action/actions/generate.action.ts command:install: - changed-files: - any-glob-to-any-file: - - src/command/commands/install.ts - - src/action/actions/install.ts + - src/command/commands/install.command.ts + - src/action/actions/install.action.ts + +command:login: + - changed-files: + - any-glob-to-any-file: + - src/command/commands/login.command.ts + - src/action/actions/login.action.ts + +command:logout: + - changed-files: + - any-glob-to-any-file: + - src/command/commands/logout.command.ts + - src/action/actions/logout.action.ts command:new: - changed-files: - any-glob-to-any-file: - - src/command/commands/new.ts - - src/action/actions/new.ts + - src/command/commands/new.command.ts + - src/action/actions/new.action.ts command:start: - changed-files: - any-glob-to-any-file: - - src/command/commands/start.ts - - src/action/actions/start.ts + - src/command/commands/start.command.ts + - src/action/actions/start.action.ts documentation: - changed-files: diff --git a/.github/labels.yml b/.github/labels.yml index 3b775d4..c159180 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -46,6 +46,10 @@ description: "Related to build command" color: "aaa3dc" +- name: "command:dev" + description: "Related to dev command" + color: "aaa3dc" + - name: "command:generate" description: "Related to generate command" color: "aaa3dc" @@ -58,6 +62,14 @@ description: "Related to install command" color: "aaa3dc" +- name: "command:login" + description: "Related to login command" + color: "aaa3dc" + +- name: "command:logout" + description: "Related to logout command" + color: "aaa3dc" + - name: "command:new" description: "Related to new command" color: "aaa3dc" diff --git a/e2e/cli-login.test.ts b/e2e/cli-login.test.ts new file mode 100644 index 0000000..9234bbb --- /dev/null +++ b/e2e/cli-login.test.ts @@ -0,0 +1,100 @@ +import { existsSync, mkdirSync, readFileSync, rmSync } from "node:fs"; +import { resolve } from "node:path"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +import { runCli } from "./helpers/run-cli"; + +const tmpDir = resolve(__dirname, "../.tmp-e2e-login"); +const RC_FILE = ".nanoforgerc"; +const FETCH_MOCK_PATH = resolve(__dirname, "./helpers/fetch-mock.mjs"); + +function withMockedFetch(status = 200): NodeJS.ProcessEnv { + const existing = process.env.NODE_OPTIONS ?? ""; + return { + ...process.env, + NODE_OPTIONS: `${existing} --import ${FETCH_MOCK_PATH}`.trim(), + MOCK_REGISTRY_STATUS: String(status), + }; +} + +function readLocalRc(dir: string): string { + const rcPath = resolve(dir, RC_FILE); + if (!existsSync(rcPath)) return ""; + return readFileSync(rcPath, "utf-8"); +} + +beforeAll(() => { + mkdirSync(tmpDir, { recursive: true }); +}); + +afterAll(() => { + rmSync(tmpDir, { recursive: true, force: true }); +}); + +describe("nf login --help", () => { + it("should display login command help", async () => { + const { stdout, exitCode } = await runCli(["login", "--help"]); + + expect(exitCode).toBe(0); + expect(stdout).toContain("login to Nanoforge registry"); + expect(stdout).toContain("--directory"); + expect(stdout).toContain("--local"); + expect(stdout).toContain("--api-key"); + }); +}); + +describe("nf login (local mode)", () => { + const dir = resolve(tmpDir, "login-local"); + + beforeEach(() => { + mkdirSync(dir, { recursive: true }); + }); + + afterEach(() => { + rmSync(dir, { recursive: true, force: true }); + }); + + it("should write apiKey to local .nanoforgerc", async () => { + const fakeApiKey = "test-api-key-abc123"; + const { stdout, exitCode } = await runCli(["login", "--local", "-d", dir, "-k", fakeApiKey], { + env: withMockedFetch(), + }); + + expect(exitCode).toBe(0); + expect(stdout).toContain("NanoForge Login"); + expect(stdout).toContain("Login completed!"); + + const rcContent = readLocalRc(dir); + expect(rcContent).toContain(fakeApiKey); + }); + + it("should create the .nanoforgerc file in the specified directory", async () => { + await runCli(["login", "--local", "-d", dir, "-k", "test-api-key-create-file"], { + env: withMockedFetch(), + }); + + expect(existsSync(resolve(dir, RC_FILE))).toBe(true); + }); + + it("should overwrite apiKey on second login", async () => { + const firstKey = "first-api-key"; + const secondKey = "second-api-key"; + + await runCli(["login", "--local", "-d", dir, "-k", firstKey], { env: withMockedFetch() }); + expect(readLocalRc(dir)).toContain(firstKey); + + await runCli(["login", "--local", "-d", dir, "-k", secondKey], { env: withMockedFetch() }); + const rcContent = readLocalRc(dir); + expect(rcContent).toContain(secondKey); + expect(rcContent).not.toContain(firstKey); + }); + + it("should fail when the registry rejects the api key", async () => { + const { exitCode } = await runCli(["login", "--local", "-d", dir, "-k", "invalid-key"], { + env: withMockedFetch(401), + }); + + expect(exitCode).not.toBe(0); + expect(existsSync(resolve(dir, RC_FILE))).toBe(false); + }); +}); diff --git a/e2e/cli-logout.test.ts b/e2e/cli-logout.test.ts new file mode 100644 index 0000000..bba434a --- /dev/null +++ b/e2e/cli-logout.test.ts @@ -0,0 +1,101 @@ +import { existsSync, mkdirSync, readFileSync, rmSync } from "node:fs"; +import { resolve } from "node:path"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +import { runCli } from "./helpers/run-cli"; + +const tmpDir = resolve(__dirname, "../.tmp-e2e-logout"); +const RC_FILE = ".nanoforgerc"; +const FETCH_MOCK_PATH = resolve(__dirname, "./helpers/fetch-mock.mjs"); + +function withMockedFetch(): NodeJS.ProcessEnv { + const existing = process.env.NODE_OPTIONS ?? ""; + return { + ...process.env, + NODE_OPTIONS: `${existing} --import ${FETCH_MOCK_PATH}`.trim(), + }; +} + +function readLocalRc(dir: string): string { + const rcPath = resolve(dir, RC_FILE); + if (!existsSync(rcPath)) return ""; + return readFileSync(rcPath, "utf-8"); +} + +beforeAll(() => { + mkdirSync(tmpDir, { recursive: true }); +}); + +afterAll(() => { + rmSync(tmpDir, { recursive: true, force: true }); +}); + +describe("nf logout --help", () => { + it("should display logout command help", async () => { + const { stdout, exitCode } = await runCli(["logout", "--help"]); + + expect(exitCode).toBe(0); + expect(stdout).toContain("logout from Nanoforge registry"); + expect(stdout).toContain("--directory"); + expect(stdout).toContain("--local"); + }); +}); + +describe("nf logout (local mode)", () => { + const dir = resolve(tmpDir, "logout-local"); + + beforeEach(() => { + mkdirSync(dir, { recursive: true }); + }); + + afterEach(() => { + rmSync(dir, { recursive: true, force: true }); + }); + + it("should clear apiKey from local .nanoforgerc after logout", async () => { + const fakeApiKey = "test-api-key-to-remove"; + + await runCli(["login", "--local", "-d", dir, "-k", fakeApiKey], { env: withMockedFetch() }); + expect(readLocalRc(dir)).toContain(fakeApiKey); + + const { stdout, exitCode } = await runCli(["logout", "--local", "-d", dir]); + + expect(exitCode).toBe(0); + expect(stdout).toContain("NanoForge Logout"); + expect(stdout).toContain("Logout completed!"); + + expect(readLocalRc(dir)).not.toContain(fakeApiKey); + }); + + it("should succeed even when no prior login exists", async () => { + const { exitCode } = await runCli(["logout", "--local", "-d", dir]); + + expect(exitCode).toBe(0); + }); +}); + +describe("nf login then logout (full flow, local mode)", () => { + const dir = resolve(tmpDir, "full-flow"); + + beforeEach(() => { + mkdirSync(dir, { recursive: true }); + }); + + afterEach(() => { + rmSync(dir, { recursive: true, force: true }); + }); + + it("should login and then logout successfully", async () => { + const fakeApiKey = "full-flow-api-key-xyz"; + + const loginResult = await runCli(["login", "--local", "-d", dir, "-k", fakeApiKey], { + env: withMockedFetch(), + }); + expect(loginResult.exitCode).toBe(0); + expect(readLocalRc(dir)).toContain(fakeApiKey); + + const logoutResult = await runCli(["logout", "--local", "-d", dir]); + expect(logoutResult.exitCode).toBe(0); + expect(readLocalRc(dir)).not.toContain(fakeApiKey); + }); +}); diff --git a/e2e/helpers/fetch-mock.mjs b/e2e/helpers/fetch-mock.mjs new file mode 100644 index 0000000..38b9b9f --- /dev/null +++ b/e2e/helpers/fetch-mock.mjs @@ -0,0 +1,18 @@ +/** + * Mocks globalThis.fetch for the CLI subprocess. + * Loaded via NODE_OPTIONS="--import /path/to/fetch-mock.mjs". + * + * Env vars: + * MOCK_REGISTRY_STATUS HTTP status to return (default: 200) + */ +const mockStatus = parseInt(process.env.MOCK_REGISTRY_STATUS ?? "200", 10); + +globalThis.fetch = async (_url, _options) => { + const ok = mockStatus >= 200 && mockStatus < 300; + const body = ok ? JSON.stringify({ ok: true }) : JSON.stringify({ message: "Unauthorized" }); + + return new Response(body, { + status: mockStatus, + headers: { "Content-Type": "application/json" }, + }); +}; diff --git a/e2e/helpers/run-cli.ts b/e2e/helpers/run-cli.ts index 1793303..1bcd320 100644 --- a/e2e/helpers/run-cli.ts +++ b/e2e/helpers/run-cli.ts @@ -12,17 +12,23 @@ interface CliResult { interface RunCliOptions extends SpawnOptions { timeout?: number; + stdinData?: string; } export const runCli = (args: string[], options?: RunCliOptions): Promise => { return new Promise((resolve) => { - const { timeout, ...spawnOptions } = options ?? {}; + const { timeout, stdinData, ...spawnOptions } = options ?? {}; const child = spawn("node", [CLI_PATH, ...args], { stdio: "pipe", ...spawnOptions, }); + if (stdinData !== undefined) { + child.stdin?.write(stdinData); + child.stdin?.end(); + } + let killed = false; let timer: ReturnType | undefined; diff --git a/package.json b/package.json index 1e69236..86b0220 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "funding": "", "scripts": { "build": "tsc --noEmit && tsup", + "build:dev": "tsc --noEmit && NODE_ENV=development tsup", "start": "node dist/nf.js", "lint": "prettier --check . && eslint --format=pretty src", "format": "prettier --write . && eslint --fix --format=pretty src", @@ -63,6 +64,7 @@ "commander": "catalog:cli", "node-emoji": "catalog:cli", "ora": "catalog:cli", + "rc9": "catalog:libs", "reflect-metadata": "catalog:libs" }, "devDependencies": { @@ -76,6 +78,7 @@ "@types/inquirer": "catalog:cli", "@types/node": "catalog:core", "@vitest/coverage-v8": "catalog:tests", + "dotenv": "catalog:build", "eslint": "catalog:lint", "husky": "catalog:ci", "lint-staged": "catalog:ci", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef9d6e6..c7a6c99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: build: + dotenv: + specifier: ^17.3.1 + version: 17.3.1 tsup: specifier: ^8.5.1 version: 8.5.1 @@ -14,11 +17,11 @@ catalogs: version: 5.9.3 ci: '@commitlint/cli': - specifier: ^20.4.1 - version: 20.4.1 + specifier: ^20.4.3 + version: 20.4.3 '@commitlint/config-conventional': - specifier: ^20.4.1 - version: 20.4.1 + specifier: ^20.4.3 + version: 20.4.3 '@favware/cliff-jumper': specifier: ^6.0.0 version: 6.0.0 @@ -29,12 +32,12 @@ catalogs: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^16.2.7 - version: 16.2.7 + specifier: ^16.3.2 + version: 16.3.2 cli: '@inquirer/prompts': - specifier: ^8.2.1 - version: 8.2.1 + specifier: ^8.3.0 + version: 8.3.0 '@types/inquirer': specifier: ^9.0.9 version: 9.0.9 @@ -52,11 +55,11 @@ catalogs: version: 9.3.0 core: '@types/node': - specifier: ^25.3.0 - version: 25.3.0 + specifier: ^25.3.3 + version: 25.3.3 bun: - specifier: ^1.3.9 - version: 1.3.9 + specifier: ^1.3.10 + version: 1.3.10 libs: chokidar: specifier: ^5.0.0 @@ -67,6 +70,9 @@ catalogs: class-validator: specifier: ^0.15.1 version: 0.15.1 + rc9: + specifier: ^3.0.0 + version: 3.0.0 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -81,8 +87,8 @@ catalogs: specifier: ^6.0.2 version: 6.0.2 eslint: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^10.0.2 + version: 10.0.2 prettier: specifier: ^3.8.1 version: 3.8.1 @@ -95,11 +101,11 @@ catalogs: version: 1.1.0 schematics: '@angular-devkit/schematics': - specifier: ^21.1.4 - version: 21.1.4 + specifier: ^21.2.1 + version: 21.2.1 '@angular-devkit/schematics-cli': - specifier: ^21.1.4 - version: 21.1.4 + specifier: ^21.2.1 + version: 21.2.1 '@nanoforge-dev/schematics': specifier: ^1.2.0 version: 1.2.0 @@ -117,13 +123,13 @@ importers: dependencies: '@angular-devkit/schematics': specifier: catalog:schematics - version: 21.1.4(chokidar@5.0.0) + version: 21.2.1(chokidar@5.0.0) '@angular-devkit/schematics-cli': specifier: catalog:schematics - version: 21.1.4(@types/node@25.3.0)(chokidar@5.0.0) + version: 21.2.1(@types/node@25.3.3)(chokidar@5.0.0) '@inquirer/prompts': specifier: catalog:cli - version: 8.2.1(@types/node@25.3.0) + version: 8.3.0(@types/node@25.3.3) '@nanoforge-dev/loader-client': specifier: catalog:loader version: 1.2.0 @@ -138,7 +144,7 @@ importers: version: 4.2.0 bun: specifier: catalog:core - version: 1.3.9 + version: 1.3.10 chokidar: specifier: catalog:libs version: 5.0.0 @@ -157,16 +163,19 @@ importers: ora: specifier: catalog:cli version: 9.3.0 + rc9: + specifier: catalog:libs + version: 3.0.0 reflect-metadata: specifier: catalog:libs version: 0.2.2 devDependencies: '@commitlint/cli': specifier: catalog:ci - version: 20.4.1(@types/node@25.3.0)(typescript@5.9.3) + version: 20.4.3(@types/node@25.3.3)(typescript@5.9.3) '@commitlint/config-conventional': specifier: catalog:ci - version: 20.4.1 + version: 20.4.3 '@favware/cliff-jumper': specifier: catalog:ci version: 6.0.0 @@ -175,7 +184,7 @@ importers: version: 1.1.0 '@nanoforge-dev/utils-eslint-config': specifier: catalog:lint - version: 1.0.2(@types/eslint@9.6.1)(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1)(typescript@5.9.3) + version: 1.0.2(@types/eslint@9.6.1)(eslint@10.0.2(jiti@2.6.1))(prettier@3.8.1)(typescript@5.9.3) '@nanoforge-dev/utils-prettier-config': specifier: catalog:lint version: 1.0.2 @@ -187,31 +196,34 @@ importers: version: 9.0.9 '@types/node': specifier: catalog:core - version: 25.3.0 + version: 25.3.3 '@vitest/coverage-v8': specifier: catalog:tests - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2)) + dotenv: + specifier: catalog:build + version: 17.3.1 eslint: specifier: catalog:lint - version: 10.0.0(jiti@2.6.1) + version: 10.0.2(jiti@2.6.1) husky: specifier: catalog:ci version: 9.1.7 lint-staged: specifier: catalog:ci - version: 16.2.7 + version: 16.3.2 prettier: specifier: catalog:lint version: 3.8.1 tsup: specifier: catalog:build - version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: catalog:build version: 5.9.3 vitest: specifier: catalog:tests - version: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + version: 4.0.18(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) packages: @@ -230,8 +242,8 @@ packages: '@actions/io@2.0.0': resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} - '@angular-devkit/core@21.1.4': - resolution: {integrity: sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==} + '@angular-devkit/core@21.2.1': + resolution: {integrity: sha512-TpXGjERqVPN8EPt7LdmWAwh0oNQ/6uWFutzGZiXhJy81n1zb1O1XrqhRAmvP1cAo5O+na6IV2JkkCmxL6F8GUg==} engines: {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: chokidar: ^5.0.0 @@ -239,13 +251,13 @@ packages: chokidar: optional: true - '@angular-devkit/schematics-cli@21.1.4': - resolution: {integrity: sha512-vgZyZ+sVhD7gCwbmHkAfj2nX9VGcqj6qCvs8UD9cO+JJoo00vem/fr/oBH63djPHC0R47RumvQ5OlZHJnaxx5w==} + '@angular-devkit/schematics-cli@21.2.1': + resolution: {integrity: sha512-5uEyqfCfh5QCI0XfzWkxeR9IWFs06Qtxjpgx1EF5sLL0TpCOAVngU70DVCJMNQoNITdtDIYS2TxBXWXiFfILdw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/schematics@21.1.4': - resolution: {integrity: sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==} + '@angular-devkit/schematics@21.2.1': + resolution: {integrity: sha512-CWoamHaasAHMjHcYqxbj0tMnoXxdGotcAz2SpiuWtH28Lnf5xfbTaJn/lwdMP8Wdh4tgA+uYh2l45A5auCwmkw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@babel/code-frame@7.29.0': @@ -289,73 +301,73 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@commitlint/cli@20.4.1': - resolution: {integrity: sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==} + '@commitlint/cli@20.4.3': + resolution: {integrity: sha512-Z37EMoDT7+Upg500vlr/vZrgRsb6Xc5JAA3Tv7BYbobnN/ZpqUeZnSLggBg2+1O+NptRDtyujr2DD1CPV2qwhA==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@20.4.1': - resolution: {integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==} + '@commitlint/config-conventional@20.4.3': + resolution: {integrity: sha512-9RtLySbYQAs8yEqWEqhSZo9nYhbm57jx7qHXtgRmv/nmeQIjjMcwf6Dl+y5UZcGWgWx435TAYBURONaJIuCjWg==} engines: {node: '>=v18'} - '@commitlint/config-validator@20.4.0': - resolution: {integrity: sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==} + '@commitlint/config-validator@20.4.3': + resolution: {integrity: sha512-jCZpZFkcSL3ZEdL5zgUzFRdytv3xPo8iukTe9VA+QGus/BGhpp1xXSVu2B006GLLb2gYUAEGEqv64kTlpZNgmA==} engines: {node: '>=v18'} - '@commitlint/ensure@20.4.1': - resolution: {integrity: sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==} + '@commitlint/ensure@20.4.3': + resolution: {integrity: sha512-WcXGKBNn0wBKpX8VlXgxqedyrLxedIlLBCMvdamLnJFEbUGJ9JZmBVx4vhLV3ZyA8uONGOb+CzW0Y9HDbQ+ONQ==} engines: {node: '>=v18'} '@commitlint/execute-rule@20.0.0': resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} engines: {node: '>=v18'} - '@commitlint/format@20.4.0': - resolution: {integrity: sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==} + '@commitlint/format@20.4.3': + resolution: {integrity: sha512-UDJVErjLbNghop6j111rsHJYGw6MjCKAi95K0GT2yf4eeiDHy3JDRLWYWEjIaFgO+r+dQSkuqgJ1CdMTtrvHsA==} engines: {node: '>=v18'} - '@commitlint/is-ignored@20.4.1': - resolution: {integrity: sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==} + '@commitlint/is-ignored@20.4.3': + resolution: {integrity: sha512-W5VQKZ7fdJ1X3Tko+h87YZaqRMGN1KvQKXyCM8xFdxzMIf1KCZgN4uLz3osLB1zsFcVS4ZswHY64LI26/9ACag==} engines: {node: '>=v18'} - '@commitlint/lint@20.4.1': - resolution: {integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==} + '@commitlint/lint@20.4.3': + resolution: {integrity: sha512-CYOXL23e+nRKij81+d0+dymtIi7Owl9QzvblJYbEfInON/4MaETNSLFDI74LDu+YJ0ML5HZyw9Vhp9QpckwQ0A==} engines: {node: '>=v18'} - '@commitlint/load@20.4.0': - resolution: {integrity: sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==} + '@commitlint/load@20.4.3': + resolution: {integrity: sha512-3cdJOUVP+VcgHa7bhJoWS+Z8mBNXB5aLWMBu7Q7uX8PSeWDzdbrBlR33J1MGGf7r1PZDp+mPPiFktk031PgdRw==} engines: {node: '>=v18'} - '@commitlint/message@20.4.0': - resolution: {integrity: sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==} + '@commitlint/message@20.4.3': + resolution: {integrity: sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==} engines: {node: '>=v18'} - '@commitlint/parse@20.4.1': - resolution: {integrity: sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==} + '@commitlint/parse@20.4.3': + resolution: {integrity: sha512-hzC3JCo3zs3VkQ833KnGVuWjWIzR72BWZWjQM7tY/7dfKreKAm7fEsy71tIFCRtxf2RtMP2d3RLF1U9yhFSccA==} engines: {node: '>=v18'} - '@commitlint/read@20.4.0': - resolution: {integrity: sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==} + '@commitlint/read@20.4.3': + resolution: {integrity: sha512-j42OWv3L31WfnP8WquVjHZRt03w50Y/gEE8FAyih7GQTrIv2+pZ6VZ6pWLD/ml/3PO+RV2SPtRtTp/MvlTb8rQ==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@20.4.0': - resolution: {integrity: sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==} + '@commitlint/resolve-extends@20.4.3': + resolution: {integrity: sha512-QucxcOy+00FhS9s4Uy0OyS5HeUV+hbC6OLqkTSIm6fwMdKva+OEavaCDuLtgd9akZZlsUo//XzSmPP3sLKBPog==} engines: {node: '>=v18'} - '@commitlint/rules@20.4.1': - resolution: {integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==} + '@commitlint/rules@20.4.3': + resolution: {integrity: sha512-Yuosd7Grn5qiT7FovngXLyRXTMUbj9PYiSkvUgWK1B5a7+ZvrbWDS7epeUapYNYatCy/KTpPFPbgLUdE+MUrBg==} engines: {node: '>=v18'} '@commitlint/to-lines@20.0.0': resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} engines: {node: '>=v18'} - '@commitlint/top-level@20.4.0': - resolution: {integrity: sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==} + '@commitlint/top-level@20.4.3': + resolution: {integrity: sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==} engines: {node: '>=v18'} - '@commitlint/types@20.4.0': - resolution: {integrity: sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==} + '@commitlint/types@20.4.3': + resolution: {integrity: sha512-51OWa1Gi6ODOasPmfJPq6js4pZoomima4XLZZCrkldaH2V5Nb3bVhNXPeT6XV0gubbainSpTw4zi68NqAeCNCg==} engines: {node: '>=v18'} '@conventional-changelog/git-client@1.0.1': @@ -373,8 +385,8 @@ packages: '@dprint/formatter@0.5.1': resolution: {integrity: sha512-cdZUrm0iv/FnnY3CKE2dEcVhNEzrC551aE2h2mTFwQCRBrqyARLDnb7D+3PlXTUVp3s34ftlnGOVCmhLT9DeKA==} - '@dprint/markdown@0.20.0': - resolution: {integrity: sha512-qvynFdQZwul4Y+hoMP02QerEhM5VItb4cO8/qpQrSuQuYvDU+bIseiheVAetSpWlNPBU1JK8bQKloiCSp9lXnA==} + '@dprint/markdown@0.21.1': + resolution: {integrity: sha512-XbZ/R7vRrBaZFYXG6vAvLvtaMVXHu8XB+xwie7OYrG+dPoGDP8UADGirIbzUyX8TmrAZcl6QBmalipTGlpzRmQ==} '@dprint/toml@0.7.0': resolution: {integrity: sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==} @@ -545,8 +557,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.1': - resolution: {integrity: sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==} + '@eslint/config-array@0.23.2': + resolution: {integrity: sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/config-helpers@0.5.2': @@ -557,12 +569,12 @@ packages: resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + '@eslint/js@9.39.3': + resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.1': - resolution: {integrity: sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg==} + '@eslint/object-schema@3.0.2': + resolution: {integrity: sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/plugin-kit@0.6.0': @@ -615,8 +627,8 @@ packages: '@types/node': optional: true - '@inquirer/checkbox@5.0.7': - resolution: {integrity: sha512-OGJykc3mpe4kiNXwXlDlP4MFqZso5QOoXJaJrmTJI+Y+gq68wxTyCUIFv34qgwZTHnGGeqwUKGOi4oxptTe+ZQ==} + '@inquirer/checkbox@5.1.0': + resolution: {integrity: sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -633,8 +645,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.0.7': - resolution: {integrity: sha512-lKdNloHLnGoBUUwprxKFd+SpkAnyQTBrZACFPtxDq9GiLICD2t+CaeJ1Ku4goZsGPyBIFc2YYpmDSJLEXoc16g==} + '@inquirer/confirm@6.0.8': + resolution: {integrity: sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -651,8 +663,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.4': - resolution: {integrity: sha512-1HvwyASF0tE/7W8geTTn0ydiWb463pq4SBIpaWcVabTrw55+CiRmytV9eZoqt3ohchsPw4Vv60jfNiI6YljVUg==} + '@inquirer/core@11.1.5': + resolution: {integrity: sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -669,8 +681,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.0.7': - resolution: {integrity: sha512-d36tisyvmxH7H+LICTeTofrKmJ+R1jAYV8q0VTYh96cm8mP2BdGh9TAIqbCGcciX8/dr0fJW+VJq3jAnco5xfg==} + '@inquirer/editor@5.0.8': + resolution: {integrity: sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -687,8 +699,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.7': - resolution: {integrity: sha512-h2RRFzDdeXOXLrJOUAaHzyR1HbiZlrl/NxorOAgNrzhiSThbwEFVOf88lJzbF5WXGrQ2RwqK2h0xAE7eo8QP5w==} + '@inquirer/expand@5.0.8': + resolution: {integrity: sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -731,8 +743,8 @@ packages: '@types/node': optional: true - '@inquirer/input@5.0.7': - resolution: {integrity: sha512-b+eKk/eUvKLQ6c+rDu9u4I1+twdjOfrEaw9NURDpCrWYJTWL1/JQEudZi0AeqXDGcn0tMdhlfpEfjcqr33B/qw==} + '@inquirer/input@5.0.8': + resolution: {integrity: sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -749,8 +761,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.7': - resolution: {integrity: sha512-/l5KxcLFFexzOwh8DcVOI7zgVQCwcBt/9yHWtvMdYvaYLMK5J31BSR/fO3Z9WauA21qwAkDGRvYNHIG4vR6JwA==} + '@inquirer/number@4.0.8': + resolution: {integrity: sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -767,8 +779,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.7': - resolution: {integrity: sha512-h3Rgzb8nFMxgK6X5246MtwTX/rXs5Z58DbeuUKI6W5dQ+CZusEunNeT7rosdB+Upn79BkfZJO0AaiH8MIi9v1A==} + '@inquirer/password@5.0.8': + resolution: {integrity: sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -785,8 +797,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.2.1': - resolution: {integrity: sha512-76knJFW2oXdI6If5YRmEoT5u7l+QroXYrMiINFcb97LsyECgsbO9m6iWlPuhBtaFgNITPHQCk3wbex38q8gsjg==} + '@inquirer/prompts@8.3.0': + resolution: {integrity: sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -803,8 +815,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.3': - resolution: {integrity: sha512-EuvV6N/T3xDmRVihAOqfnbmtHGdu26TocRKANvcX/7nLLD8QO0c22Dtlc5C15+V433d9v0E0SSyqywdNCIXfLg==} + '@inquirer/rawlist@5.2.4': + resolution: {integrity: sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -821,8 +833,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.1.3': - resolution: {integrity: sha512-6BE8MqVMakEiLDRtrwj9fbx6AYhuj7McW3GOkOoEiQ5Qkh6v6f5HCoYNqSRE4j6nT+u+73518iUQPE+mZYlAjA==} + '@inquirer/search@4.1.4': + resolution: {integrity: sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -839,8 +851,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.0.7': - resolution: {integrity: sha512-1JUJIR+Z2PsvwP6VWty7aE0aCPaT2cy2c4Vp3LPhL2Pi3+aXewAld/AyJ/CW9XWx1JbKxmdElfvls/G/7jG7ZQ==} + '@inquirer/select@5.1.0': + resolution: {integrity: sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -991,58 +1003,177 @@ packages: '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} - '@oven/bun-darwin-aarch64@1.3.9': - resolution: {integrity: sha512-df7smckMWSUfaT5mzwN9Lfpd3ZGkOqo+vmQ8VV2a32gl14v6uZ/qeeo+1RlANXn8M0uzXPWWCkrKZIWSZUR0qw==} + '@oven/bun-darwin-aarch64@1.3.10': + resolution: {integrity: sha512-PXgg5gqcS/rHwa1hF0JdM1y5TiyejVrMHoBmWY/DjtfYZoFTXie1RCFOkoG0b5diOOmUcuYarMpH7CSNTqwj+w==} cpu: [arm64] os: [darwin] - '@oven/bun-darwin-x64-baseline@1.3.9': - resolution: {integrity: sha512-XbhsA2XAFzvFr0vPSV6SNqGxab4xHKdPmVTLqoSHAx9tffrSq/012BDptOskulwnD+YNsrJUx2D2Ve1xvfgGcg==} + '@oven/bun-darwin-x64-baseline@1.3.10': + resolution: {integrity: sha512-w1gaTlqU0IJCmJ1X+PGHkdNU1n8Gemx5YKkjhkJIguvFINXEBB5U1KG82QsT65Tk4KyNMfbLTlmy4giAvUoKfA==} cpu: [x64] os: [darwin] - '@oven/bun-darwin-x64@1.3.9': - resolution: {integrity: sha512-YiLxfsPzQqaVvT2a+nxH9do0YfUjrlxF3tKP0b1DDgvfgCcVKGsrQH3Wa82qHgL4dnT8h2bqi94JxXESEuPmcA==} + '@oven/bun-darwin-x64@1.3.10': + resolution: {integrity: sha512-Nhssuh7GBpP5PiDSOl3+qnoIG7PJo+ec2oomDevnl9pRY6x6aD2gRt0JE+uf+A8Om2D6gjeHCxjEdrw5ZHE8mA==} cpu: [x64] os: [darwin] - '@oven/bun-linux-aarch64-musl@1.3.9': - resolution: {integrity: sha512-t8uimCVBTw5f9K2QTZE5wN6UOrFETNrh/Xr7qtXT9nAOzaOnIFvYA+HcHbGfi31fRlCVfTxqm/EiCwJ1gEw9YQ==} + '@oven/bun-linux-aarch64-musl@1.3.10': + resolution: {integrity: sha512-Ui5pAgM7JE9MzHokF0VglRMkbak3lTisY4Mf1AZutPACXWgKJC5aGrgnHBfkl7QS6fEeYb0juy1q4eRznRHOsw==} cpu: [arm64] os: [linux] - '@oven/bun-linux-aarch64@1.3.9': - resolution: {integrity: sha512-VaNQTu0Up4gnwZLQ6/Hmho6jAlLxTQ1PwxEth8EsXHf82FOXXPV5OCQ6KC9mmmocjKlmWFaIGebThrOy8DUo4g==} + '@oven/bun-linux-aarch64@1.3.10': + resolution: {integrity: sha512-OUgPHfL6+PM2Q+tFZjcaycN3D7gdQdYlWnwMI31DXZKY1r4HINWk9aEz9t/rNaHg65edwNrt7dsv9TF7xK8xIA==} cpu: [arm64] os: [linux] - '@oven/bun-linux-x64-baseline@1.3.9': - resolution: {integrity: sha512-nZ12g22cy7pEOBwAxz2tp0wVqekaCn9QRKuGTHqOdLlyAqR4SCdErDvDhUWd51bIyHTQoCmj72TegGTgG0WNPw==} + '@oven/bun-linux-x64-baseline@1.3.10': + resolution: {integrity: sha512-oqvMDYpX6dGJO03HgO5bXuccEsH3qbdO3MaAiAlO4CfkBPLUXz3N0DDElg5hz0L6ktdDVKbQVE5lfe+LAUISQg==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl-baseline@1.3.10': + resolution: {integrity: sha512-/hOZ6S1VsTX6vtbhWVL9aAnOrdpuO54mAGUWpTdMz7dFG5UBZ/VUEiK0pBkq9A1rlBk0GeD/6Y4NBFl8Ha7cRA==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl@1.3.10': + resolution: {integrity: sha512-poVXvOShekbexHq45b4MH/mRjQKwACAC8lHp3Tz/hEDuz0/20oncqScnmKwzhBPEpqJvydXficXfBYuSim8opw==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64-musl-baseline@1.3.9': - resolution: {integrity: sha512-3FXQgtYFsT0YOmAdMcJn56pLM5kzSl6y942rJJIl5l2KummB9Ea3J/vMJMzQk7NCAGhleZGWU/pJSS/uXKGa7w==} + '@oven/bun-linux-x64@1.3.10': + resolution: {integrity: sha512-bzUgYj/PIZziB/ZesIP9HUyfvh6Vlf3od+TrbTTyVEuCSMKzDPQVW/yEbRp0tcHO3alwiEXwJDrWrHAguXlgiQ==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64-musl@1.3.9': - resolution: {integrity: sha512-4ZjIUgCxEyKwcKXideB5sX0KJpnHTZtu778w73VNq2uNH2fNpMZv98+DBgJyQ9OfFoRhmKn1bmLmSefvnHzI9w==} + '@oven/bun-windows-aarch64@1.3.10': + resolution: {integrity: sha512-GXbz2swvN2DLw2dXZFeedMxSJtI64xQ9xp9Eg7Hjejg6mS2E4dP1xoQ2yAo2aZPi/2OBPAVaGzppI2q20XumHA==} + cpu: [arm64] + os: [win32] + + '@oven/bun-windows-x64-baseline@1.3.10': + resolution: {integrity: sha512-gh3UAHbUdDUG6fhLc1Csa4IGdtghue6U8oAIXWnUqawp6lwb3gOCRvp25IUnLF5vUHtgfMxuEUYV7YA2WxVutw==} cpu: [x64] + os: [win32] + + '@oven/bun-windows-x64@1.3.10': + resolution: {integrity: sha512-qaS1In3yfC/Z/IGQriVmF8GWwKuNqiw7feTSJWaQhH5IbL6ENR+4wGNPniZSJFaM/SKUO0e/YCRdoVBvgU4C1g==} + cpu: [x64] + os: [win32] + + '@oxfmt/binding-android-arm-eabi@0.35.0': + resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.35.0': + resolution: {integrity: sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.35.0': + resolution: {integrity: sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.35.0': + resolution: {integrity: sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.35.0': + resolution: {integrity: sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + resolution: {integrity: sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + resolution: {integrity: sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.35.0': + resolution: {integrity: sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.35.0': + resolution: {integrity: sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + resolution: {integrity: sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] os: [linux] - '@oven/bun-linux-x64@1.3.9': - resolution: {integrity: sha512-oQyAW3+ugulvXTZ+XYeUMmNPR94sJeMokfHQoKwPvVwhVkgRuMhcLGV2ZesHCADVu30Oz2MFXbgdC8x4/o9dRg==} + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + resolution: {integrity: sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.35.0': + resolution: {integrity: sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.35.0': + resolution: {integrity: sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.35.0': + resolution: {integrity: sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oven/bun-windows-x64-baseline@1.3.9': - resolution: {integrity: sha512-a/+hSrrDpMD7THyXvE2KJy1skxzAD0cnW4K1WjuI/91VqsphjNzvf5t/ZgxEVL4wb6f+hKrSJ5J3aH47zPr61g==} + '@oxfmt/binding-linux-x64-musl@0.35.0': + resolution: {integrity: sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.35.0': + resolution: {integrity: sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + resolution: {integrity: sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + resolution: {integrity: sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] os: [win32] - '@oven/bun-windows-x64@1.3.9': - resolution: {integrity: sha512-/d6vAmgKvkoYlsGPsRPlPmOK1slPis/F40UG02pYwypTH0wmY0smgzdFqR4YmryxFh17XrW1kITv+U99Oajk9Q==} + '@oxfmt/binding-win32-x64-msvc@0.35.0': + resolution: {integrity: sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1050,128 +1181,128 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] @@ -1186,6 +1317,10 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1237,8 +1372,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.3.0': - resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1249,63 +1384,63 @@ packages: '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} - '@typescript-eslint/eslint-plugin@8.56.0': - resolution: {integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==} + '@typescript-eslint/eslint-plugin@8.56.1': + resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.56.0 + '@typescript-eslint/parser': ^8.56.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.56.0': - resolution: {integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==} + '@typescript-eslint/parser@8.56.1': + resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.56.0': - resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==} + '@typescript-eslint/project-service@8.56.1': + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.56.0': - resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==} + '@typescript-eslint/scope-manager@8.56.1': + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.56.0': - resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==} + '@typescript-eslint/tsconfig-utils@8.56.1': + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.56.0': - resolution: {integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==} + '@typescript-eslint/type-utils@8.56.1': + resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.56.0': - resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==} + '@typescript-eslint/types@8.56.1': + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.56.0': - resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==} + '@typescript-eslint/typescript-estree@8.56.1': + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.56.0': - resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==} + '@typescript-eslint/utils@8.56.1': + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.56.0': - resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==} + '@typescript-eslint/visitor-keys@8.56.1': + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@4.0.18': @@ -1351,8 +1486,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1364,11 +1499,8 @@ packages: ajv: optional: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -1410,15 +1542,15 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@0.3.11: - resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} + ast-v8-to-istanbul@0.3.12: + resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.3: - resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} - engines: {node: 20 || >=22} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -1432,16 +1564,16 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bun@1.3.9: - resolution: {integrity: sha512-v5hkh1us7sMNjfimWE70flYbD5I1/qWQaqmJ45q2qk5H/7muQVa478LSVRSFyGTBUBog2LsPQnfIRdjyWJRY+A==} + bun@1.3.10: + resolution: {integrity: sha512-S/CXaXXIyA4CMjdMkYQ4T2YMqnAn4s0ysD3mlsY4bUiOCqGlv28zck4Wd4H4kpvbekx15S9mUeLQ7Uxd0tYTLA==} cpu: [arm64, x64] os: [darwin, linux, win32] hasBin: true @@ -1497,8 +1629,8 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} cli-width@4.1.0: @@ -1541,12 +1673,12 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - conventional-changelog-angular@8.1.0: - resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} + conventional-changelog-angular@8.3.0: + resolution: {integrity: sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==} engines: {node: '>=18'} - conventional-changelog-conventionalcommits@9.1.0: - resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==} + conventional-changelog-conventionalcommits@9.3.0: + resolution: {integrity: sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==} engines: {node: '>=18'} conventional-changelog-preset-loader@5.0.0: @@ -1557,8 +1689,8 @@ packages: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.2.1: - resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + conventional-commits-parser@6.3.0: + resolution: {integrity: sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==} engines: {node: '>=18'} hasBin: true @@ -1575,8 +1707,8 @@ packages: cosmiconfig: '>=9' typescript: '>=5' - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1604,13 +1736,23 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1665,10 +1807,10 @@ packages: eslint-parser-plain@0.1.1: resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} - eslint-plugin-format@1.4.0: - resolution: {integrity: sha512-6o3fBJENUZPXlg01ab0vTldr6YThw0dxb49QMVp1V9bI7k22dtXYuWWMm3mitAsntJOt8V4pa7BWHUalTrSBPA==} + eslint-plugin-format@1.5.0: + resolution: {integrity: sha512-jaeOKrxs79Nn6rMkLycPkLHvBVKcgsFG+RqNXb6W9iS9y2Q0NYGhFTLcDUdp5mf01X99wEkjtX2O8cumM7lNMQ==} peerDependencies: - eslint: ^8.40.0 || ^9.0.0 + eslint: ^8.40.0 || ^9.0.0 || ^10.0.0 eslint-plugin-prettier@5.5.5: resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} @@ -1687,20 +1829,20 @@ packages: eslint-rule-docs@1.1.235: resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} - eslint-scope@9.1.0: - resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==} + eslint-scope@9.1.1: + resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@5.0.0: - resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.0: - resolution: {integrity: sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==} + eslint@10.0.2: + resolution: {integrity: sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1709,8 +1851,8 @@ packages: jiti: optional: true - espree@11.1.0: - resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==} + espree@11.1.1: + resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: @@ -1802,8 +1944,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.3.4: + resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2035,8 +2177,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.12.37: - resolution: {integrity: sha512-rDU6bkpuMs8YRt/UpkuYEAsYSoNuDEbrE41I3KNvmXREGH6DGBJ8Wbak4by29wNOQ27zk4g4HL82zf0OGhwRuw==} + libphonenumber-js@1.12.38: + resolution: {integrity: sha512-vwzxmasAy9hZigxtqTbFEwp8ZdZ975TiqVDwj5bKx5sR+zi5ucUQy9mbVTkKM9GzqdLdxux/hTw2nmN5J7POMA==} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} @@ -2045,8 +2187,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.2.7: - resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} + lint-staged@16.3.2: + resolution: {integrity: sha512-xKqhC2AeXLwiAHXguxBjuChoTTWFC6Pees0SHPwOpwlvI3BH7ZADFPddAdN3pgo3aiKgPUx/bxE78JfUnxQnlg==} engines: {node: '>=20.17'} hasBin: true @@ -2117,19 +2259,19 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.2.1: - resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} - engines: {node: 20 || >=22} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.1: + resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2145,10 +2287,6 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nano-spawn@2.0.0: - resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} - engines: {node: '>=20.17'} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2186,14 +2324,15 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@9.0.0: - resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} - engines: {node: '>=20'} - ora@9.3.0: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} + oxfmt@0.35.0: + resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2246,11 +2385,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -2280,8 +2414,8 @@ packages: yaml: optional: true - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2305,6 +2439,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + rc9@3.0.0: + resolution: {integrity: sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -2339,8 +2476,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2378,6 +2515,10 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + smol-toml@1.6.0: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} @@ -2400,10 +2541,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - stdin-discarder@0.3.1: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} engines: {node: '>=18'} @@ -2428,8 +2565,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-final-newline@4.0.0: @@ -2478,6 +2615,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} @@ -2529,8 +2670,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.56.0: - resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + typescript-eslint@8.56.1: + resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2736,10 +2877,10 @@ snapshots: '@actions/io@2.0.0': {} - '@angular-devkit/core@21.1.4(chokidar@5.0.0)': + '@angular-devkit/core@21.2.1(chokidar@5.0.0)': dependencies: - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) jsonc-parser: 3.3.1 picomatch: 4.0.3 rxjs: 7.8.2 @@ -2747,21 +2888,21 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics-cli@21.1.4(@types/node@25.3.0)(chokidar@5.0.0)': + '@angular-devkit/schematics-cli@21.2.1(@types/node@25.3.3)(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.1.4(chokidar@5.0.0) - '@angular-devkit/schematics': 21.1.4(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@25.3.0) + '@angular-devkit/core': 21.2.1(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.1(chokidar@5.0.0) + '@inquirer/prompts': 7.10.1(@types/node@25.3.3) transitivePeerDependencies: - '@types/node' - chokidar - '@angular-devkit/schematics@21.1.4(chokidar@5.0.0)': + '@angular-devkit/schematics@21.2.1(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.1.4(chokidar@5.0.0) + '@angular-devkit/core': 21.2.1(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 - ora: 9.0.0 + ora: 9.3.0 rxjs: 7.8.2 transitivePeerDependencies: - chokidar @@ -2815,32 +2956,32 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@commitlint/cli@20.4.1(@types/node@25.3.0)(typescript@5.9.3)': + '@commitlint/cli@20.4.3(@types/node@25.3.3)(typescript@5.9.3)': dependencies: - '@commitlint/format': 20.4.0 - '@commitlint/lint': 20.4.1 - '@commitlint/load': 20.4.0(@types/node@25.3.0)(typescript@5.9.3) - '@commitlint/read': 20.4.0 - '@commitlint/types': 20.4.0 + '@commitlint/format': 20.4.3 + '@commitlint/lint': 20.4.3 + '@commitlint/load': 20.4.3(@types/node@25.3.3)(typescript@5.9.3) + '@commitlint/read': 20.4.3 + '@commitlint/types': 20.4.3 tinyexec: 1.0.2 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@20.4.1': + '@commitlint/config-conventional@20.4.3': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-conventionalcommits: 9.1.0 + '@commitlint/types': 20.4.3 + conventional-changelog-conventionalcommits: 9.3.0 - '@commitlint/config-validator@20.4.0': + '@commitlint/config-validator@20.4.3': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.4.3 ajv: 8.18.0 - '@commitlint/ensure@20.4.1': + '@commitlint/ensure@20.4.3': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.4.3 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -2849,31 +2990,31 @@ snapshots: '@commitlint/execute-rule@20.0.0': {} - '@commitlint/format@20.4.0': + '@commitlint/format@20.4.3': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.4.3 picocolors: 1.1.1 - '@commitlint/is-ignored@20.4.1': + '@commitlint/is-ignored@20.4.3': dependencies: - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.4.3 semver: 7.7.4 - '@commitlint/lint@20.4.1': + '@commitlint/lint@20.4.3': dependencies: - '@commitlint/is-ignored': 20.4.1 - '@commitlint/parse': 20.4.1 - '@commitlint/rules': 20.4.1 - '@commitlint/types': 20.4.0 + '@commitlint/is-ignored': 20.4.3 + '@commitlint/parse': 20.4.3 + '@commitlint/rules': 20.4.3 + '@commitlint/types': 20.4.3 - '@commitlint/load@20.4.0(@types/node@25.3.0)(typescript@5.9.3)': + '@commitlint/load@20.4.3(@types/node@25.3.3)(typescript@5.9.3)': dependencies: - '@commitlint/config-validator': 20.4.0 + '@commitlint/config-validator': 20.4.3 '@commitlint/execute-rule': 20.0.0 - '@commitlint/resolve-extends': 20.4.0 - '@commitlint/types': 20.4.0 - cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.3.0)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + '@commitlint/resolve-extends': 20.4.3 + '@commitlint/types': 20.4.3 + cosmiconfig: 9.0.1(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.3.3)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3) is-plain-obj: 4.1.0 lodash.mergewith: 4.6.2 picocolors: 1.1.1 @@ -2881,60 +3022,60 @@ snapshots: - '@types/node' - typescript - '@commitlint/message@20.4.0': {} + '@commitlint/message@20.4.3': {} - '@commitlint/parse@20.4.1': + '@commitlint/parse@20.4.3': dependencies: - '@commitlint/types': 20.4.0 - conventional-changelog-angular: 8.1.0 - conventional-commits-parser: 6.2.1 + '@commitlint/types': 20.4.3 + conventional-changelog-angular: 8.3.0 + conventional-commits-parser: 6.3.0 - '@commitlint/read@20.4.0': + '@commitlint/read@20.4.3': dependencies: - '@commitlint/top-level': 20.4.0 - '@commitlint/types': 20.4.0 + '@commitlint/top-level': 20.4.3 + '@commitlint/types': 20.4.3 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 1.0.2 - '@commitlint/resolve-extends@20.4.0': + '@commitlint/resolve-extends@20.4.3': dependencies: - '@commitlint/config-validator': 20.4.0 - '@commitlint/types': 20.4.0 + '@commitlint/config-validator': 20.4.3 + '@commitlint/types': 20.4.3 global-directory: 4.0.1 import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@20.4.1': + '@commitlint/rules@20.4.3': dependencies: - '@commitlint/ensure': 20.4.1 - '@commitlint/message': 20.4.0 + '@commitlint/ensure': 20.4.3 + '@commitlint/message': 20.4.3 '@commitlint/to-lines': 20.0.0 - '@commitlint/types': 20.4.0 + '@commitlint/types': 20.4.3 '@commitlint/to-lines@20.0.0': {} - '@commitlint/top-level@20.4.0': + '@commitlint/top-level@20.4.3': dependencies: escalade: 3.2.0 - '@commitlint/types@20.4.0': + '@commitlint/types@20.4.3': dependencies: - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.3.0 picocolors: 1.1.1 - '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1)': + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0)': dependencies: '@types/semver': 7.7.1 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.3.0 '@dprint/formatter@0.5.1': {} - '@dprint/markdown@0.20.0': {} + '@dprint/markdown@0.21.1': {} '@dprint/toml@0.7.0': {} @@ -3016,18 +3157,18 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.2(jiti@2.6.1))': dependencies: - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.1': + '@eslint/config-array@0.23.2': dependencies: - '@eslint/object-schema': 3.0.1 + '@eslint/object-schema': 3.0.2 debug: 4.4.3 - minimatch: 10.2.1 + minimatch: 10.2.4 transitivePeerDependencies: - supports-color @@ -3039,9 +3180,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@9.39.2': {} + '@eslint/js@9.39.3': {} - '@eslint/object-schema@3.0.1': {} + '@eslint/object-schema@3.0.2': {} '@eslint/plugin-kit@0.6.0': dependencies: @@ -3086,245 +3227,245 @@ snapshots: '@inquirer/ansi@2.0.3': {} - '@inquirer/checkbox@4.3.2(@types/node@25.3.0)': + '@inquirer/checkbox@4.3.2(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/checkbox@5.0.7(@types/node@25.3.0)': + '@inquirer/checkbox@5.1.0(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.4(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/confirm@5.1.21(@types/node@25.3.0)': + '@inquirer/confirm@5.1.21(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/confirm@6.0.7(@types/node@25.3.0)': + '@inquirer/confirm@6.0.8(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/core@10.3.2(@types/node@25.3.0)': + '@inquirer/core@10.3.2(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.3) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/core@11.1.4(@types/node@25.3.0)': + '@inquirer/core@11.1.5(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 2.0.3 '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/type': 4.0.3(@types/node@25.3.3) cli-width: 4.1.0 fast-wrap-ansi: 0.2.0 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/editor@4.2.23(@types/node@25.3.0)': + '@inquirer/editor@4.2.23(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/external-editor': 1.0.3(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/editor@5.0.7(@types/node@25.3.0)': + '@inquirer/editor@5.0.8(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/external-editor': 2.0.3(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/external-editor': 2.0.3(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/expand@4.0.23(@types/node@25.3.0)': + '@inquirer/expand@4.0.23(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/expand@5.0.7(@types/node@25.3.0)': + '@inquirer/expand@5.0.8(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/external-editor@1.0.3(@types/node@25.3.0)': + '@inquirer/external-editor@1.0.3(@types/node@25.3.3)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/external-editor@2.0.3(@types/node@25.3.0)': + '@inquirer/external-editor@2.0.3(@types/node@25.3.3)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 '@inquirer/figures@1.0.15': {} '@inquirer/figures@2.0.3': {} - '@inquirer/input@4.3.1(@types/node@25.3.0)': + '@inquirer/input@4.3.1(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/input@5.0.7(@types/node@25.3.0)': + '@inquirer/input@5.0.8(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/number@3.0.23(@types/node@25.3.0)': + '@inquirer/number@3.0.23(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/number@4.0.7(@types/node@25.3.0)': + '@inquirer/number@4.0.8(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/password@4.0.23(@types/node@25.3.0)': + '@inquirer/password@4.0.23(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/password@5.0.7(@types/node@25.3.0)': + '@inquirer/password@5.0.8(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 - - '@inquirer/prompts@7.10.1(@types/node@25.3.0)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.3.0) - '@inquirer/confirm': 5.1.21(@types/node@25.3.0) - '@inquirer/editor': 4.2.23(@types/node@25.3.0) - '@inquirer/expand': 4.0.23(@types/node@25.3.0) - '@inquirer/input': 4.3.1(@types/node@25.3.0) - '@inquirer/number': 3.0.23(@types/node@25.3.0) - '@inquirer/password': 4.0.23(@types/node@25.3.0) - '@inquirer/rawlist': 4.1.11(@types/node@25.3.0) - '@inquirer/search': 3.2.2(@types/node@25.3.0) - '@inquirer/select': 4.4.2(@types/node@25.3.0) + '@types/node': 25.3.3 + + '@inquirer/prompts@7.10.1(@types/node@25.3.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.3.3) + '@inquirer/confirm': 5.1.21(@types/node@25.3.3) + '@inquirer/editor': 4.2.23(@types/node@25.3.3) + '@inquirer/expand': 4.0.23(@types/node@25.3.3) + '@inquirer/input': 4.3.1(@types/node@25.3.3) + '@inquirer/number': 3.0.23(@types/node@25.3.3) + '@inquirer/password': 4.0.23(@types/node@25.3.3) + '@inquirer/rawlist': 4.1.11(@types/node@25.3.3) + '@inquirer/search': 3.2.2(@types/node@25.3.3) + '@inquirer/select': 4.4.2(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 - - '@inquirer/prompts@8.2.1(@types/node@25.3.0)': - dependencies: - '@inquirer/checkbox': 5.0.7(@types/node@25.3.0) - '@inquirer/confirm': 6.0.7(@types/node@25.3.0) - '@inquirer/editor': 5.0.7(@types/node@25.3.0) - '@inquirer/expand': 5.0.7(@types/node@25.3.0) - '@inquirer/input': 5.0.7(@types/node@25.3.0) - '@inquirer/number': 4.0.7(@types/node@25.3.0) - '@inquirer/password': 5.0.7(@types/node@25.3.0) - '@inquirer/rawlist': 5.2.3(@types/node@25.3.0) - '@inquirer/search': 4.1.3(@types/node@25.3.0) - '@inquirer/select': 5.0.7(@types/node@25.3.0) + '@types/node': 25.3.3 + + '@inquirer/prompts@8.3.0(@types/node@25.3.3)': + dependencies: + '@inquirer/checkbox': 5.1.0(@types/node@25.3.3) + '@inquirer/confirm': 6.0.8(@types/node@25.3.3) + '@inquirer/editor': 5.0.8(@types/node@25.3.3) + '@inquirer/expand': 5.0.8(@types/node@25.3.3) + '@inquirer/input': 5.0.8(@types/node@25.3.3) + '@inquirer/number': 4.0.8(@types/node@25.3.3) + '@inquirer/password': 5.0.8(@types/node@25.3.3) + '@inquirer/rawlist': 5.2.4(@types/node@25.3.3) + '@inquirer/search': 4.1.4(@types/node@25.3.3) + '@inquirer/select': 5.1.0(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/rawlist@4.1.11(@types/node@25.3.0)': + '@inquirer/rawlist@4.1.11(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.3.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/rawlist@5.2.3(@types/node@25.3.0)': + '@inquirer/rawlist@5.2.4(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/search@3.2.2(@types/node@25.3.0)': + '@inquirer/search@3.2.2(@types/node@25.3.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/search@4.1.3(@types/node@25.3.0)': + '@inquirer/search@4.1.4(@types/node@25.3.3)': dependencies: - '@inquirer/core': 11.1.4(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/select@4.4.2(@types/node@25.3.0)': + '@inquirer/select@4.4.2(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.0) + '@inquirer/core': 10.3.2(@types/node@25.3.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.0) + '@inquirer/type': 3.0.10(@types/node@25.3.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/select@5.0.7(@types/node@25.3.0)': + '@inquirer/select@5.1.0(@types/node@25.3.3)': dependencies: '@inquirer/ansi': 2.0.3 - '@inquirer/core': 11.1.4(@types/node@25.3.0) + '@inquirer/core': 11.1.5(@types/node@25.3.3) '@inquirer/figures': 2.0.3 - '@inquirer/type': 4.0.3(@types/node@25.3.0) + '@inquirer/type': 4.0.3(@types/node@25.3.3) optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/type@3.0.10(@types/node@25.3.0)': + '@inquirer/type@3.0.10(@types/node@25.3.3)': optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 - '@inquirer/type@4.0.3(@types/node@25.3.0)': + '@inquirer/type@4.0.3(@types/node@25.3.3)': optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -3349,7 +3490,7 @@ snapshots: '@nanoforge-dev/loader-client@1.2.0': dependencies: '@nanoforge-dev/loader-website': 1.1.0 - bun: 1.3.9 + bun: 1.3.10 '@nanoforge-dev/loader-server@1.1.0': {} @@ -3357,21 +3498,21 @@ snapshots: '@nanoforge-dev/schematics@1.2.0(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.1.4(chokidar@5.0.0) - '@angular-devkit/schematics': 21.1.4(chokidar@5.0.0) + '@angular-devkit/core': 21.2.1(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.1(chokidar@5.0.0) transitivePeerDependencies: - chokidar - '@nanoforge-dev/utils-eslint-config@1.0.2(@types/eslint@9.6.1)(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1)(typescript@5.9.3)': + '@nanoforge-dev/utils-eslint-config@1.0.2(@types/eslint@9.6.1)(eslint@10.0.2(jiti@2.6.1))(prettier@3.8.1)(typescript@5.9.3)': dependencies: - '@eslint/js': 9.39.2 + '@eslint/js': 9.39.3 '@favware/cliff-jumper': 6.0.0 - eslint-config-prettier: 10.1.8(eslint@10.0.0(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.0.2(jiti@2.6.1)) eslint-formatter-pretty: 7.0.0 - eslint-plugin-format: 1.4.0(eslint@10.0.0(jiti@2.6.1)) - eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)))(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1) + eslint-plugin-format: 1.5.0(eslint@10.0.2(jiti@2.6.1)) + eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.2(jiti@2.6.1)))(eslint@10.0.2(jiti@2.6.1))(prettier@3.8.1) globals: 16.5.0 - typescript-eslint: 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - '@types/eslint' - eslint @@ -3487,114 +3628,174 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 - '@oven/bun-darwin-aarch64@1.3.9': + '@oven/bun-darwin-aarch64@1.3.10': + optional: true + + '@oven/bun-darwin-x64-baseline@1.3.10': + optional: true + + '@oven/bun-darwin-x64@1.3.10': + optional: true + + '@oven/bun-linux-aarch64-musl@1.3.10': + optional: true + + '@oven/bun-linux-aarch64@1.3.10': + optional: true + + '@oven/bun-linux-x64-baseline@1.3.10': + optional: true + + '@oven/bun-linux-x64-musl-baseline@1.3.10': + optional: true + + '@oven/bun-linux-x64-musl@1.3.10': + optional: true + + '@oven/bun-linux-x64@1.3.10': + optional: true + + '@oven/bun-windows-aarch64@1.3.10': + optional: true + + '@oven/bun-windows-x64-baseline@1.3.10': + optional: true + + '@oven/bun-windows-x64@1.3.10': + optional: true + + '@oxfmt/binding-android-arm-eabi@0.35.0': + optional: true + + '@oxfmt/binding-android-arm64@0.35.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.35.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.35.0': optional: true - '@oven/bun-darwin-x64-baseline@1.3.9': + '@oxfmt/binding-freebsd-x64@0.35.0': optional: true - '@oven/bun-darwin-x64@1.3.9': + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': optional: true - '@oven/bun-linux-aarch64-musl@1.3.9': + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': optional: true - '@oven/bun-linux-aarch64@1.3.9': + '@oxfmt/binding-linux-arm64-gnu@0.35.0': optional: true - '@oven/bun-linux-x64-baseline@1.3.9': + '@oxfmt/binding-linux-arm64-musl@0.35.0': optional: true - '@oven/bun-linux-x64-musl-baseline@1.3.9': + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': optional: true - '@oven/bun-linux-x64-musl@1.3.9': + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': optional: true - '@oven/bun-linux-x64@1.3.9': + '@oxfmt/binding-linux-riscv64-musl@0.35.0': optional: true - '@oven/bun-windows-x64-baseline@1.3.9': + '@oxfmt/binding-linux-s390x-gnu@0.35.0': optional: true - '@oven/bun-windows-x64@1.3.9': + '@oxfmt/binding-linux-x64-gnu@0.35.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.35.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.35.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.35.0': optional: true '@pkgr/core@0.2.9': {} - '@rollup/rollup-android-arm-eabi@4.57.1': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-android-arm64@4.57.1': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-arm64@4.57.1': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-x64@4.57.1': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true '@sapphire/result@2.8.0': {} @@ -3603,6 +3804,8 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@simple-libs/stream-utils@1.2.0': {} + '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -3617,7 +3820,7 @@ snapshots: '@babel/types': 7.29.0 javascript-natural-sort: 0.7.1 lodash-es: 4.17.23 - minimatch: 9.0.5 + minimatch: 9.0.9 parse-imports-exports: 0.2.4 prettier: 3.8.1 transitivePeerDependencies: @@ -3646,7 +3849,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.3.0': + '@types/node@25.3.3': dependencies: undici-types: 7.18.2 @@ -3654,19 +3857,19 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 '@types/validator@13.15.10': {} - '@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/type-utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.0 - eslint: 10.0.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/type-utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 + eslint: 10.0.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3674,58 +3877,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3 - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) - '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.56.0': + '@typescript-eslint/scope-manager@8.56.1': dependencies: - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 - '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.56.0': {} + '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/visitor-keys': 8.56.0 + '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3 - minimatch: 9.0.5 + minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3733,27 +3936,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.56.0 - '@typescript-eslint/types': 8.56.0 - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - eslint: 10.0.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.56.0': + '@typescript-eslint/visitor-keys@8.56.1': dependencies: - '@typescript-eslint/types': 8.56.0 - eslint-visitor-keys: 5.0.0 + '@typescript-eslint/types': 8.56.1 + eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 - ast-v8-to-istanbul: 0.3.11 + ast-v8-to-istanbul: 0.3.12 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 @@ -3761,7 +3964,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) '@vitest/expect@4.0.18': dependencies: @@ -3772,13 +3975,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -3802,30 +4005,23 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} - ajv-formats@3.0.1(ajv@8.17.1): + ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -3857,7 +4053,7 @@ snapshots: assertion-error@2.0.1: {} - ast-v8-to-istanbul@0.3.11: + ast-v8-to-istanbul@0.3.12: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -3865,7 +4061,7 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@4.0.3: {} + balanced-match@4.0.4: {} before-after-hook@2.2.3: {} @@ -3877,27 +4073,28 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.2: + brace-expansion@5.0.4: dependencies: - balanced-match: 4.0.3 + balanced-match: 4.0.4 braces@3.0.3: dependencies: fill-range: 7.1.1 - bun@1.3.9: + bun@1.3.10: optionalDependencies: - '@oven/bun-darwin-aarch64': 1.3.9 - '@oven/bun-darwin-x64': 1.3.9 - '@oven/bun-darwin-x64-baseline': 1.3.9 - '@oven/bun-linux-aarch64': 1.3.9 - '@oven/bun-linux-aarch64-musl': 1.3.9 - '@oven/bun-linux-x64': 1.3.9 - '@oven/bun-linux-x64-baseline': 1.3.9 - '@oven/bun-linux-x64-musl': 1.3.9 - '@oven/bun-linux-x64-musl-baseline': 1.3.9 - '@oven/bun-windows-x64': 1.3.9 - '@oven/bun-windows-x64-baseline': 1.3.9 + '@oven/bun-darwin-aarch64': 1.3.10 + '@oven/bun-darwin-x64': 1.3.10 + '@oven/bun-darwin-x64-baseline': 1.3.10 + '@oven/bun-linux-aarch64': 1.3.10 + '@oven/bun-linux-aarch64-musl': 1.3.10 + '@oven/bun-linux-x64': 1.3.10 + '@oven/bun-linux-x64-baseline': 1.3.10 + '@oven/bun-linux-x64-musl': 1.3.10 + '@oven/bun-linux-x64-musl-baseline': 1.3.10 + '@oven/bun-windows-aarch64': 1.3.10 + '@oven/bun-windows-x64': 1.3.10 + '@oven/bun-windows-x64-baseline': 1.3.10 bundle-require@5.1.0(esbuild@0.27.3): dependencies: @@ -3929,7 +4126,7 @@ snapshots: class-validator@0.15.1: dependencies: '@types/validator': 13.15.10 - libphonenumber-js: 1.12.37 + libphonenumber-js: 1.12.38 validator: 13.15.26 cli-cursor@5.0.0: @@ -3938,9 +4135,9 @@ snapshots: cli-spinners@3.4.0: {} - cli-truncate@5.1.1: + cli-truncate@5.2.0: dependencies: - slice-ansi: 7.1.2 + slice-ansi: 8.0.0 string-width: 8.2.0 cli-width@4.1.0: {} @@ -3974,11 +4171,11 @@ snapshots: consola@3.4.2: {} - conventional-changelog-angular@8.1.0: + conventional-changelog-angular@8.3.0: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@9.1.0: + conventional-changelog-conventionalcommits@9.3.0: dependencies: compare-func: 2.0.0 @@ -3986,26 +4183,27 @@ snapshots: conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.2.1: + conventional-commits-parser@6.3.0: dependencies: + '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 conventional-recommended-bump@10.0.0: dependencies: - '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.3.0) conventional-changelog-preset-loader: 5.0.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.3.0 meow: 13.2.0 - cosmiconfig-typescript-loader@6.2.0(@types/node@25.3.0)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@25.3.3)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 25.3.0 - cosmiconfig: 9.0.0(typescript@5.9.3) + '@types/node': 25.3.3 + cosmiconfig: 9.0.1(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 @@ -4028,12 +4226,18 @@ snapshots: deep-is@0.1.4: {} + defu@6.1.4: {} + deprecation@2.3.1: {} + destr@2.0.5: {} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 + dotenv@17.3.1: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -4083,9 +4287,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.0.2(jiti@2.6.1)): dependencies: - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) eslint-formatter-pretty@7.0.0: dependencies: @@ -4098,38 +4302,39 @@ snapshots: string-width: 8.2.0 supports-hyperlinks: 4.4.0 - eslint-formatting-reporter@0.0.0(eslint@10.0.0(jiti@2.6.1)): + eslint-formatting-reporter@0.0.0(eslint@10.0.2(jiti@2.6.1)): dependencies: - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) prettier-linter-helpers: 1.0.1 eslint-parser-plain@0.1.1: {} - eslint-plugin-format@1.4.0(eslint@10.0.0(jiti@2.6.1)): + eslint-plugin-format@1.5.0(eslint@10.0.2(jiti@2.6.1)): dependencies: '@dprint/formatter': 0.5.1 - '@dprint/markdown': 0.20.0 + '@dprint/markdown': 0.21.1 '@dprint/toml': 0.7.0 - eslint: 10.0.0(jiti@2.6.1) - eslint-formatting-reporter: 0.0.0(eslint@10.0.0(jiti@2.6.1)) + eslint: 10.0.2(jiti@2.6.1) + eslint-formatting-reporter: 0.0.0(eslint@10.0.2(jiti@2.6.1)) eslint-parser-plain: 0.1.1 ohash: 2.0.11 + oxfmt: 0.35.0 prettier: 3.8.1 synckit: 0.11.12 - eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)))(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1): + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.2(jiti@2.6.1)))(eslint@10.0.2(jiti@2.6.1))(prettier@3.8.1): dependencies: - eslint: 10.0.0(jiti@2.6.1) + eslint: 10.0.2(jiti@2.6.1) prettier: 3.8.1 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@10.0.0(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.0.2(jiti@2.6.1)) eslint-rule-docs@1.1.235: {} - eslint-scope@9.1.0: + eslint-scope@9.1.1: dependencies: '@types/esrecurse': 4.3.1 '@types/estree': 1.0.8 @@ -4138,13 +4343,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@5.0.0: {} + eslint-visitor-keys@5.0.1: {} - eslint@10.0.0(jiti@2.6.1): + eslint@10.0.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.1 + '@eslint/config-array': 0.23.2 '@eslint/config-helpers': 0.5.2 '@eslint/core': 1.1.0 '@eslint/plugin-kit': 0.6.0 @@ -4152,13 +4357,13 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.12.6 + ajv: 6.14.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 9.1.0 - eslint-visitor-keys: 5.0.0 - espree: 11.1.0 + eslint-scope: 9.1.1 + eslint-visitor-keys: 5.0.1 + espree: 11.1.1 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -4169,7 +4374,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.1 + minimatch: 10.2.4 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -4177,11 +4382,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@11.1.0: + espree@11.1.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 5.0.0 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 esquery@1.7.0: dependencies: @@ -4264,15 +4469,15 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 - mlly: 1.8.0 - rollup: 4.57.1 + mlly: 1.8.1 + rollup: 4.59.0 flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.3.4 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.3.4: {} fsevents@2.3.3: optional: true @@ -4440,25 +4645,24 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.12.37: {} + libphonenumber-js@1.12.38: {} lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} - lint-staged@16.2.7: + lint-staged@16.3.2: dependencies: commander: 14.0.3 listr2: 9.0.5 micromatch: 4.0.8 - nano-spawn: 2.0.0 - pidtree: 0.6.0 string-argv: 0.3.2 + tinyexec: 1.0.2 yaml: 2.8.2 listr2@9.0.5: dependencies: - cli-truncate: 5.1.1 + cli-truncate: 5.2.0 colorette: 2.0.20 eventemitter3: 5.0.4 log-update: 6.1.0 @@ -4495,7 +4699,7 @@ snapshots: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 magic-string@0.30.21: @@ -4523,19 +4727,19 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.2.1: + minimatch@10.2.4: dependencies: - brace-expansion: 5.0.2 + brace-expansion: 5.0.4 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 minimist@1.2.8: {} - mlly@1.8.0: + mlly@1.8.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -4552,8 +4756,6 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-spawn@2.0.0: {} - nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -4593,18 +4795,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@9.0.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 3.4.0 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 7.0.1 - stdin-discarder: 0.2.2 - string-width: 8.2.0 - strip-ansi: 7.1.2 - ora@9.3.0: dependencies: chalk: 5.6.2 @@ -4616,6 +4806,30 @@ snapshots: stdin-discarder: 0.3.1 string-width: 8.2.0 + oxfmt@0.35.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.35.0 + '@oxfmt/binding-android-arm64': 0.35.0 + '@oxfmt/binding-darwin-arm64': 0.35.0 + '@oxfmt/binding-darwin-x64': 0.35.0 + '@oxfmt/binding-freebsd-x64': 0.35.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.35.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.35.0 + '@oxfmt/binding-linux-arm64-gnu': 0.35.0 + '@oxfmt/binding-linux-arm64-musl': 0.35.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-musl': 0.35.0 + '@oxfmt/binding-linux-s390x-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-musl': 0.35.0 + '@oxfmt/binding-openharmony-arm64': 0.35.0 + '@oxfmt/binding-win32-arm64-msvc': 0.35.0 + '@oxfmt/binding-win32-ia32-msvc': 0.35.0 + '@oxfmt/binding-win32-x64-msvc': 0.35.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -4657,29 +4871,27 @@ snapshots: picomatch@4.0.3: {} - pidtree@0.6.0: {} - pirates@4.0.7: {} pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.0 + mlly: 1.8.1 pathe: 2.0.3 plur@5.1.0: dependencies: irregular-plurals: 3.5.0 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.6 + postcss: 8.5.8 yaml: 2.8.2 - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -4699,6 +4911,11 @@ snapshots: punycode@2.3.1: {} + rc9@3.0.0: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + readdirp@4.1.2: {} readdirp@5.0.0: {} @@ -4720,35 +4937,35 @@ snapshots: rfdc@1.4.1: {} - rollup@4.57.1: + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 rxjs@7.8.2: @@ -4778,6 +4995,11 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + smol-toml@1.6.0: {} source-map-js@1.2.1: {} @@ -4790,8 +5012,6 @@ snapshots: std-env@3.10.0: {} - stdin-discarder@0.2.2: {} - stdin-discarder@0.3.1: {} string-argv@0.3.2: {} @@ -4806,18 +5026,18 @@ snapshots: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@8.2.0: dependencies: get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -4867,6 +5087,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@2.1.0: {} + tinyrainbow@3.0.3: {} to-regex-range@5.0.1: @@ -4883,7 +5105,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 @@ -4894,16 +5116,16 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2) resolve-from: 5.0.0 - rollup: 4.57.1 + rollup: 4.59.0 source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 typescript: 5.9.3 transitivePeerDependencies: - jiti @@ -4917,13 +5139,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.0(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4954,24 +5176,24 @@ snapshots: validator@13.15.26: {} - vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2): + vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.57.1 + postcss: 8.5.8 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 fsevents: 2.3.3 jiti: 2.6.1 yaml: 2.8.2 - vitest@4.0.18(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2): + vitest@4.0.18(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -4988,10 +5210,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.3.0 + '@types/node': 25.3.3 transitivePeerDependencies: - jiti - less @@ -5032,7 +5254,7 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrappy@1.0.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ae05908..ed4014d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,41 +1,43 @@ catalogs: build: + dotenv: ^17.3.1 tsup: ^8.5.1 typescript: ^5.9.3 ci: - '@commitlint/cli': ^20.4.1 - '@commitlint/config-conventional': ^20.4.1 + '@commitlint/cli': ^20.4.3 + '@commitlint/config-conventional': ^20.4.3 '@favware/cliff-jumper': ^6.0.0 '@nanoforge-dev/actions': ^1.1.0 husky: ^9.1.7 - lint-staged: ^16.2.7 + lint-staged: ^16.3.2 cli: - '@inquirer/prompts': ^8.2.1 + '@inquirer/prompts': ^8.3.0 '@types/inquirer': ^9.0.9 ansis: ^4.2.0 commander: ^14.0.3 node-emoji: ^2.2.0 ora: ^9.3.0 core: - '@types/node': ^25.3.0 - bun: ^1.3.9 + '@types/node': ^25.3.3 + bun: ^1.3.10 libs: chokidar: ^5.0.0 class-transformer: ^0.5.1 class-validator: ^0.15.1 + rc9: ^3.0.0 reflect-metadata: ^0.2.2 lint: '@nanoforge-dev/utils-eslint-config': ^1.0.2 '@nanoforge-dev/utils-prettier-config': ^1.0.2 '@trivago/prettier-plugin-sort-imports': ^6.0.2 - eslint: ^10.0.0 + eslint: ^10.0.2 prettier: ^3.8.1 loader: '@nanoforge-dev/loader-client': ^1.2.0 '@nanoforge-dev/loader-server': ^1.1.0 schematics: - '@angular-devkit/schematics': ^21.1.4 - '@angular-devkit/schematics-cli': ^21.1.4 + '@angular-devkit/schematics': ^21.2.1 + '@angular-devkit/schematics-cli': ^21.2.1 '@nanoforge-dev/schematics': ^1.2.0 tests: '@vitest/coverage-v8': ^4.0.18 diff --git a/src/action/actions/login.action.ts b/src/action/actions/login.action.ts new file mode 100644 index 0000000..e49ec9a --- /dev/null +++ b/src/action/actions/login.action.ts @@ -0,0 +1,30 @@ +import { GlobalConfigHandler } from "@lib/global-config"; +import { withAuth } from "@lib/http"; +import { type Input, getDirectoryInput, getLocalInput, getLoginApiKeyInputOrAsk } from "@lib/input"; +import { Messages } from "@lib/ui"; + +import { AbstractAction, type HandleResult } from "../abstract.action"; + +export class LoginAction extends AbstractAction { + protected startMessage = Messages.LOGIN_START; + protected successMessage = Messages.LOGIN_SUCCESS; + protected failureMessage = Messages.LOGIN_FAILED; + + public async handle(_args: Input, options: Input): Promise { + const directory = getDirectoryInput(options); + const isLocal = getLocalInput(options); + const apiKey = await getLoginApiKeyInputOrAsk(options); + + await withAuth(apiKey, true).post("/registry-key/verify"); + + GlobalConfigHandler.write( + { + apiKey, + }, + isLocal, + directory, + ); + + return { success: true }; + } +} diff --git a/src/action/actions/logout.action.ts b/src/action/actions/logout.action.ts new file mode 100644 index 0000000..5d9260d --- /dev/null +++ b/src/action/actions/logout.action.ts @@ -0,0 +1,26 @@ +import { GlobalConfigHandler } from "@lib/global-config"; +import { type Input, getDirectoryInput, getLocalInput } from "@lib/input"; +import { Messages } from "@lib/ui"; + +import { AbstractAction, type HandleResult } from "../abstract.action"; + +export class LogoutAction extends AbstractAction { + protected startMessage = Messages.LOGOUT_START; + protected successMessage = Messages.LOGOUT_SUCCESS; + protected failureMessage = Messages.LOGOUT_FAILED; + + public async handle(_args: Input, options: Input): Promise { + const directory = getDirectoryInput(options); + const isLocal = getLocalInput(options); + + GlobalConfigHandler.write( + { + apiKey: null, + }, + isLocal, + directory, + ); + + return { success: true }; + } +} diff --git a/src/action/index.ts b/src/action/index.ts index d2caa5a..11a9655 100644 --- a/src/action/index.ts +++ b/src/action/index.ts @@ -2,5 +2,7 @@ export * from "./actions/build.action"; export * from "./actions/dev.action"; export * from "./actions/generate.action"; export * from "./actions/install.action"; +export * from "./actions/login.action"; +export * from "./actions/logout.action"; export * from "./actions/new.action"; export * from "./actions/start.action"; diff --git a/src/command/command.loader.ts b/src/command/command.loader.ts index 644b54e..78df8a9 100644 --- a/src/command/command.loader.ts +++ b/src/command/command.loader.ts @@ -8,6 +8,8 @@ import { DevAction, GenerateAction, InstallAction, + LoginAction, + LogoutAction, NewAction, StartAction, } from "~/action"; @@ -16,6 +18,8 @@ import { BuildCommand } from "./commands/build.command"; import { DevCommand } from "./commands/dev.command"; import { GenerateCommand } from "./commands/generate.command"; import { InstallCommand } from "./commands/install.command"; +import { LoginCommand } from "./commands/login.command"; +import { LogoutCommand } from "./commands/logout.command"; import { NewCommand } from "./commands/new.command"; import { StartCommand } from "./commands/start.command"; @@ -25,6 +29,8 @@ export class CommandLoader { new DevCommand(new DevAction()).load(program); new GenerateCommand(new GenerateAction()).load(program); new InstallCommand(new InstallAction()).load(program); + new LoginCommand(new LoginAction()).load(program); + new LogoutCommand(new LogoutAction()).load(program); new NewCommand(new NewAction()).load(program); new StartCommand(new StartAction()).load(program); this.handleInvalidCommand(program); diff --git a/src/command/commands/login.command.ts b/src/command/commands/login.command.ts new file mode 100644 index 0000000..24ba672 --- /dev/null +++ b/src/command/commands/login.command.ts @@ -0,0 +1,29 @@ +import { type Command } from "commander"; + +import { AbstractCommand } from "../abstract.command"; + +interface LoginOptions { + directory?: string; + local?: boolean; + apiKey?: string; +} + +export class LoginCommand extends AbstractCommand { + public load(program: Command) { + program + .command("login") + .description("login to Nanoforge registry") + .option("-d, --directory [directory]", "specify the directory of your project") + .option("-l, --local", "login only for the project", false) + .option("-k, --api-key ", "api key for Nanoforge registry") + .action(async (rawOptions: LoginOptions) => { + const options = AbstractCommand.mapToInput({ + directory: rawOptions.directory, + local: rawOptions.local, + apiKey: rawOptions.apiKey, + }); + + await this.action.run(new Map(), options); + }); + } +} diff --git a/src/command/commands/logout.command.ts b/src/command/commands/logout.command.ts new file mode 100644 index 0000000..8d778bd --- /dev/null +++ b/src/command/commands/logout.command.ts @@ -0,0 +1,26 @@ +import { type Command } from "commander"; + +import { AbstractCommand } from "../abstract.command"; + +interface LogoutOptions { + directory?: string; + local?: boolean; +} + +export class LogoutCommand extends AbstractCommand { + public load(program: Command) { + program + .command("logout") + .description("logout from Nanoforge registry") + .option("-d, --directory [directory]", "specify the directory of your project") + .option("-l, --local", "logout only for the project") + .action(async (rawOptions: LogoutOptions) => { + const options = AbstractCommand.mapToInput({ + directory: rawOptions.directory, + local: rawOptions.local, + }); + + await this.action.run(new Map(), options); + }); + } +} diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 4216d0b..db78430 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,3 +1,5 @@ export const CONFIG_FILE_NAME = "nanoforge.config.json"; +export const GLOBAL_CONFIG_FILE_NAME = ".nanoforgerc"; export const DEFAULT_DIRECTORY = "."; export const NANOFORGE_DIR = ".nanoforge"; +export const REGISTRY_URL = process.env.REGISTRY_URL; diff --git a/src/lib/global-config/global-config-defaults.ts b/src/lib/global-config/global-config-defaults.ts new file mode 100644 index 0000000..1ff3ccd --- /dev/null +++ b/src/lib/global-config/global-config-defaults.ts @@ -0,0 +1,3 @@ +import { type GlobalConfig } from "./global-config.type"; + +export const GLOBAL_CONFIG_DEFAULTS: GlobalConfig = {}; diff --git a/src/lib/global-config/global-config-handler.ts b/src/lib/global-config/global-config-handler.ts new file mode 100644 index 0000000..0f55253 --- /dev/null +++ b/src/lib/global-config/global-config-handler.ts @@ -0,0 +1,41 @@ +import { read, readUser, write, writeUser } from "rc9"; + +import { GLOBAL_CONFIG_FILE_NAME } from "@lib/constants"; +import { type DeepPartial } from "@lib/types"; + +import { deepMerge, isEmpty } from "@utils/object"; + +import { GLOBAL_CONFIG_DEFAULTS } from "./global-config-defaults"; +import { type GlobalConfig } from "./global-config.type"; + +type CReader = (options: { name: string; dir?: string }) => GlobalConfig; + +export class GlobalConfigHandler { + static read(dir?: string): GlobalConfig { + const localConfig = this._readConfig(read, false, dir); + if (localConfig) return localConfig; + return this._readConfig(readUser, true); + } + + static write(config: DeepPartial, local: boolean = false, dir?: string): void { + const options = { + name: GLOBAL_CONFIG_FILE_NAME, + dir, + }; + if (local) write(config, options); + else writeUser(config, options); + } + + private static _readConfig(func: CReader, force: true): GlobalConfig; + private static _readConfig(func: CReader, force?: false, dir?: string): GlobalConfig | null; + private static _readConfig(func: CReader, force?: boolean, dir?: string): GlobalConfig | null { + const res = func({ + name: GLOBAL_CONFIG_FILE_NAME, + dir, + }); + if (!force) { + if (isEmpty(res)) return null; + } + return deepMerge(GLOBAL_CONFIG_DEFAULTS, res); + } +} diff --git a/src/lib/global-config/global-config.type.ts b/src/lib/global-config/global-config.type.ts new file mode 100644 index 0000000..be11d1a --- /dev/null +++ b/src/lib/global-config/global-config.type.ts @@ -0,0 +1,3 @@ +export interface GlobalConfig { + apiKey?: string | null; +} diff --git a/src/lib/global-config/index.ts b/src/lib/global-config/index.ts new file mode 100644 index 0000000..ae323da --- /dev/null +++ b/src/lib/global-config/index.ts @@ -0,0 +1,2 @@ +export * from "./global-config.type"; +export * from "./global-config-handler"; diff --git a/src/lib/http/client.ts b/src/lib/http/client.ts new file mode 100644 index 0000000..8021279 --- /dev/null +++ b/src/lib/http/client.ts @@ -0,0 +1,23 @@ +import { REGISTRY_URL } from "@lib/constants"; + +import { HttpClient } from "./http-client"; +import { Repository } from "./repository"; + +const client = new HttpClient(REGISTRY_URL ?? ""); + +export const api = new Repository(client); + +export const withAuth = (apiKey?: string, force: boolean = false) => { + if (!apiKey && force) { + console.error("No registry key found. Please use `nf login` to login"); + throw new Error("No apikey found. Please use `nf login` to login"); + } + return new Repository( + new HttpClient(REGISTRY_URL ?? "", { + headers: { + Authorization: apiKey, + "Content-Type": "application/json", + }, + }), + ); +}; diff --git a/src/lib/http/http-client.ts b/src/lib/http/http-client.ts new file mode 100644 index 0000000..5a9402a --- /dev/null +++ b/src/lib/http/http-client.ts @@ -0,0 +1,128 @@ +export type RequestOptions = Omit; + +export interface MiddlewareParams { + path: string; + fullPath: string; + options: RequestOptions; +} + +export type FullResponse = Response & { content: any }; + +export type MiddlewareNext = (params?: MiddlewareParams) => Promise; + +export type Middleware = ( + params: MiddlewareParams, + next: MiddlewareNext, +) => Promise | undefined; + +type BaseRequest = (path: string, options: RequestOptions) => Promise; + +export class HttpClient { + private readonly _baseUrl: string; + private readonly _baseOptions: RequestOptions; + private readonly _middlewares: Middleware[]; + + constructor(baseUrl: string, options?: RequestOptions) { + this._baseUrl = baseUrl; + this._baseOptions = options ?? { + headers: { + "Content-Type": "application/json", + }, + }; + this._middlewares = []; + } + + get(path: string, options?: RequestOptions): Promise { + return this._applyMiddlewares(path, options, (newPath, newOptions) => { + return this._request(newPath, { + ...newOptions, + method: "GET", + }); + }); + } + + post(path: string, body?: string, options?: RequestOptions): Promise { + return this._applyMiddlewares(path, options, (newPath, newOptions) => { + return this._request(newPath, { + ...newOptions, + method: "POST", + body: body, + }); + }); + } + + put(path: string, body?: string, options?: RequestOptions): Promise { + return this._applyMiddlewares(path, options, (newPath, newOptions) => { + return this._request(newPath, { + ...newOptions, + method: "PUT", + body: body, + }); + }); + } + + patch(path: string, body?: string, options?: RequestOptions): Promise { + return this._applyMiddlewares(path, options, async (newPath, newOptions) => { + return this._request(newPath, { + ...newOptions, + method: "PATCH", + body: body, + }); + }); + } + + delete(path: string, options?: RequestOptions): Promise { + return this._applyMiddlewares(path, options, (newPath, newOptions) => { + return this._request(newPath, { + ...newOptions, + method: "DELETE", + body: "{}", + }) as Promise; + }); + } + + useMiddlewares(...middlewares: Middleware[]): HttpClient { + for (const middleware of middlewares) this._middlewares.push(middleware); + return this; + } + + private async _request(path: string, request: RequestInit): Promise { + const res = (await fetch(path, request)) as FullResponse; + res.content = null; + return res; + } + + private _applyMiddlewares( + path: string, + options: RequestOptions | undefined, + callback: BaseRequest, + ): Promise { + const baseParams = { + path, + fullPath: this._getUrl(path), + options: { + ...this._baseOptions, + ...options, + }, + }; + const middlewares = this._middlewares.slice(); + let response: FullResponse; + + const execution = async (params?: MiddlewareParams): Promise => { + if (!params) params = baseParams; + + const middleware = middlewares.shift(); + + if (!middleware) response = (await callback(params.fullPath, params.options)) as FullResponse; + else response = (await middleware(params, execution)) ?? response; + + return response; + }; + + return execution(baseParams); + } + + private _getUrl(path: string): string { + return `${this._baseUrl}${path}`; + } +} diff --git a/src/lib/http/index.ts b/src/lib/http/index.ts new file mode 100644 index 0000000..b011fbc --- /dev/null +++ b/src/lib/http/index.ts @@ -0,0 +1 @@ +export { api, withAuth } from "./client"; diff --git a/src/lib/http/repository.ts b/src/lib/http/repository.ts new file mode 100644 index 0000000..1c3d72a --- /dev/null +++ b/src/lib/http/repository.ts @@ -0,0 +1,73 @@ +import type { HttpClient, RequestOptions } from "./http-client"; + +export class Repository { + private readonly _client: HttpClient; + + constructor(client: HttpClient) { + this._client = client; + } + + get(path: string, options?: RequestOptions): Promise { + return this.runRequest("get", path, options); + } + + post( + path: string, + body?: I, + options?: RequestOptions, + ): Promise { + return this.runRequestBody("post", path, body ?? {}, options); + } + + put( + path: string, + body?: I, + options?: RequestOptions, + ): Promise { + return this.runRequestBody("put", path, body ?? {}, options); + } + + patch( + path: string, + body?: I, + options?: RequestOptions, + ): Promise { + return this.runRequestBody("patch", path, body ?? {}, options); + } + + delete(path: string, options?: RequestOptions): Promise { + return this.runRequest("delete", path, options); + } + + private async runRequest( + request: "get" | "delete", + path: string, + options?: RequestOptions, + ): Promise { + const res = await this._client[request](path, options); + if (!res.ok) + throw new Error(`Request failed with status code ${res.status}`, { + cause: res, + }); + return (await res.json()) as R; + } + + private async runRequestBody( + request: "post" | "put" | "patch", + path: string, + body?: I, + options?: RequestOptions, + ): Promise { + const res = await this._client[request]( + path, + body === undefined ? undefined : JSON.stringify(body), + options, + ); + const data = (await res.json()) as R; + if (!res.ok) + throw new Error(`Request failed with status code ${res.status}`, { + cause: data, + }); + return data; + } +} diff --git a/src/lib/input/inputs/index.ts b/src/lib/input/inputs/index.ts index 67616e0..21255f6 100644 --- a/src/lib/input/inputs/index.ts +++ b/src/lib/input/inputs/index.ts @@ -4,3 +4,4 @@ export * from "./watch.input"; export * from "./dev"; export * from "./install"; +export * from "./login-out"; diff --git a/src/lib/input/inputs/login-out/api-key.input.spec.ts b/src/lib/input/inputs/login-out/api-key.input.spec.ts new file mode 100644 index 0000000..15f4c7c --- /dev/null +++ b/src/lib/input/inputs/login-out/api-key.input.spec.ts @@ -0,0 +1,31 @@ +import { describe, expect, it, vi } from "vitest"; + +import { askInput } from "@lib/question"; + +import { type Input } from "../../input.type"; +import { getLoginApiKeyInputOrAsk } from "./api-key.input"; + +vi.mock("@lib/question", () => ({ + askInput: vi.fn(), +})); + +const createInput = (entries: [string, any][]): Input => { + return new Map(entries.map(([key, value]) => [key, { value }])); +}; + +describe("getLoginApiKeyInputOrAsk", () => { + it("should return the apiKey input when provided", async () => { + const input = createInput([["apiKey", "my-api-key"]]); + + expect(await getLoginApiKeyInputOrAsk(input)).toBe("my-api-key"); + expect(askInput).not.toHaveBeenCalled(); + }); + + it("should call askInput when apiKey is not provided", async () => { + vi.mocked(askInput).mockResolvedValue("asked-api-key"); + const input = createInput([]); + + expect(await getLoginApiKeyInputOrAsk(input)).toBe("asked-api-key"); + expect(askInput).toHaveBeenCalledOnce(); + }); +}); diff --git a/src/lib/input/inputs/login-out/api-key.input.ts b/src/lib/input/inputs/login-out/api-key.input.ts new file mode 100644 index 0000000..31ad344 --- /dev/null +++ b/src/lib/input/inputs/login-out/api-key.input.ts @@ -0,0 +1,18 @@ +import { askInput } from "@lib/question"; +import { Messages } from "@lib/ui"; + +import { getInputOrAsk } from "../../ask-inputs"; +import { getStringInput } from "../../base-inputs"; +import { type Input } from "../../input.type"; + +const getApiKeyInput = (inputs: Input) => { + return getStringInput(inputs, "apiKey"); +}; + +export const getLoginApiKeyInputOrAsk = (inputs: Input) => { + return getInputOrAsk(getApiKeyInput(inputs), () => + askInput(Messages.LOGIN_API_KEY_QUESTION, { + required: true, + }), + ); +}; diff --git a/src/lib/input/inputs/login-out/index.ts b/src/lib/input/inputs/login-out/index.ts new file mode 100644 index 0000000..a81727e --- /dev/null +++ b/src/lib/input/inputs/login-out/index.ts @@ -0,0 +1,2 @@ +export * from "./api-key.input"; +export * from "./local.input"; diff --git a/src/lib/input/inputs/login-out/local.input.spec.ts b/src/lib/input/inputs/login-out/local.input.spec.ts new file mode 100644 index 0000000..8bcc7e3 --- /dev/null +++ b/src/lib/input/inputs/login-out/local.input.spec.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; + +import { type Input } from "../../input.type"; +import { getLocalInput } from "./local.input"; + +const createInput = (entries: [string, any][]): Input => { + return new Map(entries.map(([key, value]) => [key, { value }])); +}; + +describe("getLocalInput", () => { + it("should return the local value when provided", () => { + const input = createInput([["local", true]]); + expect(getLocalInput(input)).toBe(true); + }); + + it("should return false as default when local is missing", () => { + const input = createInput([]); + expect(getLocalInput(input)).toBe(false); + }); +}); diff --git a/src/lib/input/inputs/login-out/local.input.ts b/src/lib/input/inputs/login-out/local.input.ts new file mode 100644 index 0000000..7457e32 --- /dev/null +++ b/src/lib/input/inputs/login-out/local.input.ts @@ -0,0 +1,6 @@ +import { getBooleanInputWithDefault } from "../../base-inputs"; +import { type Input } from "../../input.type"; + +export function getLocalInput(inputs: Input): boolean { + return getBooleanInputWithDefault(inputs, "local", false); +} diff --git a/src/lib/types/deep-partial.type.ts b/src/lib/types/deep-partial.type.ts new file mode 100644 index 0000000..2f49720 --- /dev/null +++ b/src/lib/types/deep-partial.type.ts @@ -0,0 +1,15 @@ +export type DeepPartial = + | T + | (T extends Date + ? T + : T extends Array + ? DeepPartial[] + : T extends Map + ? Map, DeepPartial> + : T extends Set + ? Set> + : T extends object + ? { + [K in keyof T]?: DeepPartial; + } + : T); diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts new file mode 100644 index 0000000..15897bf --- /dev/null +++ b/src/lib/types/index.ts @@ -0,0 +1 @@ +export type * from "./deep-partial.type"; diff --git a/src/lib/ui/messages.ts b/src/lib/ui/messages.ts index 2cb2d9d..1196e37 100644 --- a/src/lib/ui/messages.ts +++ b/src/lib/ui/messages.ts @@ -22,6 +22,17 @@ export const Messages = { INSTALL_FAILED: failure("Installation failed!"), INSTALL_NAMES_QUESTION: "Which libraries do you want to install?", + // --- Login --- + LOGIN_START: "NanoForge Login", + LOGIN_SUCCESS: success("Login completed!"), + LOGIN_FAILED: failure("Login failed!"), + LOGIN_API_KEY_QUESTION: "What is your registry api key?", + + // --- Logout --- + LOGOUT_START: "NanoForge Logout", + LOGOUT_SUCCESS: success("Logout completed!"), + LOGOUT_FAILED: failure("Logout failed!"), + // --- New Project --- NEW_START: "NanoForge Project Creation", NEW_SUCCESS: success("Project successfully created!"), diff --git a/src/lib/utils/errors.ts b/src/lib/utils/errors.ts index 181ebdc..ca5aa97 100644 --- a/src/lib/utils/errors.ts +++ b/src/lib/utils/errors.ts @@ -1,7 +1,7 @@ import { red } from "ansis"; export const getErrorMessage = (error: unknown): string | undefined => { - if (error instanceof Error) return error.message; + if (error instanceof Error) return error.cause as string; if (typeof error === "string") return error; return undefined; }; diff --git a/src/lib/utils/object.ts b/src/lib/utils/object.ts index b42a4e2..a7a29ff 100644 --- a/src/lib/utils/object.ts +++ b/src/lib/utils/object.ts @@ -19,3 +19,5 @@ export const deepMerge = (target: any, ...sources: [any, ...any[]]): any => { return deepMerge(target, ...sources); }; + +export const isEmpty = (target: any) => Object.keys(target).length === 0; diff --git a/tsup.config.ts b/tsup.config.ts index 92df2d1..9ca1292 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,3 +1,5 @@ +import dotenv from "dotenv"; +import { resolve } from "path"; import { type Options, defineConfig } from "tsup"; function createTsupConfig({ @@ -24,6 +26,12 @@ function createTsupConfig({ esbuildPlugins = [], treeshake = false, outDir = "dist", + env = dotenv.config({ + path: resolve( + process.cwd(), + process.env.NODE_ENV === "development" ? ".env.build.local" : ".env.build", + ), + }).parsed, }: Options = {}) { return defineConfig({ entry, @@ -45,6 +53,7 @@ function createTsupConfig({ esbuildPlugins, treeshake, outDir, + env, }); }