diff --git a/.github/workflows/prerelease-canary.yml b/.github/workflows/prerelease-canary.yml index 5d37793ac..b891b3b04 100644 --- a/.github/workflows/prerelease-canary.yml +++ b/.github/workflows/prerelease-canary.yml @@ -16,10 +16,9 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - registry-url: "https://registry.npmjs.org" - node-version: 20.x cache: "pnpm" - - run: npm install -g npm@latest # Trusted publishers + node-version: 20.x + registry-url: "https://registry.npmjs.org" - run: pnpm install - run: pnpm turbo run build --filter './packages/**' - run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a35d21e5f..6fb5e1c11 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,9 +16,9 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - registry-url: 'https://registry.npmjs.org' + cache: "pnpm" node-version: 20.x - cache: 'pnpm' + registry-url: "https://registry.npmjs.org" - run: npm install -g npm@latest # Trusted publishers - run: pnpm install - run: | @@ -28,5 +28,4 @@ jobs: if: "${{startsWith(github.event.head_commit.message, 'fix: ') || startsWith(github.event.head_commit.message, 'feat: ') || startsWith(github.event.head_commit.message, 'feat!: ')}}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_CONFIG_PROVENANCE: true + # No NODE_AUTH_TOKEN since we use Trusted Publishers diff --git a/docs/src/pages/docs/usage/configuration.mdx b/docs/src/pages/docs/usage/configuration.mdx index 697e3cf17..78dfcbaa5 100644 --- a/docs/src/pages/docs/usage/configuration.mdx +++ b/docs/src/pages/docs/usage/configuration.mdx @@ -1,4 +1,3 @@ -import PartnerContentLink from '@/components/PartnerContentLink'; import Callout from '@/components/Callout'; import {Tabs} from 'nextra/components'; import Details from '@/components/Details'; diff --git a/docs/src/pages/docs/usage/extraction.mdx b/docs/src/pages/docs/usage/extraction.mdx index b7463027a..abc163401 100644 --- a/docs/src/pages/docs/usage/extraction.mdx +++ b/docs/src/pages/docs/usage/extraction.mdx @@ -2,7 +2,7 @@ import Image from 'next/image'; import Callout from '@/components/Callout'; import Details from '@/components/Details'; -# `useExtracted` +# `useExtracted` (experimental) As an alternative to managing namespaces and keys manually, `next-intl` provides an additional API that works similar to [`useTranslations`](/docs/usage/translations) but automatically extracts messages from your source files. @@ -48,7 +48,7 @@ function InlineMessages() { **Links:** -- [Blog post](/blog/use-extracted) +- [Introduction blog post](/blog/use-extracted) - [Example app](/examples#app-router-extracted) ## Getting started @@ -73,7 +73,7 @@ const withNextIntl = createNextIntlPlugin({ // Relative path to the directory path: './messages', - // Either 'json' or 'po' + // Either 'json', 'po', or a custom format (see below) format: 'json', // Either 'infer' to automatically detect locales based on @@ -268,11 +268,11 @@ it('renders', () => { }); ``` -## Formatters +## Formats [#formats] -Currently, messages can be extracted as either JSON or PO files. Support for custom formatters is planned for a future release. +Messages can be extracted as JSON, PO, or with custom file formats. -When [`messages`](/docs/usage/plugin#messages) is configured, this will also set up a Turbo- or Webpack loader that will ensure loaded messages can be imported as plain JavaScript objects. +When [`messages`](/docs/usage/plugin#messages) is configured, this will also set up a Turbo- or Webpack loader that will ensure imported messages can be used as plain JavaScript objects. For example, when using `format: 'po'`, messages can be imported as: @@ -283,14 +283,14 @@ import {getRequestConfig} from 'next-intl/server'; export default getRequestConfig(async () => { const locale = 'en'; - // E.g. `{"NhX4DJ": "Hello"}` + // E.g. `[{"NhX4DJ": "Hello"}]` const messages = (await import(`../../messages/${locale}.po`)).default; // ... }); ``` -### JSON formatter [#formatters-json] +### JSON format [#formats-json] When using this option, your messages will look like this: @@ -300,7 +300,7 @@ When using this option, your messages will look like this: } ``` -Note that JSON files can only hold pairs of keys and values. To provide more context about a message like file references and descriptions, it's therefore recommended to use [PO files](#po) instead. Another alternative will be to use a custom JSON formatter in the future. +Note that JSON files can only hold pairs of keys and values. To provide more context about a message like file references and descriptions, it's therefore recommended to use [PO files](#formats-po) instead. Alternatively, you can create a [custom format](#formats-custom) to store additional metadata. For local editing of JSON messages, you can use e.g. a [VSCode integration](/docs/workflows/vscode-integration) like i18n Ally: @@ -318,7 +318,7 @@ For local editing of JSON messages, you can use e.g. a [VSCode integration](/doc -### PO formatter [#formatters-po] +### PO format [#formats-po] When using this option, your messages will look like this: @@ -331,10 +331,58 @@ msgstr "Right" Besides the message key and the label itself, this format also supports optional descriptions and file references to all modules that consume this message. -For local editing of PO messages, you can use e.g. a tool like [Poedit](https://poedit.net/) (replacing keys with source text requires a pro license). +For local editing of .po files, you can use e.g. a tool like [Poedit](https://poedit.net/) (note however that replacing keys with source text requires a pro license). **Tip:** AI-based translation can be automated with a translation management system like [Crowdin](/docs/workflows/localization-management). + +### Custom format [#formats-custom] + +To configure a custom format, you need to specify a codec along with an extension. + +The codec can be created via `defineCodec` from `next-intl/extractor`: + +```tsx filename="./CustomCodec.ts" +import {defineCodec} from 'next-intl/extractor'; + +export default defineCodec(() => ({ + decode(content, context) { + // ... + }, + + encode(messages, context) { + // ... + }, + + toJSONString(content, context) { + // ... + } +})); +``` + +Then, reference it in your configuration along with an `extension`: + +```tsx filename="next.config.ts" +const withNextIntl = createNextIntlPlugin({ + experimental: { + messages: { + format: { + codec: './CustomCodec.ts', + extension: '.json' + } + // ... + } + } +}); +``` + +See also the built-in [`codecs`](https://github.com/amannn/next-intl/tree/main/packages/next-intl/src/extractor/format/codecs) for inspiration. + + + +Node.js supports native TypeScript execution like it's needed for the example above starting with v22.18. If you're on an older version, you should define your codec as a JavaScript file. + + diff --git a/docs/src/pages/docs/usage/plugin.mdx b/docs/src/pages/docs/usage/plugin.mdx index 54bf657b1..22e2adf3c 100644 --- a/docs/src/pages/docs/usage/plugin.mdx +++ b/docs/src/pages/docs/usage/plugin.mdx @@ -93,7 +93,7 @@ const withNextIntl = createNextIntlPlugin({ // Automatically detects locales based on `path` locales: 'infer', - // Either 'json' or 'po' + // Either 'json', 'po', or a custom format format: 'json' } // ... @@ -107,7 +107,7 @@ If you want to specify the locales explicitly, you can provide an array for `loc locales: ['en', 'de']; ``` -Configuring `experimental.messages` will also set up a Turbo- or Webpack loader that will ensure loaded messages can be imported as plain JavaScript objects (see [formatters](/docs/usage/extraction#formatters)). +Configuring `experimental.messages` will also set up a Turbo- or Webpack loader that will ensure loaded messages can be imported as plain JavaScript objects (see [formats](/docs/usage/extraction#formats)). **Note:** The `messages` option should be used together with [`extract`](#extract) and [`srcPath`](#src-path). diff --git a/examples/example-app-router-extracted/src/app/Counter.tsx b/examples/example-app-router-extracted/src/app/Counter.tsx index 6840a4e83..b0df9f71b 100644 --- a/examples/example-app-router-extracted/src/app/Counter.tsx +++ b/examples/example-app-router-extracted/src/app/Counter.tsx @@ -3,7 +3,7 @@ import {useExtracted} from 'next-intl'; import {useState} from 'react'; -export default function Client() { +export default function Counter() { const [count, setCount] = useState(1000); const t = useExtracted(); diff --git a/examples/example-app-router-mixed-routing/playwright.config.ts b/examples/example-app-router-mixed-routing/playwright.config.ts index 27e95bee1..1c687189a 100644 --- a/examples/example-app-router-mixed-routing/playwright.config.ts +++ b/examples/example-app-router-mixed-routing/playwright.config.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ import type {PlaywrightTestConfig} from '@playwright/test'; import {devices} from '@playwright/test'; @@ -6,7 +5,7 @@ import {devices} from '@playwright/test'; const PORT = process.env.CI ? 3002 : 3000; const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testDir: './tests', projects: [ { diff --git a/examples/example-app-router-next-auth/playwright.config.ts b/examples/example-app-router-next-auth/playwright.config.ts index 6917229e4..97bd85919 100644 --- a/examples/example-app-router-next-auth/playwright.config.ts +++ b/examples/example-app-router-next-auth/playwright.config.ts @@ -6,7 +6,7 @@ import {devices} from '@playwright/test'; const PORT = process.env.CI ? 3003 : 3000; const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testDir: './tests', projects: [ { diff --git a/examples/example-app-router-playground/playwright.config.ts b/examples/example-app-router-playground/playwright.config.ts index e6a7e8000..127651b2a 100644 --- a/examples/example-app-router-playground/playwright.config.ts +++ b/examples/example-app-router-playground/playwright.config.ts @@ -9,7 +9,7 @@ const PORT = process.env.CI ? 3004 : 3000; process.env.PORT = PORT.toString(); const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testMatch: process.env.TEST_MATCH || 'main.spec.ts', testDir: './tests', projects: [ diff --git a/examples/example-app-router-single-locale/playwright.config.ts b/examples/example-app-router-single-locale/playwright.config.ts index 7c0822fba..cc95edf26 100644 --- a/examples/example-app-router-single-locale/playwright.config.ts +++ b/examples/example-app-router-single-locale/playwright.config.ts @@ -6,7 +6,7 @@ import {devices} from '@playwright/test'; const PORT = process.env.CI ? 3005 : 3000; const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testDir: './tests', projects: [ { diff --git a/examples/example-app-router-without-i18n-routing/playwright.config.ts b/examples/example-app-router-without-i18n-routing/playwright.config.ts index dc31793c0..cede4ab15 100644 --- a/examples/example-app-router-without-i18n-routing/playwright.config.ts +++ b/examples/example-app-router-without-i18n-routing/playwright.config.ts @@ -6,7 +6,7 @@ import {devices} from '@playwright/test'; const PORT = process.env.CI ? 3006 : 3000; const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testDir: './tests', projects: [ { diff --git a/examples/example-app-router/playwright.config.ts b/examples/example-app-router/playwright.config.ts index ef58b15ba..1de8ec11b 100644 --- a/examples/example-app-router/playwright.config.ts +++ b/examples/example-app-router/playwright.config.ts @@ -6,7 +6,7 @@ import {devices} from '@playwright/test'; const PORT = process.env.CI ? 3001 : 3000; const config: PlaywrightTestConfig = { - retries: process.env.CI ? 1 : 0, + retries: process.env.CI ? 2 : 0, testDir: './tests', projects: [ { diff --git a/package.json b/package.json index b161bf052..660054030 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "build-packages": "turbo run build --filter './packages/**' --filter '!./packages/swc-plugin-extractor'" }, "devDependencies": { - "@lerna-lite/cli": "3.9.0", - "@lerna-lite/publish": "3.9.0", - "conventional-changelog-conventionalcommits": "7.0.2", + "@lerna-lite/cli": "^4.9.4", + "@lerna-lite/publish": "^4.9.4", + "conventional-changelog-conventionalcommits": "^8.0.0", "turbo": "^2.4.4" }, "pnpm": { diff --git a/packages/next-intl/package.json b/packages/next-intl/package.json index 5bc644a67..0a0c2cd77 100644 --- a/packages/next-intl/package.json +++ b/packages/next-intl/package.json @@ -125,10 +125,11 @@ ], "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", + "@parcel/watcher": "^2.4.1", "@swc/core": "^1.15.2", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "workspace:^", - "po-parser": "^1.0.2", + "po-parser": "^2.0.0", "use-intl": "workspace:^" }, "peerDependencies": { diff --git a/packages/next-intl/rollup.config.js b/packages/next-intl/rollup.config.js index 6e09c3614..667071985 100644 --- a/packages/next-intl/rollup.config.js +++ b/packages/next-intl/rollup.config.js @@ -73,7 +73,8 @@ export default [ output: { dir: 'dist/cjs/development', format: 'cjs', - entryFileNames: '[name].cjs' + entryFileNames: '[name].cjs', + chunkFileNames: '[name]-[hash].cjs' } }) ]; diff --git a/packages/next-intl/src/extractor/ExtractionCompiler.test.tsx b/packages/next-intl/src/extractor/ExtractionCompiler.test.tsx index 8b4f1628d..eb4c85dfd 100644 --- a/packages/next-intl/src/extractor/ExtractionCompiler.test.tsx +++ b/packages/next-intl/src/extractor/ExtractionCompiler.test.tsx @@ -28,6 +28,8 @@ beforeEach(() => { watchCallbacks.clear(); mockWatchers.clear(); readFileInterceptors.clear(); + parcelWatcherCallbacks.clear(); + parcelWatcherSubscriptions.clear(); vi.clearAllMocks(); }); @@ -43,11 +45,14 @@ describe('json format', () => { locales: 'infer' } }, - {isDevelopment: true, projectRoot: '/project'} + { + isDevelopment: true, + projectRoot: '/project' + } ); } - it('saves messages initially', async () => { + it('saves messages initially', {timeout: 10000}, async () => { filesystem.project.src['Greeting.tsx'] = ` import {useExtracted} from 'next-intl'; function Greeting() { @@ -61,25 +66,26 @@ describe('json format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); - - // Wait for at least 2 writes (might save more due to change detection) - await waitForWriteFileCalls(2, {atLeast: true}); - expect(filesystem.project.messages).toMatchInlineSnapshot(` - { - "de.json": "{ - "+YJVTi": "Hallo!" - } - ", - "en.json": "{ + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` + [ + [ + "messages/en.json", + "{ "+YJVTi": "Hey!" } ", + ], + [ + "messages/de.json", + "{ + "+YJVTi": "Hallo!" } + ", + ], + ] `); }); @@ -98,7 +104,12 @@ describe('json format', () => { using compiler = createCompiler(); - await compiler.compile( + // Initial scan + await compiler.extractAll(); + await waitForWriteFileCalls(2); + + // Update file content + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -109,22 +120,25 @@ describe('json format', () => { ` ); - // Wait for writes to settle (exact count may vary) - await waitForWriteFileCalls(4, {atLeast: true}); - - // Check final state - expect(filesystem.project.messages).toMatchInlineSnapshot(` - { - "de.json": "{ - "OpKKos": "" - } - ", - "en.json": "{ - "OpKKos": "Hello!" - } - ", - } - `); + await waitForWriteFileCalls(4); + expect(vi.mocked(fs.writeFile).mock.calls.slice(2)).toMatchInlineSnapshot(` + [ + [ + "messages/en.json", + "{ + "OpKKos": "Hello!" + } + ", + ], + [ + "messages/de.json", + "{ + "OpKKos": "" + } + ", + ], + ] + `); }); it('removes translations when all messages are removed from a file', async () => { @@ -141,8 +155,10 @@ describe('json format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` function Greeting() { @@ -183,8 +199,10 @@ describe('json format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` function Greeting() { @@ -210,7 +228,7 @@ describe('json format', () => { ] `); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -257,8 +275,10 @@ describe('json format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -309,8 +329,10 @@ describe('json format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -320,61 +342,57 @@ describe('json format', () => { } ` ); - expect(filesystem).toMatchInlineSnapshot(` - { - "project": { - "messages": { - "de.json": "{ - "+YJVTi": "Hallo!" + await waitForWriteFileCalls(4); + expect(vi.mocked(fs.writeFile).mock.calls.slice(2)).toMatchInlineSnapshot(` + [ + [ + "messages/en.json", + "{ + "OpKKos": "Hello!" } ", - "en.json": "{ - "+YJVTi": "Hey!" + ], + [ + "messages/de.json", + "{ + "OpKKos": "" } ", - }, - "src": { - "Greeting.tsx": " - import {useExtracted} from 'next-intl'; - function Greeting() { - const t = useExtracted(); - return
{t('Hey!')}
; - } - ", - }, - }, - } + ], + ] `); - simulateManualFileEdit( - 'messages/de.json', - JSON.stringify({OpKKos: 'Hallo!'}) - ); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; function Greeting() { const t = useExtracted(); - return
{t('Hello!')} {t('Goodbye!')}
; + return
{t('Hey!')} {t('Goodbye!')}
; } ` ); await waitForWriteFileCalls(6); - expect(filesystem.project.messages).toMatchInlineSnapshot(` - { - "de.json": "{ - "NnE1NP": "", - "OpKKos": "Hallo!" + expect(vi.mocked(fs.writeFile).mock.calls.slice(4)).toMatchInlineSnapshot(` + [ + [ + "messages/en.json", + "{ + "+YJVTi": "Hey!", + "NnE1NP": "Goodbye!" } ", - "en.json": "{ - "NnE1NP": "Goodbye!", - "OpKKos": "Hello!" + ], + [ + "messages/de.json", + "{ + "+YJVTi": "Hallo!", + "NnE1NP": "" } ", - } + ], + ] `); }); @@ -399,16 +417,10 @@ describe('json format', () => { }; using compiler = createCompiler(); - - // Kick off compilation - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(2); - // Remove message from one file - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` function Greeting() { @@ -417,8 +429,6 @@ describe('json format', () => { ` ); - await sleep(100); - // Note: We write even though catalog content is unchanged because // Greeting.tsx's messages changed (1→0). The message persists from // Footer.tsx, so output is identical - this is acceptable overhead. @@ -456,11 +466,7 @@ describe('json format', () => { `; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); expect(vi.mocked(fs.mkdir)).toHaveBeenCalledWith('messages', { recursive: true @@ -487,10 +493,7 @@ describe('json format', () => { }; using compiler = createCompiler(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); @@ -522,10 +525,7 @@ describe('json format', () => { }; using compiler = createCompiler(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); @@ -543,9 +543,7 @@ describe('json format', () => { {timeout: 500} ); - // vi.mocked(fs.writeFile).mockClear(); - - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -587,17 +585,14 @@ describe('json format', () => { }; using compiler = createCompiler(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(3); delete filesystem.project.messages!['fr.json']; simulateFileEvent('/project/messages', 'rename', 'fr.json'); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -652,13 +647,13 @@ describe('json format', () => { locales: ['de', 'fr'] } }, - {isDevelopment: true, projectRoot: '/project'} + { + isDevelopment: true, + projectRoot: '/project' + } ); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(3); @@ -702,11 +697,7 @@ describe('json format', () => { `; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); @@ -747,10 +738,7 @@ describe('json format', () => { }; using compiler = createCompiler(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); // Prepare the new locale file filesystem.project.messages!['fr.json'] = '{"OpKKos": "Bonjour!"}'; @@ -766,9 +754,8 @@ describe('json format', () => { // Trigger the file change (this starts the loading process) simulateFileEvent('/project/messages', 'rename', 'fr.json'); - // While loading is pending (stuck in readFile), trigger a compile/save - // We change the content to ensure `save()` is actually called - await compiler.compile( + // Trigger file update without awaiting - this will queue behind loadCatalogsPromise + const updatePromise = simulateSourceFileUpdate( '/project/src/Greeting.tsx', filesystem.project.src['Greeting.tsx'] + ` @@ -785,6 +772,9 @@ describe('json format', () => { // Allow loading to finish resolveReadFile?.(); + // Wait for the file update to complete (it was waiting for loadCatalogsPromise) + await updatePromise; + // Wait for everything to settle await sleep(100); @@ -808,7 +798,10 @@ describe('po format', () => { locales: 'infer' } }, - {isDevelopment: true, projectRoot: '/project'} + { + isDevelopment: true, + projectRoot: '/project' + } ); } @@ -834,11 +827,7 @@ describe('po format', () => { }; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` [ [ @@ -897,8 +886,10 @@ describe('po format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -972,8 +963,10 @@ describe('po format', () => { }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileCreate( '/project/src/Footer.tsx', ` import {useExtracted} from 'next-intl'; @@ -1039,11 +1032,8 @@ describe('po format', () => { using compiler = createCompiler(); - // First compile: only Greeting.tsx has the message - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + // First compile: Only Greeting.tsx has the message + await compiler.extractAll(); await waitForWriteFileCalls(2); expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` @@ -1082,7 +1072,7 @@ describe('po format', () => { `); // Second compile: Footer.tsx also uses the same message - await compiler.compile( + await simulateSourceFileCreate( '/project/src/Footer.tsx', ` import {useExtracted} from 'next-intl'; @@ -1132,109 +1122,66 @@ describe('po format', () => { `); }); - it('supports namespaces', async () => { + it('removes references when a message is dropped from a single file', async () => { filesystem.project.src['Greeting.tsx'] = ` import {useExtracted} from 'next-intl'; function Greeting() { - const t = useExtracted('ui'); - return
{t('Hello!')}
; + const t = useExtracted(); + return ( +
+ {t('Hey!')} + {t('Howdy!')} +
+ ); } `; - - using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); - - await waitForWriteFileCalls(1); - expect(vi.mocked(fs.writeFile).mock.calls[0]).toMatchInlineSnapshot(` - [ - "messages/en.po", - "msgid "" - msgstr "" - "Language: en\\n" - "Content-Type: text/plain; charset=utf-8\\n" - "Content-Transfer-Encoding: 8bit\\n" - "X-Generator: next-intl\\n" - "X-Crowdin-SourceKey: msgstr\\n" - - #: src/Greeting.tsx - msgctxt "ui" - msgid "OpKKos" - msgstr "Hello!" - ", - ] - `); - }); - - it('retains metadata when saving back to file', async () => { - filesystem.project.src['Greeting.tsx'] = ` + filesystem.project.src['Footer.tsx'] = ` import {useExtracted} from 'next-intl'; - function Greeting() { + function Footer() { const t = useExtracted(); return
{t('Hey!')}
; } `; filesystem.project.messages = { - 'en.po': `msgid "" -msgstr "" -"POT-Creation-Date: 2025-10-27 16:00+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"X-Generator: some-po-editor\n" -"X-Something-Else: test\n" -"Language: en\n" - -#: src/Greeting.tsx:4 -msgid "+YJVTi" -msgstr "Hey!" -`, - 'de.po': `msgid "" -msgstr "" -"POT-Creation-Date: 2025-10-27 16:00+0000\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Language: de\n" - -#: src/Greeting.tsx:4 -msgid "+YJVTi" -msgstr "Hallo!" -` + 'en.po': '', + 'de.po': '' }; using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; function Greeting() { const t = useExtracted(); - return
{t('Hello!')}
; + return
{t('Howdy!')}
; } ` ); await waitForWriteFileCalls(4); - expect(vi.mocked(fs.writeFile).mock.calls.slice(2)).toMatchInlineSnapshot(` + expect(vi.mocked(fs.writeFile).mock.calls.slice(-2)).toMatchInlineSnapshot(` [ [ "messages/en.po", "msgid "" msgstr "" "Language: en\\n" - "Content-Type: text/plain; charset=UTF-8\\n" + "Content-Type: text/plain; charset=utf-8\\n" "Content-Transfer-Encoding: 8bit\\n" - "X-Generator: some-po-editor\\n" + "X-Generator: next-intl\\n" "X-Crowdin-SourceKey: msgstr\\n" - "POT-Creation-Date: 2025-10-27 16:00+0000\\n" - "MIME-Version: 1.0\\n" - "X-Something-Else: test\\n" + + #: src/Footer.tsx + msgid "+YJVTi" + msgstr "Hey!" #: src/Greeting.tsx - msgid "OpKKos" - msgstr "Hello!" + msgid "4xqPlJ" + msgstr "Howdy!" ", ], [ @@ -1242,14 +1189,17 @@ msgstr "Hallo!" "msgid "" msgstr "" "Language: de\\n" - "Content-Type: text/plain; charset=UTF-8\\n" + "Content-Type: text/plain; charset=utf-8\\n" "Content-Transfer-Encoding: 8bit\\n" "X-Generator: next-intl\\n" "X-Crowdin-SourceKey: msgstr\\n" - "POT-Creation-Date: 2025-10-27 16:00+0000\\n" + + #: src/Footer.tsx + msgid "+YJVTi" + msgstr "" #: src/Greeting.tsx - msgid "OpKKos" + msgid "4xqPlJ" msgstr "" ", ], @@ -1257,37 +1207,10 @@ msgstr "Hallo!" `); }); - it('sorts messages by reference path', async () => { - using compiler = createCompiler(); - - await compiler.compile( - '/project/src/components/Header.tsx', - ` - import {useExtracted} from 'next-intl'; - export default function Header() { - const t = useExtracted(); - return
{t('Welcome')}
; - } - ` - ); - - await compiler.compile( - '/project/src/app/page.tsx', - ` - import {useExtracted} from 'next-intl'; - export default function Page() { - const t = useExtracted(); - return
{t('Hello')}
; - } - ` - ); - - await waitForWriteFileCalls(3); - - expect(vi.mocked(fs.writeFile).mock.calls.at(-1)).toMatchInlineSnapshot(` - [ - "messages/en.po", - "msgid "" + it('removes obsolete messages during build', async () => { + filesystem.project.messages = { + 'en.po': ` + msgid "" msgstr "" "Language: en\\n" "Content-Type: text/plain; charset=utf-8\\n" @@ -1295,66 +1218,524 @@ msgstr "Hallo!" "X-Generator: next-intl\\n" "X-Crowdin-SourceKey: msgstr\\n" - #: src/app/page.tsx - msgid "NhX4DJ" - msgstr "Hello" + #: src/component-a.tsx + msgid "OpKKos" + msgstr "Hello!" + `, + 'de.po': ` + msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" - #: src/components/Header.tsx - msgid "PwaN2o" - msgstr "Welcome" + #: src/component-a.tsx + msgid "OpKKos" + msgstr "Hallo!" + ` + }; + filesystem.project.src['component-b.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Component() { + const t = useExtracted(); + return
{t('Howdy!')}
; + } + `; + + using compiler = new ExtractionCompiler( + { + srcPath: './src', + sourceLocale: 'en', + messages: { + path: './messages', + format: 'po', + locales: 'infer' + } + }, + { + isDevelopment: false, + projectRoot: '/project' + } + ); + + await compiler.extractAll(); + + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "4xqPlJ" + msgstr "Howdy!" ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "4xqPlJ" + msgstr "" + ", + ], ] `); }); - it('sorts messages by reference path when files are compiled out of order', async () => { + it('removes messages when a file is deleted during dev', async () => { + filesystem.project.src['component-a.tsx'] = ` + import {useExtracted} from 'next-intl'; + function ComponentA() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + `; + filesystem.project.messages = {}; + using compiler = createCompiler(); + await compiler.extractAll(); - await compiler.compile( - '/project/src/a.tsx', + await waitForWriteFileCalls(1); + expect(vi.mocked(fs.writeFile).mock.calls[0][1]).toContain('Hello!'); + + await simulateSourceFileCreate( + '/project/src/component-b.tsx', ` import {useExtracted} from 'next-intl'; - export default function A() { + function ComponentB() { const t = useExtracted(); - return
{t('Message A')}
; + return
{t('Howdy!')}
; } ` ); - await compiler.compile( - '/project/src/d.tsx', + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls[1][1]).toContain('Howdy!'); + + await simulateSourceFileDelete('/project/src/component-b.tsx'); + + // TODO: Trigger file removal + + await waitForWriteFileCalls(3); + expect(vi.mocked(fs.writeFile).mock.calls.at(-1)?.[1]).not.toContain( + 'component-b.tsx' + ); + }); + + it('removes obsolete references after a file rename during build', async () => { + filesystem.project.messages = { + 'en.po': ` + msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-a.tsx + msgid "OpKKos" + msgstr "Hello!" + `, + 'de.po': ` + msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-a.tsx + msgid "OpKKos" + msgstr "Hallo!" ` + }; + filesystem.project.src['component-b.tsx'] = ` import {useExtracted} from 'next-intl'; - export default function D() { + function Component() { const t = useExtracted(); - return
{t('Message B')}
; + return
{t('Hello!')}
; } - ` + `; + + using compiler = new ExtractionCompiler( + { + srcPath: './src', + sourceLocale: 'en', + messages: { + path: './messages', + format: 'po', + locales: 'infer' + } + }, + { + isDevelopment: false, + projectRoot: '/project' + } ); - await compiler.compile( - '/project/src/c.tsx', - ` + await compiler.extractAll(); + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "Hallo!" + ", + ], + ] + `); + }); + + it('removes obsolete references after a file rename during dev if create fires before delete', async () => { + const file = ` import {useExtracted} from 'next-intl'; - export default function C() { + function Component() { const t = useExtracted(); - return
{t('Message C')}
; + return
{t('Hello!')}
; } - ` + `; + filesystem.project.src['component-a.tsx'] = file; + filesystem.project.messages = { + 'en.po': '', + 'de.po': '' + }; + + using compiler = createCompiler(); + await compiler.extractAll(); + + // Reference to component-a.tsx is written + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls.at(-1)?.[1]).toContain( + 'src/component-a.tsx' ); - await compiler.compile( - '/project/src/b.tsx', - ` + await simulateSourceFileCreate('/project/src/component-b.tsx', file); + await simulateSourceFileDelete('/project/src/component-a.tsx'); + + await waitForWriteFileCalls(6); + + expect(vi.mocked(fs.writeFile).mock.calls.slice(4)).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "" + ", + ], + ] + `); + }); + + it('removes obsolete references after a file rename during dev if delete fires before create', async () => { + const file = ` import {useExtracted} from 'next-intl'; - export default function B() { + function Component() { const t = useExtracted(); - return
{t('Message B')}
; + return
{t('Hello!')}
; } - ` + `; + filesystem.project.src['component-a.tsx'] = file; + filesystem.project.messages = { + 'en.po': '', + 'de.po': '' + }; + + using compiler = createCompiler(); + await compiler.extractAll(); + + // Reference to component-a.tsx is written + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls.at(-1)?.[1]).toContain( + 'src/component-a.tsx' ); - await waitForWriteFileCalls(5); + await simulateSourceFileDelete('/project/src/component-a.tsx'); + await simulateSourceFileCreate('/project/src/component-b.tsx', file); + + await waitForWriteFileCalls(6); + + expect(vi.mocked(fs.writeFile).mock.calls.slice(4)).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/component-b.tsx + msgid "OpKKos" + msgstr "" + ", + ], + ] + `); + }); + + it('supports namespaces', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted('ui'); + return
{t('Hello!')}
; + } + `; + + using compiler = createCompiler(); + await compiler.extractAll(); + + await waitForWriteFileCalls(1); + expect(vi.mocked(fs.writeFile).mock.calls[0]).toMatchInlineSnapshot(` + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/Greeting.tsx + msgctxt "ui" + msgid "OpKKos" + msgstr "Hello!" + ", + ] + `); + }); + + it('retains metadata when saving back to file', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hey!')}
; + } + `; + filesystem.project.messages = { + 'en.po': `msgid "" +msgstr "" +"POT-Creation-Date: 2025-10-27 16:00+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"X-Generator: some-po-editor\n" +"X-Something-Else: test\n" +"Language: en\n" + +#: src/Greeting.tsx:4 +msgid "+YJVTi" +msgstr "Hey!" +`, + 'de.po': `msgid "" +msgstr "" +"POT-Creation-Date: 2025-10-27 16:00+0000\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Language: de\n" + +#: src/Greeting.tsx:4 +msgid "+YJVTi" +msgstr "Hallo!" +` + }; + + using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(2); + + await simulateSourceFileUpdate( + '/project/src/Greeting.tsx', + ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + ` + ); + + await waitForWriteFileCalls(4); + expect(vi.mocked(fs.writeFile).mock.calls.slice(2)).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=UTF-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: some-po-editor\\n" + "X-Crowdin-SourceKey: msgstr\\n" + "POT-Creation-Date: 2025-10-27 16:00+0000\\n" + "MIME-Version: 1.0\\n" + "X-Something-Else: test\\n" + + #: src/Greeting.tsx + msgid "OpKKos" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=UTF-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + "POT-Creation-Date: 2025-10-27 16:00+0000\\n" + + #: src/Greeting.tsx + msgid "OpKKos" + msgstr "" + ", + ], + ] + `); + }); + + it('sorts messages by reference path', async () => { + filesystem.project.src['components/Header.tsx'] = ` + import {useExtracted} from 'next-intl'; + export default function Header() { + const t = useExtracted(); + return
{t('Welcome')}
; + } + `; + filesystem.project.src['app/page.tsx'] = ` + import {useExtracted} from 'next-intl'; + export default function Page() { + const t = useExtracted(); + return
{t('Hello')}
; + } + `; + + using compiler = createCompiler(); + await compiler.extractAll(); + await waitForWriteFileCalls(1); + + expect(vi.mocked(fs.writeFile).mock.calls.at(-1)).toMatchInlineSnapshot(` + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/app/page.tsx + msgid "NhX4DJ" + msgstr "Hello" + + #: src/components/Header.tsx + msgid "PwaN2o" + msgstr "Welcome" + ", + ] + `); + }); + + it('sorts messages by reference path when files are compiled out of order', async () => { + using compiler = createCompiler(); + + filesystem.project.src['a.tsx'] = createFile('A', 'Message A'); + await compiler.extractAll(); + filesystem.project.src['d.tsx'] = createFile('D', 'Message B'); + await compiler.extractAll(); + filesystem.project.src['c.tsx'] = createFile('C', 'Message C'); + await compiler.extractAll(); + filesystem.project.src['b.tsx'] = createFile('B', 'Message B'); + await compiler.extractAll(); + await waitForWriteFileCalls(4); expect(vi.mocked(fs.writeFile).mock.calls.at(-1)).toMatchInlineSnapshot(` [ @@ -1395,11 +1776,7 @@ msgstr "Hallo!" `; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); @@ -1456,11 +1833,7 @@ msgstr "Hallo!" }; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(2); expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` @@ -1525,11 +1898,7 @@ msgstr "Hallo!" }; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(2); @@ -1547,8 +1916,7 @@ msgstr "Hey!" ` ); - // Trigger recompile with source change - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -1605,7 +1973,7 @@ msgstr "World" ` ); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -1670,7 +2038,7 @@ msgstr "" ` ); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -1743,7 +2111,7 @@ msgstr "" ` ); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -1812,11 +2180,7 @@ msgstr "" }; using compiler = createCompiler(); - - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); @@ -1833,7 +2197,7 @@ msgstr "Hey!" ` ); - await compiler.compile( + await simulateSourceFileUpdate( '/project/src/Greeting.tsx', ` import {useExtracted} from 'next-intl'; @@ -1895,10 +2259,7 @@ msgstr "Hey!" }; using compiler = createCompiler(); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); let resolveReadFile: (() => void) | undefined; const readFilePromise = new Promise((resolve) => { @@ -1911,11 +2272,7 @@ msgstr "Hey!" simulateFileEvent('/project/messages', 'rename', 'de.po'); simulateFileEvent('/project/messages', 'rename', 'en.po'); - // Wait a bit to ensure onLocalesChange has started and created the reload promise - await sleep(50); - - // While loading is pending (stuck in readFile), trigger a compile/save - await compiler.compile( + const updatePromise = simulateSourceFileUpdate( '/project/src/Greeting.tsx', filesystem.project.src['Greeting.tsx'] + ` @@ -1930,7 +2287,8 @@ msgstr "Hey!" resolveReadFile?.(); - // Wait for everything to settle + await updatePromise; + await sleep(100); await waitForWriteFileCalls(4); @@ -1984,36 +2342,134 @@ msgstr "Hey!" msgid "nm/7yQ" msgstr "Hi!" - #. This is a description + #. This is a description + #: src/Greeting.tsx + #, c-format + msgid "OpKKos" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + "X-Crowdin-SourceKey: msgstr\\n" + + #: src/Greeting.tsx + msgid "nm/7yQ" + msgstr "" + + #. This is a description + #: src/Greeting.tsx + #, fuzzy + msgid "OpKKos" + msgstr "Hallo!" + ", + ], + ] + `); + }); + + it('propagates read errors instead of silently returning empty (prevents translation wipes)', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + `; + filesystem.project.messages = { + 'en.po': ` + #: src/Greeting.tsx + msgid "OpKKos" + msgstr "Hello!" + `, + 'de.po': ` + #: src/Greeting.tsx + msgid "OpKKos" + msgstr "Hallo!" + ` + }; + + // Intercept reading to simulate a corruption/I/O error + // (not ENOENT - file exists but can't be read) + let rejectReadFile: ((error: Error) => void) | undefined; + const readFilePromise = new Promise((_, reject) => { + rejectReadFile = reject; + }); + + readFileInterceptors.set('de.po', () => readFilePromise); + + using compiler = createCompiler(); + await sleep(50); + + const ioError = new Error('EACCES: permission denied'); + (ioError as NodeJS.ErrnoException).code = 'EACCES'; + rejectReadFile?.(ioError); + + await expect(compiler.extractAll()).rejects.toThrow( + 'Error while reading de.po:\n> Error: EACCES: permission denied' + ); + }); + + it('returns empty array only for ENOENT (file not found) errors', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + `; + + // Only source locale exists, target locale doesn't exist yet + filesystem.project.messages = { + 'en.po': ` #: src/Greeting.tsx - #, c-format msgid "OpKKos" msgstr "Hello!" - ", - ], - [ - "messages/de.po", - "msgid "" - msgstr "" - "Language: de\\n" - "Content-Type: text/plain; charset=utf-8\\n" - "Content-Transfer-Encoding: 8bit\\n" - "X-Generator: next-intl\\n" - "X-Crowdin-SourceKey: msgstr\\n" + ` + }; - #: src/Greeting.tsx - msgid "nm/7yQ" - msgstr "" + using compiler = createCompiler(); + await compiler.extractAll(); - #. This is a description + // Should succeed and create empty target locale + await waitForWriteFileCalls(1); + expect(vi.mocked(fs.writeFile).mock.calls[0][0]).toBe('messages/en.po'); + }); + + it('propagates parser errors from corrupted/truncated files (prevents translation wipes)', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + `; + filesystem.project.messages = { + 'en.po': ` #: src/Greeting.tsx - #, fuzzy msgid "OpKKos" - msgstr "Hallo!" - ", - ], - ] - `); + msgstr "Hello!" + `, + // Simulates a truncated file read during concurrent write + // (file was truncated but read succeeded with partial content) + 'de.po': ` + #: src/Greeting.tsx + msgid "OpKKos" + msgstr "Hal` + // ↑ Truncated mid-write, parser will fail + }; + + using compiler = createCompiler(); + + await expect(compiler.extractAll()).rejects.toThrow( + 'Error while decoding de.po:\n> Error: Incomplete quoted string:\n> "Hal' + ); }); }); @@ -2073,16 +2529,16 @@ describe('`srcPath` filtering', () => { locales: 'infer' } }, - {isDevelopment: true, projectRoot: '/project'} + { + isDevelopment: true, + projectRoot: '/project' + } ); } it('skips node_modules, .next and .git by default', async () => { using compiler = createCompiler('./'); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` [ @@ -2099,10 +2555,7 @@ describe('`srcPath` filtering', () => { it('includes node_modules if explicitly requested', async () => { using compiler = createCompiler(['./', './node_modules/@acme/ui']); - await compiler.compile( - '/project/src/Greeting.tsx', - filesystem.project.src['Greeting.tsx'] - ); + await compiler.extractAll(); await waitForWriteFileCalls(1); expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` [ @@ -2119,10 +2572,210 @@ describe('`srcPath` filtering', () => { }); }); +describe('custom format', () => { + it('supports a structured json custom format with codecs', async () => { + filesystem.project.messages = { + 'en.json': JSON.stringify( + { + 'ui.wESdnU': {message: 'Click me', description: 'Button label'} + }, + null, + 2 + ) + }; + filesystem.project.src['Button.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Button() { + const t = useExtracted('ui'); + return ( + + ); + } + `; + + using compiler = new ExtractionCompiler( + { + srcPath: './src', + sourceLocale: 'en', + messages: { + path: './messages', + format: { + codec: path.resolve( + __dirname, + 'format/codecs/fixtures/JSONCodecStructured.tsx' + ), + extension: '.json' + }, + locales: 'infer' + } + }, + { + isDevelopment: true, + projectRoot: '/project' + } + ); + + await compiler.extractAll(); + await waitForWriteFileCalls(1); + + expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` + [ + [ + "messages/en.json", + "{ + "ui.wESdnU": { + "message": "Click me", + "description": "Button label" + }, + "ui.wSZR47": { + "message": "Submit" + } + } + ", + ], + ] + `); + }); + + it('supports a custom PO format that uses source messages as msgid', async () => { + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + `; + filesystem.project.messages = { + 'en.po': ` + #: src/Greeting.tsx + msgctxt "OpKKos" + msgid "Hello!" + msgstr "Hello!" + `, + 'de.po': ` + #: src/Greeting.tsx + msgctxt "OpKKos" + msgid "Hello!" + msgstr "Hallo!" + ` + }; + + using compiler = new ExtractionCompiler( + { + srcPath: './src', + sourceLocale: 'en', + messages: { + path: './messages', + format: { + codec: path.resolve( + __dirname, + 'format/codecs/fixtures/POCodecSourceMessageKey.tsx' + ), + extension: '.po' + }, + locales: 'infer' + } + }, + { + isDevelopment: true, + projectRoot: '/project' + } + ); + + filesystem.project.src['Greeting.tsx'] = ` + import {useExtracted} from 'next-intl'; + function Greeting() { + const t = useExtracted(); + return
{t('Hello!')}
; + } + function Error() { + const t = useExtracted('misc'); + return ( +
+ {t('The code you entered is incorrect. Please try again or contact support@example.com.')} + {t("Checking if you're logged in.")} +
+ ); + } + `; + + await compiler.extractAll(); + + await waitForWriteFileCalls(2); + expect(vi.mocked(fs.writeFile).mock.calls).toMatchInlineSnapshot(` + [ + [ + "messages/en.po", + "msgid "" + msgstr "" + "Language: en\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + + #: src/Greeting.tsx + msgctxt "misc.Fp6Fab" + msgid "Checking if you're logged in." + msgstr "Checking if you're logged in." + + #: src/Greeting.tsx + msgctxt "misc.l6ZjWT" + msgid "The code you entered is incorrect. Please try again or contact support@example.com." + msgstr "The code you entered is incorrect. Please try again or contact support@example.com." + + #: src/Greeting.tsx + msgctxt "OpKKos" + msgid "Hello!" + msgstr "Hello!" + ", + ], + [ + "messages/de.po", + "msgid "" + msgstr "" + "Language: de\\n" + "Content-Type: text/plain; charset=utf-8\\n" + "Content-Transfer-Encoding: 8bit\\n" + "X-Generator: next-intl\\n" + + #: src/Greeting.tsx + msgctxt "misc.Fp6Fab" + msgid "Checking if you're logged in." + msgstr "" + + #: src/Greeting.tsx + msgctxt "misc.l6ZjWT" + msgid "The code you entered is incorrect. Please try again or contact support@example.com." + msgstr "" + + #: src/Greeting.tsx + msgctxt "OpKKos" + msgid "Hello!" + msgstr "Hallo!" + ", + ], + ] + `); + }); +}); + /** * Test utils ****************************************************************/ +function createFile(componentName: string, message: string) { + return ` + import {useExtracted} from 'next-intl'; + export default function ${componentName}() { + const t = useExtracted(); + return
{t('${message}')}
; + } + `; +} + function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -2157,7 +2810,31 @@ function getNestedValue(obj: any, pathname: string): any { pathParts = ['project', ...pathname.split('/')]; } - return pathParts.reduce((current, key) => current?.[key], obj); + // Try nested structure first + const result = pathParts.reduce((current, key) => current?.[key], obj); + if (result !== undefined) { + return result; + } + + // Fallback: check for flat keys with slashes (e.g., filesystem.project.src['components/Header.tsx']) + // This handles cases where readdir returns keys with slashes but readFile expects nested structure + // We need to check parents at different levels to find where the flat key might be stored + for (let i = pathParts.length - 1; i >= 1; i--) { + const parentPath = pathParts.slice(0, i); + const remainingPath = pathParts.slice(i); + const parent = parentPath.reduce((current, key) => current?.[key], obj); + if (parent && typeof parent === 'object') { + const flatKey = remainingPath.join('/'); + // Check for exact match or key ending with the remaining path + for (const key of Object.keys(parent)) { + if (key === flatKey || key.endsWith('/' + flatKey)) { + return parent[key]; + } + } + } + } + + return undefined; } function setNestedValue(obj: any, pathname: string, value: string): void { @@ -2249,6 +2926,12 @@ const watchCallbacks: Map void> = new Map(); const mockWatchers: Map = new Map(); const readFileInterceptors = new Map Promise>(); +const parcelWatcherCallbacks: Map< + string, + (err: Error | null, events: Array<{type: string; path: string}>) => void +> = new Map(); +const parcelWatcherSubscriptions: Map}> = + new Map(); function simulateFileEvent( dirPath: string, @@ -2294,6 +2977,143 @@ function simulateFileEvent( } } +async function simulateSourceFileCreate( + filePath: string, + content: string +): Promise { + setNestedValue(filesystem, filePath, content); + fileTimestamps.set(filePath, new Date()); + + // Find matching watcher callback + const normalizedPath = path.resolve(filePath); + const dirPath = path.dirname(normalizedPath); + + const pathsToTry = [ + dirPath, + path.resolve(dirPath), + path.join(process.cwd(), dirPath), + dirPath.replace(/\/$/, ''), + path.resolve(dirPath).replace(/\/$/, '') + ]; + + for (const testPath of pathsToTry) { + const callback = parcelWatcherCallbacks.get(testPath); + if (callback) { + callback(null, [{type: 'create', path: normalizedPath}]); + return; + } + } +} + +async function simulateSourceFileUpdate( + filePath: string, + content: string +): Promise { + setNestedValue(filesystem, filePath, content); + fileTimestamps.set(filePath, new Date()); + + // Find matching watcher callback + const normalizedPath = path.resolve(filePath); + const dirPath = path.dirname(normalizedPath); + + const pathsToTry = [ + dirPath, + path.resolve(dirPath), + path.join(process.cwd(), dirPath), + dirPath.replace(/\/$/, ''), + path.resolve(dirPath).replace(/\/$/, '') + ]; + + for (const testPath of pathsToTry) { + const callback = parcelWatcherCallbacks.get(testPath); + if (callback) { + callback(null, [{type: 'update', path: normalizedPath}]); + return; + } + } +} + +async function simulateSourceFileDelete(filePath: string): Promise { + const normalizedPath = path.resolve(filePath); + const dirPath = path.dirname(normalizedPath); + + // Remove from filesystem + const pathParts = normalizedPath + .replace(/^\//, '') + .split('/') + .filter(Boolean); + let current: any = filesystem; + for (let i = 0; i < pathParts.length - 1; i++) { + if (current[pathParts[i]]) { + current = current[pathParts[i]]; + } else { + return; // Already deleted + } + } + delete current[pathParts[pathParts.length - 1]]; + fileTimestamps.delete(normalizedPath); + + // Find matching watcher callback + const pathsToTry = [ + dirPath, + path.resolve(dirPath), + path.join(process.cwd(), dirPath), + dirPath.replace(/\/$/, ''), + path.resolve(dirPath).replace(/\/$/, '') + ]; + + for (const testPath of pathsToTry) { + const callback = parcelWatcherCallbacks.get(testPath); + if (callback) { + callback(null, [{type: 'delete', path: normalizedPath}]); + return; + } + } +} + +vi.mock('@parcel/watcher', () => ({ + subscribe: vi.fn( + async ( + rootPath: string, + callback: ( + err: Error | null, + events: Array<{type: string; path: string}> + ) => void, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + options?: {ignore?: Array} + ) => { + // Store callback with exact path as provided (for test matching) + // Also store normalized variants for flexibility + parcelWatcherCallbacks.set(rootPath, callback); + const normalizedPath = path.resolve(rootPath); + if (normalizedPath !== rootPath) { + parcelWatcherCallbacks.set(normalizedPath, callback); + } + if (!rootPath.startsWith('/')) { + parcelWatcherCallbacks.set( + path.join(process.cwd(), rootPath), + callback + ); + } + + const subscription = { + unsubscribe: vi.fn(async () => { + parcelWatcherCallbacks.delete(rootPath); + if (normalizedPath !== rootPath) { + parcelWatcherCallbacks.delete(normalizedPath); + } + if (!rootPath.startsWith('/')) { + parcelWatcherCallbacks.delete(path.join(process.cwd(), rootPath)); + } + parcelWatcherSubscriptions.delete(rootPath); + }) + }; + parcelWatcherSubscriptions.set(rootPath, subscription); + return subscription; + } + ) +})); + vi.mock('fs', () => ({ default: { watch: vi.fn( @@ -2328,6 +3148,17 @@ vi.mock('fs', () => ({ } })); +function createENOENTError(filePath: string): NodeJS.ErrnoException { + const error = new Error( + `ENOENT: no such file or directory, open '${filePath}'` + ) as NodeJS.ErrnoException; + error.code = 'ENOENT'; + error.errno = -2; + error.syscall = 'open'; + error.path = filePath; + return error; +} + vi.mock('fs/promises', () => ({ default: { readFile: vi.fn(async (filePath: string) => { @@ -2340,7 +3171,7 @@ vi.mock('fs/promises', () => ({ if (typeof content === 'string') { return content; } - throw new Error('File not found: ' + filePath); + throw createENOENTError(filePath); }), readdir: vi.fn(async (dir: string, opts?: {withFileTypes?: boolean}) => { const dirExists = checkDirectoryExists(filesystem, dir); diff --git a/packages/next-intl/src/extractor/ExtractionCompiler.tsx b/packages/next-intl/src/extractor/ExtractionCompiler.tsx index 714176bb4..54374beab 100644 --- a/packages/next-intl/src/extractor/ExtractionCompiler.tsx +++ b/packages/next-intl/src/extractor/ExtractionCompiler.tsx @@ -1,10 +1,9 @@ import CatalogManager from './catalog/CatalogManager.js'; +import MessageExtractor from './extractor/MessageExtractor.js'; import type {ExtractorConfig} from './types.js'; export default class ExtractionCompiler implements Disposable { private manager: CatalogManager; - private isDevelopment = false; - private initialScanPromise: Promise | undefined; constructor( config: ExtractorConfig, @@ -12,46 +11,38 @@ export default class ExtractionCompiler implements Disposable { isDevelopment?: boolean; projectRoot?: string; sourceMap?: boolean; + extractor?: MessageExtractor; } = {} ) { - this.manager = new CatalogManager(config, opts); - this.isDevelopment = opts.isDevelopment ?? false; - - // Kick off the initial scan as early as possible, - // while awaiting it in `compile`. This also ensures - // we're only scanning once. - this.initialScanPromise = this.performInitialScan(); - } - - public async compile(resourcePath: string, source: string) { - if (this.initialScanPromise) { - await this.initialScanPromise; - this.initialScanPromise = undefined; - } - - const result = await this.manager.extractFileMessages(resourcePath, source); - - if (this.isDevelopment && result.changed) { - // While we await the AST modification, we - // don't need to await the persistence - void this.manager.save(); - } - - return result; + const extractor = opts.extractor ?? new MessageExtractor(opts); + this.manager = new CatalogManager(config, {...opts, extractor}); + this[Symbol.dispose] = this[Symbol.dispose].bind(this); + this.installExitHandlers(); } - private async performInitialScan(): Promise { + public async extractAll() { // We can't rely on all files being compiled (e.g. due to persistent // caching), so loading the messages initially is necessary. await this.manager.loadMessages(); await this.manager.save(); } - public async extract() { - await this.initialScanPromise; - } - [Symbol.dispose](): void { + this.uninstallExitHandlers(); this.manager.destroy(); } + + private installExitHandlers() { + const cleanup = this[Symbol.dispose]; + process.on('exit', cleanup); + process.on('SIGINT', cleanup); + process.on('SIGTERM', cleanup); + } + + private uninstallExitHandlers() { + const cleanup = this[Symbol.dispose]; + process.off('exit', cleanup); + process.off('SIGINT', cleanup); + process.off('SIGTERM', cleanup); + } } diff --git a/packages/next-intl/src/extractor/catalog/CatalogLocales.tsx b/packages/next-intl/src/extractor/catalog/CatalogLocales.tsx index b56ac1628..4d9ae2dd9 100644 --- a/packages/next-intl/src/extractor/catalog/CatalogLocales.tsx +++ b/packages/next-intl/src/extractor/catalog/CatalogLocales.tsx @@ -21,7 +21,6 @@ export default class CatalogLocales { private sourceLocale: Locale; private locales: MessagesConfig['locales']; private watcher?: fs.FSWatcher; - private cleanupHandlers: Array<() => void> = []; private targetLocales?: Array; private onChangeCallbacks: Set = new Set(); @@ -95,8 +94,6 @@ export default class CatalogLocales { } } ); - - this.setupCleanupHandlers(); } private stopWatcher(): void { @@ -104,11 +101,6 @@ export default class CatalogLocales { this.watcher.close(); this.watcher = undefined; } - - for (const handler of this.cleanupHandlers) { - handler(); - } - this.cleanupHandlers = []; } private async onChange(): Promise { @@ -129,35 +121,4 @@ export default class CatalogLocales { } } } - - private setupCleanupHandlers(): void { - const cleanup = () => { - if (this.watcher) { - this.watcher.close(); - this.watcher = undefined; - } - }; - - function exitHandler() { - cleanup(); - } - function sigintHandler() { - cleanup(); - process.exit(0); - } - function sigtermHandler() { - cleanup(); - process.exit(0); - } - - process.once('exit', exitHandler); - process.once('SIGINT', sigintHandler); - process.once('SIGTERM', sigtermHandler); - - this.cleanupHandlers.push(() => { - process.removeListener('exit', exitHandler); - process.removeListener('SIGINT', sigintHandler); - process.removeListener('SIGTERM', sigtermHandler); - }); - } } diff --git a/packages/next-intl/src/extractor/catalog/CatalogManager.tsx b/packages/next-intl/src/extractor/catalog/CatalogManager.tsx index c909d9ff8..e57314bf4 100644 --- a/packages/next-intl/src/extractor/catalog/CatalogManager.tsx +++ b/packages/next-intl/src/extractor/catalog/CatalogManager.tsx @@ -1,11 +1,12 @@ import fs from 'fs/promises'; import path from 'path'; -import MessageExtractor from '../extractor/MessageExtractor.js'; -import type Formatter from '../formatters/Formatter.js'; -import formatters from '../formatters/index.js'; +import type MessageExtractor from '../extractor/MessageExtractor.js'; +import type ExtractorCodec from '../format/ExtractorCodec.js'; +import {getFormatExtension, resolveCodec} from '../format/index.js'; import SourceFileScanner from '../source/SourceFileScanner.js'; -import type {ExtractedMessage, ExtractorConfig, Locale} from '../types.js'; -import {localeCompare} from '../utils.js'; +import SourceFileWatcher from '../source/SourceFileWatcher.js'; +import type {ExtractorConfig, ExtractorMessage, Locale} from '../types.js'; +import {getDefaultProjectRoot, localeCompare} from '../utils.js'; import CatalogLocales from './CatalogLocales.js'; import CatalogPersister from './CatalogPersister.js'; import SaveScheduler from './SaveScheduler.js'; @@ -13,15 +14,21 @@ import SaveScheduler from './SaveScheduler.js'; export default class CatalogManager { private config: ExtractorConfig; - /* The source of truth for which messages are used. */ + /** + * The source of truth for which messages are used. + * NOTE: Should be mutated in place to keep `messagesById` and `messagesByFile` in sync. + */ private messagesByFile: Map< /* File path */ string, - Map + Map > = new Map(); - /* Fast lookup for messages by ID across all files, - * contains the same messages as `messagesByFile`. */ - private messagesById: Map = new Map(); + /** + * Fast lookup for messages by ID across all files, + * contains the same messages as `messagesByFile`. + * NOTE: Should be mutated in place to keep `messagesById` and `messagesByFile` in sync. + */ + private messagesById: Map = new Map(); /** * This potentially also includes outdated ones that were initially available, @@ -29,7 +36,7 @@ export default class CatalogManager { **/ private translationsByTargetLocale: Map< Locale, - Map + Map > = new Map(); private lastWriteByLocale: Map = new Map(); @@ -40,9 +47,10 @@ export default class CatalogManager { // Cached instances private persister?: CatalogPersister; - private formatter?: Formatter; + private codec?: ExtractorCodec; private catalogLocales?: CatalogLocales; - private messageExtractor: MessageExtractor; + private extractor: MessageExtractor; + private sourceWatcher?: SourceFileWatcher; // Resolves when all catalogs are loaded // (but doesn't indicate that project scan is done) @@ -54,44 +62,49 @@ export default class CatalogManager { projectRoot?: string; isDevelopment?: boolean; sourceMap?: boolean; - } = {} + extractor: MessageExtractor; + } ) { this.config = config; this.saveScheduler = new SaveScheduler(50); - this.projectRoot = opts.projectRoot || process.cwd(); + this.projectRoot = opts.projectRoot ?? getDefaultProjectRoot(); this.isDevelopment = opts.isDevelopment ?? false; - this.messageExtractor = new MessageExtractor({ - isDevelopment: this.isDevelopment, - projectRoot: this.projectRoot, - sourceMap: opts.sourceMap - }); + this.extractor = opts.extractor; + + if (this.isDevelopment) { + this.sourceWatcher = new SourceFileWatcher( + this.getSrcPaths(), + this.handleFileEvents.bind(this) + ); + void this.sourceWatcher.start(); + } } - private async getFormatter(): Promise { - if (this.formatter) { - return this.formatter; - } else { - const FormatterClass = (await formatters[this.config.messages.format]()) - .default; - this.formatter = new FormatterClass(); - return this.formatter; + private async getCodec(): Promise { + if (!this.codec) { + this.codec = await resolveCodec( + this.config.messages.format, + this.projectRoot + ); } + return this.codec; } private async getPersister(): Promise { if (this.persister) { return this.persister; } else { - this.persister = new CatalogPersister( - this.config.messages.path, - await this.getFormatter() - ); + this.persister = new CatalogPersister({ + messagesPath: this.config.messages.path, + codec: await this.getCodec(), + extension: getFormatExtension(this.config.messages.format) + }); return this.persister; } } - private async getCatalogLocales(): Promise { + private getCatalogLocales(): CatalogLocales { if (this.catalogLocales) { return this.catalogLocales; } else { @@ -99,11 +112,10 @@ export default class CatalogManager { this.projectRoot, this.config.messages.path ); - const formatter = await this.getFormatter(); this.catalogLocales = new CatalogLocales({ messagesDir, sourceLocale: this.config.sourceLocale, - extension: formatter.EXTENSION, + extension: getFormatExtension(this.config.messages.format), locales: this.config.messages.locales }); return this.catalogLocales; @@ -111,8 +123,7 @@ export default class CatalogManager { } private async getTargetLocales(): Promise> { - const catalogLocales = await this.getCatalogLocales(); - return catalogLocales.getTargetLocales(); + return this.getCatalogLocales().getTargetLocales(); } getSrcPaths(): Array { @@ -124,66 +135,48 @@ export default class CatalogManager { } public async loadMessages() { - this.loadCatalogsPromise = Promise.all([ - this.loadSourceMessages(), - this.loadTargetMessages() - ]); - - // Ensure catalogs are loaded before scanning source files. - // Otherwise, `loadSourceMessages` might overwrite extracted - // messages if it finishes after source file extraction. + const sourceDiskMessages = await this.loadSourceMessages(); + this.loadCatalogsPromise = this.loadTargetMessages(); await this.loadCatalogsPromise; - if (this.isDevelopment) { - const catalogLocales = await this.getCatalogLocales(); - catalogLocales.subscribeLocalesChange(this.onLocalesChange); - } - const sourceFiles = await SourceFileScanner.getSourceFiles( this.getSrcPaths() ); await Promise.all( - sourceFiles.map(async (filePath) => - this.extractFileMessages(filePath, await fs.readFile(filePath, 'utf8')) + Array.from(sourceFiles).map(async (filePath) => + this.processFile(filePath) ) ); + + this.mergeSourceDiskMetadata(sourceDiskMessages); + + if (this.isDevelopment) { + const catalogLocales = this.getCatalogLocales(); + catalogLocales.subscribeLocalesChange(this.onLocalesChange); + } } - private async loadSourceMessages() { - // First hydrate from source locale file to potentially init metadata - const messages = await this.loadLocaleMessages(this.config.sourceLocale); - const messagesById: typeof this.messagesById = new Map(); - const messagesByFile: typeof this.messagesByFile = new Map(); - for (const message of messages) { - messagesById.set(message.id, message); - if (message.references) { - for (const ref of message.references) { - const absoluteFilePath = path.join(this.projectRoot, ref.path); - let fileMessages = messagesByFile.get(absoluteFilePath); - if (!fileMessages) { - fileMessages = new Map(); - messagesByFile.set(absoluteFilePath, fileMessages); - } - fileMessages.set(message.id, message); - } - } + private async loadSourceMessages(): Promise> { + // Load source catalog to hydrate metadata (e.g. flags) later without + // treating catalog entries as source of truth. + const diskMessages = await this.loadLocaleMessages( + this.config.sourceLocale + ); + const byId = new Map(); + for (const diskMessage of diskMessages) { + byId.set(diskMessage.id, diskMessage); } - this.messagesById = messagesById; - this.messagesByFile = messagesByFile; + return byId; } private async loadLocaleMessages( locale: Locale - ): Promise> { + ): Promise> { const persister = await this.getPersister(); - try { - const messages = await persister.read(locale); - const fileTime = await persister.getLastModified(locale); - this.lastWriteByLocale.set(locale, fileTime); - return messages; - } catch { - return []; - } + const messages = await persister.read(locale); + const fileTime = await persister.getLastModified(locale); + this.lastWriteByLocale.set(locale, fileTime); + return messages; } private async loadTargetMessages() { @@ -201,15 +194,16 @@ export default class CatalogManager { for (const diskMessage of diskMessages) { const prev = this.messagesById.get(diskMessage.id); if (prev) { + // Mutate the existing object instead of creating a copy + // to keep messagesById and messagesByFile in sync. // Unknown properties (like flags): disk wins // Known properties: existing (from extraction) wins - this.messagesById.set(diskMessage.id, { - ...diskMessage, - id: prev.id, - message: prev.message, - description: prev.description, - references: prev.references - }); + for (const key of Object.keys(diskMessage)) { + if (!['id', 'message', 'description', 'references'].includes(key)) { + // For unknown properties (like flags), disk wins + prev[key] = diskMessage[key]; + } + } } else { // The message no longer exists, so it will be removed // as part of the next save invocation. @@ -217,7 +211,7 @@ export default class CatalogManager { } } else { // For target: disk wins completely - const translations = new Map(); + const translations = new Map(); for (const message of diskMessages) { translations.set(message.id, message); } @@ -225,19 +219,39 @@ export default class CatalogManager { } } - async extractFileMessages( - absoluteFilePath: string, - source: string - ): Promise<{ - messages: Array; - code: string; - changed: boolean; - map?: string; - }> { - const result = await this.messageExtractor.processFileContent( - absoluteFilePath, - source - ); + private mergeSourceDiskMetadata( + diskMessages: Map + ): void { + for (const [id, diskMessage] of diskMessages) { + const existing = this.messagesById.get(id); + if (!existing) continue; + + // Mutate the existing object instead of creating a copy. + // This keeps `messagesById` and `messagesByFile` in sync since + // they reference the same object instance. + for (const key of Object.keys(diskMessage)) { + if (existing[key] == null) { + existing[key] = diskMessage[key]; + } + } + } + } + + public async processFile(absoluteFilePath: string): Promise { + let messages: Array = []; + try { + const content = await fs.readFile(absoluteFilePath, 'utf8'); + const extraction = await this.extractor.extract( + absoluteFilePath, + content + ); + messages = extraction.messages; + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ENOENT') { + throw err; + } + // ENOENT -> treat as no messages + } const prevFileMessages = this.messagesByFile.get(absoluteFilePath); @@ -245,26 +259,20 @@ export default class CatalogManager { const idsToRemove = Array.from(prevFileMessages?.keys() ?? []); // Replace existing messages with new ones - const fileMessages = new Map(); + const fileMessages = new Map(); - for (let message of result.messages) { + for (let message of messages) { const prevMessage = this.messagesById.get(message.id); // Merge with previous message if it exists if (prevMessage) { - // References: The `message` we receive here will always have one - // reference, which is the current file. We need to merge this with - // potentially existing references. - const references = [...(prevMessage.references ?? [])]; - message.references.forEach((ref) => { - if (!references.some((cur) => cur.path === ref.path)) { - references.push(ref); - } - }); - references.sort((referenceA, referenceB) => - localeCompare(referenceA.path, referenceB.path) - ); - message = {...message, references}; + const validated = prevMessage.references ?? []; + message = { + ...message, + references: this.mergeReferences(validated, { + path: path.relative(this.projectRoot, absoluteFilePath) + }) + }; // Merge other properties like description, or unknown // attributes like flags that are opaque to us @@ -283,22 +291,31 @@ export default class CatalogManager { if (index !== -1) idsToRemove.splice(index, 1); } - // Don't delete IDs still used in other files const relativeFilePath = path.relative(this.projectRoot, absoluteFilePath); - const idsToDelete = idsToRemove.filter((id) => { - const message = this.messagesById.get(id); - return !message?.references?.some((ref) => ref.path !== relativeFilePath); - }); // Clean up removed messages from `messagesById` - idsToDelete.forEach((id) => { - this.messagesById.delete(id); + idsToRemove.forEach((id) => { + const message = this.messagesById.get(id); + if (!message) return; + + const hasOtherReferences = message.references?.some( + (ref) => ref.path !== relativeFilePath + ); + + if (!hasOtherReferences) { + // No other references, delete the message entirely + this.messagesById.delete(id); + } else { + // Message is used elsewhere, remove this file from references + // Mutate the existing object to keep `messagesById` and `messagesByFile` in sync + message.references = message.references?.filter( + (ref) => ref.path !== relativeFilePath + ); + } }); // Update the stored messages - const hasMessages = result.messages.length > 0; - - if (hasMessages) { + if (messages.length > 0) { this.messagesByFile.set(absoluteFilePath, fileMessages); } else { this.messagesByFile.delete(absoluteFilePath); @@ -308,12 +325,26 @@ export default class CatalogManager { prevFileMessages, fileMessages ); - return {...result, changed}; + return changed; + } + + private mergeReferences( + existing: Array<{path: string}>, + current: {path: string} + ): Array<{path: string}> { + const dedup = new Map(); + for (const ref of existing) { + dedup.set(ref.path, ref); + } + dedup.set(current.path, current); + return Array.from(dedup.values()).sort((a, b) => + localeCompare(a.path, b.path) + ); } private haveMessagesChangedForFile( - beforeMessages: Map | undefined, - afterMessages: Map + beforeMessages: Map | undefined, + afterMessages: Map ): boolean { // If one exists and the other doesn't, there's a change if (!beforeMessages) { @@ -337,8 +368,8 @@ export default class CatalogManager { } private areMessagesEqual( - msg1: ExtractedMessage, - msg2: ExtractedMessage + msg1: ExtractorMessage, + msg2: ExtractorMessage ): boolean { // Note: We intentionally don't compare references here. // References are aggregated metadata from multiple files and comparing @@ -375,22 +406,27 @@ export default class CatalogManager { await this.reloadLocaleCatalog(locale); } - const prevMessages = isSourceLocale + const localeMessages = isSourceLocale ? this.messagesById : this.translationsByTargetLocale.get(locale); - const localeMessages = messages.map((message) => { - const prev = prevMessages?.get(message.id); + const messagesToPersist = messages.map((message) => { + const localeMessage = localeMessages?.get(message.id); return { - ...prev, + ...localeMessage, id: message.id, description: message.description, references: message.references, - message: isSourceLocale ? message.message : (prev?.message ?? '') + message: isSourceLocale + ? message.message + : (localeMessage?.message ?? '') }; }); - await persister.write(locale, localeMessages); + await persister.write(messagesToPersist, { + locale, + sourceMessagesById: this.messagesById + }); // Update timestamps const newTime = await persister.getLastModified(locale); @@ -417,7 +453,27 @@ export default class CatalogManager { } }; + private async handleFileEvents(events: Array<{type: string; path: string}>) { + if (this.loadCatalogsPromise) { + await this.loadCatalogsPromise; + } + + let changed = false; + + for (const event of events) { + const hasChanged = await this.processFile(event.path); + changed ||= hasChanged; + } + + if (changed) { + await this.save(); + } + } + destroy(): void { + this.sourceWatcher?.stop(); + this.sourceWatcher = undefined; + this.saveScheduler.destroy(); if (this.catalogLocales && this.isDevelopment) { this.catalogLocales.unsubscribeLocalesChange(this.onLocalesChange); diff --git a/packages/next-intl/src/extractor/catalog/CatalogPersister.tsx b/packages/next-intl/src/extractor/catalog/CatalogPersister.tsx index cd4caceb5..39e7b5520 100644 --- a/packages/next-intl/src/extractor/catalog/CatalogPersister.tsx +++ b/packages/next-intl/src/extractor/catalog/CatalogPersister.tsx @@ -1,33 +1,69 @@ import fs from 'fs/promises'; import fsPath from 'path'; -import type Formatter from '../formatters/Formatter.js'; -import type {ExtractedMessage, Locale} from '../types.js'; +import type ExtractorCodec from '../format/ExtractorCodec.js'; +import type {ExtractorMessage, Locale} from '../types.js'; export default class CatalogPersister { private messagesPath: string; - private formatter: Formatter; + private codec: ExtractorCodec; + private extension: string; - constructor(messagesPath: string, formatter: Formatter) { - this.messagesPath = messagesPath; - this.formatter = formatter; + constructor(params: { + messagesPath: string; + codec: ExtractorCodec; + extension: string; + }) { + this.messagesPath = params.messagesPath; + this.codec = params.codec; + this.extension = params.extension; + } + + private getFileName(locale: Locale): string { + return locale + this.extension; } private getFilePath(locale: Locale): string { - return fsPath.join(this.messagesPath, locale + this.formatter.EXTENSION); + return fsPath.join(this.messagesPath, this.getFileName(locale)); } - async read(locale: Locale): Promise> { + async read(locale: Locale): Promise> { const filePath = this.getFilePath(locale); - const content = await fs.readFile(filePath, 'utf8'); - return this.formatter.parse(content, {locale}); + let content: string; + try { + content = await fs.readFile(filePath, 'utf8'); + } catch (error) { + if ( + error && + typeof error === 'object' && + 'code' in error && + error.code === 'ENOENT' + ) { + return []; + } + throw new Error( + `Error while reading ${this.getFileName(locale)}:\n> ${error}`, + {cause: error} + ); + } + try { + return this.codec.decode(content, {locale}); + } catch (error) { + throw new Error( + `Error while decoding ${this.getFileName(locale)}:\n> ${error}`, + {cause: error} + ); + } } async write( - locale: Locale, - messages: Array + messages: Array, + context: { + locale: Locale; + sourceMessagesById: Map; + } ): Promise { - const filePath = this.getFilePath(locale); - const content = this.formatter.serialize(messages, {locale}); + const filePath = this.getFilePath(context.locale); + const content = this.codec.encode(messages, context); try { const outputDir = fsPath.dirname(filePath); await fs.mkdir(outputDir, {recursive: true}); diff --git a/packages/next-intl/src/extractor/extractMessages.tsx b/packages/next-intl/src/extractor/extractMessages.tsx index 8a5ba4102..4f0f4b48f 100644 --- a/packages/next-intl/src/extractor/extractMessages.tsx +++ b/packages/next-intl/src/extractor/extractMessages.tsx @@ -1,7 +1,14 @@ import ExtractionCompiler from './ExtractionCompiler.js'; +import MessageExtractor from './extractor/MessageExtractor.js'; import type {ExtractorConfig} from './types.js'; +import {getDefaultProjectRoot} from './utils.js'; export default async function extractMessages(params: ExtractorConfig) { - const compiler = new ExtractionCompiler(params); - await compiler.extract(); + const compiler = new ExtractionCompiler(params, { + extractor: new MessageExtractor({ + isDevelopment: false, + projectRoot: getDefaultProjectRoot() + }) + }); + await compiler.extractAll(); } diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx b/packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx index 69744c4ec..50bd3c59d 100644 --- a/packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx +++ b/packages/next-intl/src/extractor/extractor/MessageExtractor.bench.tsx @@ -27,7 +27,7 @@ bench('extract messages without source maps', async () => { sourceMap: false }); - await extractor.processFileContent('/project/test.tsx', testCode); + await extractor.extract('/project/test.tsx', testCode); }); bench('extract messages with source maps', async () => { @@ -37,5 +37,5 @@ bench('extract messages with source maps', async () => { sourceMap: true }); - await extractor.processFileContent('/project/test.tsx', testCode); + await extractor.extract('/project/test.tsx', testCode); }); diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx b/packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx index cceb70d9a..77f5904b0 100644 --- a/packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx +++ b/packages/next-intl/src/extractor/extractor/MessageExtractor.test.tsx @@ -9,7 +9,7 @@ async function process( isDevelopment: true, projectRoot: '/project', ...opts - }).processFileContent('/project/test.tsx', code); + }).extract('/project/test.tsx', code); } it('can extract with source maps', async () => { diff --git a/packages/next-intl/src/extractor/extractor/MessageExtractor.tsx b/packages/next-intl/src/extractor/extractor/MessageExtractor.tsx index 95b97c7a5..26cae5eaf 100644 --- a/packages/next-intl/src/extractor/extractor/MessageExtractor.tsx +++ b/packages/next-intl/src/extractor/extractor/MessageExtractor.tsx @@ -1,13 +1,14 @@ import {createRequire} from 'module'; import path from 'path'; import {transform} from '@swc/core'; -import type {ExtractedMessage} from '../types.js'; +import type {ExtractorMessage} from '../types.js'; +import {getDefaultProjectRoot} from '../utils.js'; import LRUCache from './LRUCache.js'; const require = createRequire(import.meta.url); -type StrictExtractedMessage = ExtractedMessage & { - references: NonNullable; +type StrictExtractedMessage = ExtractorMessage & { + references: NonNullable; }; export default class MessageExtractor { @@ -21,16 +22,16 @@ export default class MessageExtractor { }>(750); constructor(opts: { - isDevelopment: boolean; - projectRoot: string; + isDevelopment?: boolean; + projectRoot?: string; sourceMap?: boolean; }) { - this.isDevelopment = opts.isDevelopment; - this.projectRoot = opts.projectRoot; + this.isDevelopment = opts.isDevelopment ?? false; + this.projectRoot = opts.projectRoot ?? getDefaultProjectRoot(); this.sourceMap = opts.sourceMap ?? false; } - async processFileContent( + async extract( absoluteFilePath: string, source: string ): Promise<{ @@ -38,7 +39,7 @@ export default class MessageExtractor { code: string; map?: string; }> { - const cacheKey = source; + const cacheKey = [source, absoluteFilePath].join('!'); const cached = this.compileCache.get(cacheKey); if (cached) return cached; diff --git a/packages/next-intl/src/extractor/format/ExtractorCodec.tsx b/packages/next-intl/src/extractor/format/ExtractorCodec.tsx new file mode 100644 index 000000000..e5beb9098 --- /dev/null +++ b/packages/next-intl/src/extractor/format/ExtractorCodec.tsx @@ -0,0 +1,45 @@ +import type {ExtractorMessage, Locale} from '../types.js'; + +type ExtractorCodecContext = { + locale: Locale; +}; + +export default interface ExtractorCodec { + /** + * Decode the content of a file into a list of extracted messages. This is used + * to load existing messages from disk. + */ + decode( + content: string, + context: ExtractorCodecContext + ): Array; + + /** + * Encode a list of extracted messages into a string that can be written as + * file content to the disk. + */ + encode( + messages: Array, + context: ExtractorCodecContext & { + sourceMessagesById: Map; + } + ): string; + + /** + * Turns the content of a file into a JSON string that represents extracted + * messages. The returned value will be passed to `JSON.parse`. + * + * @return E.g. `[{"id":"+YJVTi","message":"Hey!"}]` + * + * This is used when loading messages into your application, typically via a + * dynamic import (e.g. `import(`../messages/${locale}.json`)`). + * + * If your file content is JSON and should be used as-is, you can set this to + * an identity function. + */ + toJSONString(content: string, context: ExtractorCodecContext): string; +} + +export function defineCodec(factory: () => ExtractorCodec) { + return factory; +} diff --git a/packages/next-intl/src/extractor/format/codecs/JSONCodec.tsx b/packages/next-intl/src/extractor/format/codecs/JSONCodec.tsx new file mode 100644 index 000000000..9b2889c3e --- /dev/null +++ b/packages/next-intl/src/extractor/format/codecs/JSONCodec.tsx @@ -0,0 +1,49 @@ +import {getSortedMessages, setNestedProperty} from '../../utils.js'; +import {defineCodec} from '../ExtractorCodec.js'; + +interface StoredFormat { + [key: string]: string | StoredFormat; +} + +export default defineCodec(() => ({ + decode(source) { + const json: StoredFormat = JSON.parse(source); + const messages: Array<{id: string; message: string}> = []; + + traverseMessages(json, (message, id) => { + messages.push({id, message}); + }); + + return messages; + }, + + encode(messages) { + const root: StoredFormat = {}; + for (const message of getSortedMessages(messages)) { + setNestedProperty(root, message.id, message.message); + } + return JSON.stringify(root, null, 2) + '\n'; + }, + + toJSONString(source) { + return source; + } +})); + +function traverseMessages( + obj: StoredFormat, + callback: (value: string, path: string) => void, + path = '' +): void { + const NAMESPACE_SEPARATOR = '.'; + + for (const key of Object.keys(obj)) { + const newPath = path ? path + NAMESPACE_SEPARATOR + key : key; + const value = obj[key]; + if (typeof value === 'string') { + callback(value, newPath); + } else if (typeof value === 'object') { + traverseMessages(value, callback, newPath); + } + } +} diff --git a/packages/next-intl/src/extractor/format/codecs/POCodec.tsx b/packages/next-intl/src/extractor/format/codecs/POCodec.tsx new file mode 100644 index 000000000..7f6f4c2d5 --- /dev/null +++ b/packages/next-intl/src/extractor/format/codecs/POCodec.tsx @@ -0,0 +1,92 @@ +import POParser from 'po-parser'; +import {getSortedMessages, setNestedProperty} from '../../utils.js'; +import {defineCodec} from '../ExtractorCodec.js'; + +export default defineCodec(() => { + // See also https://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html + const DEFAULT_METADATA = { + // Recommended by spec + 'Content-Type': 'text/plain; charset=utf-8', + 'Content-Transfer-Encoding': '8bit', + + // Otherwise other tools might set this + 'X-Generator': 'next-intl', + + // Crowdin defaults to using msgid as source key + 'X-Crowdin-SourceKey': 'msgstr' + }; + + // Move all parts before the last dot to msgctxt + const NAMESPACE_SEPARATOR = '.'; + + // Metadata is stored so it can be retained when writing + const metadataByLocale = new Map(); + + return { + decode(content, context) { + const catalog = POParser.parse(content); + if (catalog.meta) { + metadataByLocale.set(context.locale, catalog.meta); + } + const messages = catalog.messages || []; + return messages.map((msg) => { + const {extractedComments, msgctxt, msgid, msgstr, ...rest} = msg; + + if (extractedComments && extractedComments.length > 1) { + throw new Error( + `Multiple extracted comments are not supported. Found ${extractedComments.length} comments for msgid "${msgid}".` + ); + } + + return { + ...rest, + id: msgctxt ? [msgctxt, msgid].join(NAMESPACE_SEPARATOR) : msgid, + message: msgstr, + ...(extractedComments && + extractedComments.length > 0 && { + description: extractedComments[0] + }) + }; + }); + }, + + encode(messages, context) { + const encodedMessages = getSortedMessages(messages).map((msg) => { + const {description, id, message, ...rest} = msg; + + const lastDotIndex = id.lastIndexOf(NAMESPACE_SEPARATOR); + const hasNamespace = id.includes(NAMESPACE_SEPARATOR); + + const msgid = hasNamespace + ? id.slice(lastDotIndex + NAMESPACE_SEPARATOR.length) + : id; + + return { + msgid, + msgstr: message, + ...(description && {extractedComments: [description]}), + ...(hasNamespace && {msgctxt: id.slice(0, lastDotIndex)}), + ...rest + }; + }); + + return POParser.serialize({ + meta: { + Language: context.locale, + ...DEFAULT_METADATA, + ...metadataByLocale.get(context.locale) + }, + messages: encodedMessages + }); + }, + + toJSONString(source, context) { + const parsed = this.decode(source, context); + const messagesObject = {}; + for (const message of parsed) { + setNestedProperty(messagesObject, message.id, message.message); + } + return JSON.stringify(messagesObject); + } + }; +}); diff --git a/packages/next-intl/src/extractor/format/codecs/fixtures/JSONCodecStructured.tsx b/packages/next-intl/src/extractor/format/codecs/fixtures/JSONCodecStructured.tsx new file mode 100644 index 000000000..09b11dd21 --- /dev/null +++ b/packages/next-intl/src/extractor/format/codecs/fixtures/JSONCodecStructured.tsx @@ -0,0 +1,38 @@ +import {defineCodec} from '../../ExtractorCodec.js'; + +type StoredMessage = {message: string; description?: string}; + +export default defineCodec(() => ({ + decode(content) { + const data = JSON.parse(content); + return Object.entries(data).map(([id, value]) => { + const obj = value as StoredMessage; + return { + id, + message: obj.message, + ...(obj.description && {description: obj.description}) + }; + }); + }, + + encode(messages) { + const obj: Record = {}; + for (const msg of messages) { + obj[msg.id] = { + message: msg.message, + ...(msg.description && {description: msg.description}) + }; + } + return JSON.stringify(obj, null, 2) + '\n'; + }, + + toJSONString(content) { + const data = JSON.parse(content); + const result: Record = {}; + for (const [id, value] of Object.entries(data)) { + const obj = value as StoredMessage; + result[id] = obj.message; + } + return JSON.stringify(result); + } +})); diff --git a/packages/next-intl/src/extractor/format/codecs/fixtures/POCodecSourceMessageKey.tsx b/packages/next-intl/src/extractor/format/codecs/fixtures/POCodecSourceMessageKey.tsx new file mode 100644 index 000000000..994ac172c --- /dev/null +++ b/packages/next-intl/src/extractor/format/codecs/fixtures/POCodecSourceMessageKey.tsx @@ -0,0 +1,88 @@ +import POParser from 'po-parser'; +import {getSortedMessages, setNestedProperty} from '../../../utils.js'; +import {defineCodec} from '../../ExtractorCodec.js'; + +export default defineCodec(() => { + const DEFAULT_METADATA = { + 'Content-Type': 'text/plain; charset=utf-8', + 'Content-Transfer-Encoding': '8bit', + 'X-Generator': 'next-intl' + }; + + const metadataByLocale = new Map(); + + return { + decode(content, context) { + const catalog = POParser.parse(content); + if (catalog.meta) { + metadataByLocale.set(context.locale, catalog.meta); + } + const messages = + catalog.messages || ([] as NonNullable); + + return messages.map((msg) => { + const {extractedComments, msgctxt, msgid, msgstr, ...rest} = msg; + + // Necessary to restore the ID + if (!msgctxt) { + throw new Error('msgctxt is required'); + } + + if (extractedComments && extractedComments.length > 1) { + throw new Error( + `Multiple extracted comments are not supported. Found ${extractedComments.length} comments for msgid "${msgid}".` + ); + } + + return { + ...rest, + id: msgctxt, + message: msgstr, + ...(extractedComments && + extractedComments.length > 0 && { + description: extractedComments[0] + }) + }; + }); + }, + + encode(messages, context) { + const encodedMessages = getSortedMessages(messages).map((msg) => { + const sourceMessage = context.sourceMessagesById.get(msg.id)?.message; + if (!sourceMessage) { + throw new Error( + `Source message not found for id "${msg.id}" in locale "${context.locale}".` + ); + } + + // Store the hashed ID in msgctxt so we can restore it during decode + const {description, id, message, ...rest} = msg; + return { + ...(description && {extractedComments: [description]}), + ...rest, + msgctxt: id, + msgid: sourceMessage, + msgstr: message + }; + }); + + return POParser.serialize({ + meta: { + Language: context.locale, + ...DEFAULT_METADATA, + ...metadataByLocale.get(context.locale) + }, + messages: encodedMessages + }); + }, + + toJSONString(source, context) { + const parsed = this.decode(source, context); + const messagesObject = {}; + for (const message of parsed) { + setNestedProperty(messagesObject, message.id, message.message); + } + return JSON.stringify(messagesObject); + } + }; +}); diff --git a/packages/next-intl/src/extractor/format/index.tsx b/packages/next-intl/src/extractor/format/index.tsx new file mode 100644 index 000000000..7b008d1de --- /dev/null +++ b/packages/next-intl/src/extractor/format/index.tsx @@ -0,0 +1,62 @@ +import path from 'path'; +import {throwError} from '../../plugin/utils.js'; +import type ExtractorCodec from './ExtractorCodec.js'; +import type {BuiltInMessagesFormat, MessagesFormat} from './types.js'; + +const formats = { + json: {codec: () => import('./codecs/JSONCodec.js'), extension: '.json'}, + po: {codec: () => import('./codecs/POCodec.js'), extension: '.po'} +} satisfies Record< + string, + { + codec(): Promise<{default(): ExtractorCodec}>; + extension: `.${string}`; + } +>; + +export default formats; + +function isBuiltInFormat( + format: MessagesFormat +): format is BuiltInMessagesFormat { + return typeof format === 'string' && format in formats; +} + +export function getFormatExtension(format: MessagesFormat): string { + if (isBuiltInFormat(format)) { + return formats[format].extension; + } else { + return format.extension; + } +} + +export async function resolveCodec( + format: MessagesFormat, + projectRoot: string +): Promise { + if (isBuiltInFormat(format)) { + const factory = (await formats[format].codec()).default; + return factory(); + } else { + const resolvedPath = path.isAbsolute(format.codec) + ? format.codec + : path.resolve(projectRoot, format.codec); + + let module; + try { + module = await import(resolvedPath); + } catch (error) { + throwError(`Could not load codec from "${resolvedPath}".\n${error}`); + } + + const factory = module.default; + + if (!factory || typeof factory !== 'function') { + throwError( + `Codec at "${resolvedPath}" must have a default export returned from \`defineCodec\`.` + ); + } + + return factory(); + } +} diff --git a/packages/next-intl/src/extractor/format/types.tsx b/packages/next-intl/src/extractor/format/types.tsx new file mode 100644 index 000000000..ecd18e902 --- /dev/null +++ b/packages/next-intl/src/extractor/format/types.tsx @@ -0,0 +1,10 @@ +import type formats from './index.js'; + +export type BuiltInMessagesFormat = keyof typeof formats; + +type CustomMessagesFormat = { + codec: string; + extension: `.${string}`; +}; + +export type MessagesFormat = BuiltInMessagesFormat | CustomMessagesFormat; diff --git a/packages/next-intl/src/extractor/formatters/Formatter.tsx b/packages/next-intl/src/extractor/formatters/Formatter.tsx deleted file mode 100644 index cd5fd9d05..000000000 --- a/packages/next-intl/src/extractor/formatters/Formatter.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type {ExtractedMessage, Locale} from '../types.js'; - -export type FormatterContext = { - locale: Locale; -}; - -export default abstract class Formatter { - abstract readonly EXTENSION: `.${string}`; - - abstract parse( - content: string, - context: FormatterContext - ): Array; - - abstract serialize( - messages: Array, - context: FormatterContext - ): string; - - abstract toJSONString(source: string, context: FormatterContext): string; -} diff --git a/packages/next-intl/src/extractor/formatters/JSONFormatter.tsx b/packages/next-intl/src/extractor/formatters/JSONFormatter.tsx deleted file mode 100644 index 0950ff5e0..000000000 --- a/packages/next-intl/src/extractor/formatters/JSONFormatter.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type {ExtractedMessage} from '../types.js'; -import {setNestedProperty} from '../utils.js'; -import Formatter from './Formatter.js'; -import {getSortedMessages} from './utils.js'; - -interface StoredFormat { - [key: string]: string | StoredFormat; -} - -export default class JSONFormatter extends Formatter { - static readonly NAMESPACE_SEPARATOR = '.'; - public readonly EXTENSION = '.json'; - - public parse(source: string): Array { - const json: StoredFormat = JSON.parse(source); - const messages: Array = []; - - this.traverseMessages(json, (message, id) => { - messages.push({id, message}); - }); - - return messages; - } - - public serialize(messages: Array): string { - const root: StoredFormat = {}; - for (const message of getSortedMessages(messages)) { - setNestedProperty(root, message.id, message.message); - } - return JSON.stringify(root, null, 2) + '\n'; - } - - public toJSONString(source: string) { - return source; - } - - private traverseMessages( - obj: StoredFormat, - callback: (value: string, path: string) => void, - path = '' - ): void { - for (const key of Object.keys(obj)) { - const newPath = path - ? path + JSONFormatter.NAMESPACE_SEPARATOR + key - : key; - const value = obj[key]; - if (typeof value === 'string') { - callback(value, newPath); - } else if (typeof value === 'object') { - this.traverseMessages(value, callback, newPath); - } - } - } -} diff --git a/packages/next-intl/src/extractor/formatters/POFormatter.tsx b/packages/next-intl/src/extractor/formatters/POFormatter.tsx deleted file mode 100644 index a7d7606b2..000000000 --- a/packages/next-intl/src/extractor/formatters/POFormatter.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import POParser from 'po-parser'; -import type {ExtractedMessage, Locale} from '../types.js'; -import {setNestedProperty} from '../utils.js'; -import Formatter, {type FormatterContext} from './Formatter.js'; -import {getSortedMessages} from './utils.js'; - -export default class POFormatter extends Formatter { - // See also https://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html - private static readonly DEFAULT_METADATA = { - // Recommended by spec - 'Content-Type': 'text/plain; charset=utf-8', - 'Content-Transfer-Encoding': '8bit', - - // Otherwise other tools might set this - 'X-Generator': 'next-intl', - - // Crowdin defaults to using msgid as source key - 'X-Crowdin-SourceKey': 'msgstr' - }; - - public readonly EXTENSION = '.po'; - - // Metadata is stored so it can be retained when writing - private metadataByLocale: Map> = new Map(); - - public parse( - content: string, - context: FormatterContext - ): Array { - const catalog = POParser.parse(content); - - // Store metadata for this locale - if (catalog.meta) { - this.metadataByLocale.set(context.locale, catalog.meta); - } - - return catalog.messages || []; - } - - public serialize( - messages: Array, - context: FormatterContext - ): string { - const meta = { - Language: context.locale, - ...POFormatter.DEFAULT_METADATA, - ...this.metadataByLocale.get(context.locale) - }; - - return POParser.serialize({ - meta, - messages: getSortedMessages(messages) - }); - } - - public toJSONString(source: string, context: FormatterContext) { - const parsed = this.parse(source, context); - - const messagesObject: Record = {}; - for (const message of parsed) { - setNestedProperty(messagesObject, message.id, message.message); - } - - return JSON.stringify(messagesObject, null, 2); - } -} diff --git a/packages/next-intl/src/extractor/formatters/index.tsx b/packages/next-intl/src/extractor/formatters/index.tsx deleted file mode 100644 index ed238102e..000000000 --- a/packages/next-intl/src/extractor/formatters/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import type {MessagesFormat} from '../types.js'; -import type Formatter from './Formatter.js'; - -const formatters = { - json: () => import('./JSONFormatter.js'), - po: () => import('./POFormatter.js') -} satisfies Record< - MessagesFormat, - () => Promise<{default: new () => Formatter}> ->; - -export default formatters; diff --git a/packages/next-intl/src/extractor/formatters/utils.tsx b/packages/next-intl/src/extractor/formatters/utils.tsx deleted file mode 100644 index aeb58de3a..000000000 --- a/packages/next-intl/src/extractor/formatters/utils.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import type {ExtractedMessage} from '../types.js'; -import {localeCompare} from '../utils.js'; - -export function getSortedMessages( - messages: Array -): Array { - return messages.toSorted((messageA, messageB) => { - const pathA = messageA.references?.[0]?.path ?? ''; - const pathB = messageB.references?.[0]?.path ?? ''; - - if (pathA === pathB) { - return localeCompare(messageA.id, messageB.id); - } else { - return localeCompare(pathA, pathB); - } - }); -} diff --git a/packages/next-intl/src/extractor/index.tsx b/packages/next-intl/src/extractor/index.tsx index 1abde4a36..30e43bb47 100644 --- a/packages/next-intl/src/extractor/index.tsx +++ b/packages/next-intl/src/extractor/index.tsx @@ -1 +1,2 @@ export {default as unstable_extractMessages} from './extractMessages.js'; +export {defineCodec} from './format/ExtractorCodec.js'; diff --git a/packages/next-intl/src/extractor/source/SourceFileFilter.tsx b/packages/next-intl/src/extractor/source/SourceFileFilter.tsx index a0b592432..d836b303c 100644 --- a/packages/next-intl/src/extractor/source/SourceFileFilter.tsx +++ b/packages/next-intl/src/extractor/source/SourceFileFilter.tsx @@ -5,18 +5,18 @@ export default class SourceFileFilter { // Will not be entered, except if explicitly asked for // TODO: At some point we should infer these from .gitignore - private static readonly IGNORED_DIRECTORIES = [ + public static readonly IGNORED_DIRECTORIES = [ 'node_modules', '.next', '.git' ]; - static isSourceFile(filePath: string) { + public static isSourceFile(filePath: string) { const ext = path.extname(filePath); return SourceFileFilter.EXTENSIONS.map((cur) => '.' + cur).includes(ext); } - static shouldEnterDirectory( + public static shouldEnterDirectory( dirPath: string, srcPaths: Array ): boolean { diff --git a/packages/next-intl/src/extractor/source/SourceFileScanner.tsx b/packages/next-intl/src/extractor/source/SourceFileScanner.tsx index f6b9d08f4..4cea6eee1 100644 --- a/packages/next-intl/src/extractor/source/SourceFileScanner.tsx +++ b/packages/next-intl/src/extractor/source/SourceFileScanner.tsx @@ -25,13 +25,14 @@ export default class SourceFileScanner { return acc; } - static async getSourceFiles(srcPaths: Array): Promise> { - return ( + static async getSourceFiles(srcPaths: Array): Promise> { + const files = ( await Promise.all( srcPaths.map((srcPath) => SourceFileScanner.walkSourceFiles(srcPath, srcPaths) ) ) ).flat(); + return new Set(files); } } diff --git a/packages/next-intl/src/extractor/source/SourceFileWatcher.tsx b/packages/next-intl/src/extractor/source/SourceFileWatcher.tsx new file mode 100644 index 000000000..febd82da1 --- /dev/null +++ b/packages/next-intl/src/extractor/source/SourceFileWatcher.tsx @@ -0,0 +1,52 @@ +import {type AsyncSubscription, type Event, subscribe} from '@parcel/watcher'; +import SourceFileFilter from './SourceFileFilter.js'; + +type OnChange = (events: Array) => Promise; + +export default class SourceFileWatcher implements Disposable { + private subscriptions: Array = []; + private roots: Array; + private onChange: OnChange; + + constructor(roots: Array, onChange: OnChange) { + this.roots = roots; + this.onChange = onChange; + } + + async start() { + if (this.subscriptions.length > 0) return; + + const ignore = SourceFileFilter.IGNORED_DIRECTORIES.map( + (dir) => `**/${dir}/**` + ); + + for (const root of this.roots) { + const sub = await subscribe( + root, + (err, events) => { + if (err) { + console.error(err); + return; + } + const filteredEvents = events.filter((event) => + SourceFileFilter.isSourceFile(event.path) + ); + if (filteredEvents.length > 0) { + void this.onChange(filteredEvents); + } + }, + {ignore} + ); + this.subscriptions.push(sub); + } + } + + async stop() { + await Promise.all(this.subscriptions.map((sub) => sub.unsubscribe())); + this.subscriptions = []; + } + + [Symbol.dispose](): void { + void this.stop(); + } +} diff --git a/packages/next-intl/src/extractor/types.tsx b/packages/next-intl/src/extractor/types.tsx index 881637efa..97c15f7fe 100644 --- a/packages/next-intl/src/extractor/types.tsx +++ b/packages/next-intl/src/extractor/types.tsx @@ -1,11 +1,11 @@ -export type MessagesFormat = 'json' | 'po'; +import type {MessagesFormat} from './format/types.js'; // Is likely the same as the `Locale` type in `use-intl`, // but users may map messages to runtime locales, therefore // don't require a match here. export type Locale = string; -export type ExtractedMessage = { +export type ExtractorMessage = { id: string; message: string; description?: string; diff --git a/packages/next-intl/src/extractor/formatters/utils.test.tsx b/packages/next-intl/src/extractor/utils.test.tsx similarity index 100% rename from packages/next-intl/src/extractor/formatters/utils.test.tsx rename to packages/next-intl/src/extractor/utils.test.tsx diff --git a/packages/next-intl/src/extractor/utils.tsx b/packages/next-intl/src/extractor/utils.tsx index 6f6467cf4..97bcfb1b5 100644 --- a/packages/next-intl/src/extractor/utils.tsx +++ b/packages/next-intl/src/extractor/utils.tsx @@ -1,3 +1,6 @@ +import type {ExtractorMessage} from './types.js'; + +// Essentialls lodash/set, but we avoid this dependency export function setNestedProperty( obj: Record, keyPath: string, @@ -21,6 +24,25 @@ export function setNestedProperty( current[keys[keys.length - 1]] = value; } +export function getSortedMessages( + messages: Array +): Array { + return messages.toSorted((messageA, messageB) => { + const pathA = messageA.references?.[0]?.path ?? ''; + const pathB = messageB.references?.[0]?.path ?? ''; + + if (pathA === pathB) { + return localeCompare(messageA.id, messageB.id); + } else { + return localeCompare(pathA, pathB); + } + }); +} + export function localeCompare(a: string, b: string) { return a.localeCompare(b, 'en'); } + +export function getDefaultProjectRoot() { + return process.cwd(); +} diff --git a/packages/next-intl/src/plugin/catalog/catalogLoader.tsx b/packages/next-intl/src/plugin/catalog/catalogLoader.tsx index 416b51e03..7b4bc91df 100644 --- a/packages/next-intl/src/plugin/catalog/catalogLoader.tsx +++ b/packages/next-intl/src/plugin/catalog/catalogLoader.tsx @@ -1,17 +1,21 @@ import path from 'path'; -import type Formatter from '../../extractor/formatters/Formatter.js'; -import formatters from '../../extractor/formatters/index.js'; +import type ExtractorCodec from '../../extractor/format/ExtractorCodec.js'; +import { + getFormatExtension, + resolveCodec +} from '../../extractor/format/index.js'; import type {CatalogLoaderConfig} from '../../extractor/types.js'; import type {TurbopackLoaderContext} from '../types.js'; -let cachedFormatter: Formatter | null = null; -async function getFormatter(options: CatalogLoaderConfig): Promise { - if (!cachedFormatter) { - const FormatterClass = (await formatters[options.messages.format]()) - .default; - cachedFormatter = new FormatterClass(); +let cachedCodec: ExtractorCodec | null = null; +async function getCodec( + options: CatalogLoaderConfig, + projectRoot: string +): Promise { + if (!cachedCodec) { + cachedCodec = await resolveCodec(options.messages.format, projectRoot); } - return cachedFormatter; + return cachedCodec; } /** @@ -27,11 +31,12 @@ export default function catalogLoader( ) { const options = this.getOptions(); const callback = this.async(); + const extension = getFormatExtension(options.messages.format); - getFormatter(options) - .then((formatter) => { - const locale = path.basename(this.resourcePath, formatter.EXTENSION); - const jsonString = formatter.toJSONString(source, {locale}); + getCodec(options, this.rootContext) + .then((codec) => { + const locale = path.basename(this.resourcePath, extension); + const jsonString = codec.toJSONString(source, {locale}); // https://v8.dev/blog/cost-of-javascript-2019#json const result = `export default JSON.parse(${JSON.stringify(jsonString)});`; diff --git a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx index c72e654a7..4ec1f85d0 100644 --- a/packages/next-intl/src/plugin/createNextIntlPlugin.tsx +++ b/packages/next-intl/src/plugin/createNextIntlPlugin.tsx @@ -10,7 +10,7 @@ function initPlugin( ): NextConfig { if (nextConfig?.i18n != null) { warn( - "\n[next-intl] An `i18n` property was found in your Next.js config. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the Pages Router, you can refer to this example: https://next-intl.dev/examples#app-router-migration\n" + "An `i18n` property was found in your Next.js config. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the Pages Router, you can refer to this example: https://next-intl.dev/examples#app-router-migration\n" ); } diff --git a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx index 893f2a0ba..7e97bcf96 100644 --- a/packages/next-intl/src/plugin/extractor/extractionLoader.tsx +++ b/packages/next-intl/src/plugin/extractor/extractionLoader.tsx @@ -1,4 +1,5 @@ import ExtractionCompiler from '../../extractor/ExtractionCompiler.js'; +import MessageExtractor from '../../extractor/extractor/MessageExtractor.js'; import type {ExtractorConfig} from '../../extractor/types.js'; import type {TurbopackLoaderContext} from '../types.js'; @@ -7,6 +8,8 @@ import type {TurbopackLoaderContext} from '../types.js'; // - Is the same across react-client and react-server // - Is only lost when the dev server restarts (e.g. due to change to Next.js config) let compiler: ExtractionCompiler | undefined; +let extractor: MessageExtractor | undefined; +let extractAllPromise: Promise | undefined; export default function extractionLoader( this: TurbopackLoaderContext, @@ -14,18 +17,40 @@ export default function extractionLoader( ) { const options = this.getOptions(); const callback = this.async(); + const projectRoot = this.rootContext; + + // Avoid rollup's `replace` plugin to compile this away + const isDevelopment = process.env['NODE_ENV'.trim()] === 'development'; + + if (!extractor) { + // This instance is shared with the compiler to enable caching + // across code transformations and catalog extraction + extractor = new MessageExtractor({ + isDevelopment, + projectRoot, + sourceMap: this.sourceMap + }); + } if (!compiler) { compiler = new ExtractionCompiler(options, { - // Avoid rollup's `replace` plugin to compile this away - isDevelopment: process.env['NODE_ENV'.trim()] === 'development', - sourceMap: this.sourceMap + isDevelopment, + projectRoot, + sourceMap: this.sourceMap, + extractor }); } - compiler - .compile(this.resourcePath, source) - .then((result) => { + if (!extractAllPromise) { + extractAllPromise = compiler.extractAll(); + } + + extractor + .extract(this.resourcePath, source) + .then(async (result) => { + if (!isDevelopment) { + await extractAllPromise; + } callback(null, result.code, result.map); }) .catch(callback); diff --git a/packages/next-intl/src/plugin/getNextConfig.tsx b/packages/next-intl/src/plugin/getNextConfig.tsx index 763766d34..8f7c75ecb 100644 --- a/packages/next-intl/src/plugin/getNextConfig.tsx +++ b/packages/next-intl/src/plugin/getNextConfig.tsx @@ -7,6 +7,7 @@ import type { TurbopackRuleConfigItem } from 'next/dist/server/config-shared.js'; import type {Configuration} from 'webpack'; +import {getFormatExtension} from '../extractor/format/index.js'; import SourceFileFilter from '../extractor/source/SourceFileFilter.js'; import type {CatalogLoaderConfig, ExtractorConfig} from '../extractor/types.js'; import {hasStableTurboConfig, isNextJs16OrHigher} from './nextFlags.js'; @@ -72,7 +73,7 @@ export default function getNextConfig( function getExtractMessagesLoaderConfig() { const experimental = pluginConfig.experimental!; - if (!experimental.srcPath || !experimental.messages) { + if (!experimental.srcPath || !pluginConfig.experimental?.messages) { throwError( '`srcPath` and `messages` are required when using `extractor`.' ); @@ -82,7 +83,7 @@ export default function getNextConfig( options: { srcPath: experimental.srcPath, sourceLocale: experimental.extract!.sourceLocale, - messages: experimental.messages + messages: pluginConfig.experimental.messages } satisfies ExtractorConfig as TurbopackLoaderOptions }; } @@ -173,7 +174,10 @@ export default function getNextConfig( throwError('Message catalog loading requires Next.js 16 or higher.'); } rules ??= getTurboRules(); - addTurboRule(rules!, `*.${pluginConfig.experimental.messages.format}`, { + const extension = getFormatExtension( + pluginConfig.experimental.messages.format + ); + addTurboRule(rules!, `*${extension}`, { loaders: [getCatalogLoaderConfig()], condition: { path: `${pluginConfig.experimental.messages.path}/**/*` @@ -242,8 +246,11 @@ export default function getNextConfig( if (pluginConfig.experimental?.messages) { if (!config.module) config.module = {}; if (!config.module.rules) config.module.rules = []; + const extension = getFormatExtension( + pluginConfig.experimental.messages.format + ); config.module.rules.push({ - test: new RegExp(`\\.${pluginConfig.experimental.messages.format}$`), + test: new RegExp(`${extension.replace(/\./g, '\\.')}$`), include: path.resolve( config.context!, pluginConfig.experimental.messages.path diff --git a/packages/next-intl/src/plugin/types.tsx b/packages/next-intl/src/plugin/types.tsx index eb61009ce..f6330bd26 100644 --- a/packages/next-intl/src/plugin/types.tsx +++ b/packages/next-intl/src/plugin/types.tsx @@ -1,5 +1,5 @@ import type {LoaderContext} from 'webpack'; -import type {MessagesFormat} from '../extractor/types.js'; +import type {MessagesFormat} from '../extractor/format/types.js'; export type PluginConfig = { requestConfig?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14193d248..18e36d2ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,14 +17,14 @@ importers: .: devDependencies: '@lerna-lite/cli': - specifier: 3.9.0 - version: 3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(@lerna-lite/version@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2))(typescript@5.8.2) + specifier: ^4.9.4 + version: 4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@lerna-lite/version@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10) '@lerna-lite/publish': - specifier: 3.9.0 - version: 3.9.0(typescript@5.8.2) + specifier: ^4.9.4 + version: 4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0) conventional-changelog-conventionalcommits: - specifier: 7.0.2 - version: 7.0.2 + specifier: ^8.0.0 + version: 8.0.0 turbo: specifier: ^2.4.4 version: 2.4.4 @@ -94,7 +94,7 @@ importers: version: 9.11.1(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -210,7 +210,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) eslint: specifier: ^9.38.0 version: 9.38.0(jiti@2.4.2) @@ -225,7 +225,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.8 - version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) examples/example-app-router-migration: dependencies: @@ -323,7 +323,7 @@ importers: version: 16.0.8(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@16.0.8(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 4.24.11(next@16.0.8(@playwright/test@1.55.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -764,7 +764,7 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.9.2 - version: 2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0) + version: 2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))(yaml@2.8.2) '@types/accept-language-parser': specifier: ^1.5.7 version: 1.5.7 @@ -801,7 +801,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -810,13 +810,16 @@ importers: version: 5.8.2 vite: specifier: ^6.2.1 - version: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) packages/next-intl: dependencies: '@formatjs/intl-localematcher': specifier: ^0.5.4 version: 0.5.10 + '@parcel/watcher': + specifier: ^2.4.1 + version: 2.5.1 '@swc/core': specifier: ^1.15.2 version: 1.15.2 @@ -827,8 +830,8 @@ importers: specifier: workspace:^ version: link:../swc-plugin-extractor po-parser: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^2.0.0 + version: 2.0.0 use-intl: specifier: workspace:^ version: link:../use-intl @@ -865,7 +868,7 @@ importers: version: 9.11.1(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) eslint-plugin-react-compiler: specifier: 0.0.0-experimental-8e3b87c-20240822 version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)) @@ -904,7 +907,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.8 - version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) packages/swc-plugin-extractor: {} @@ -946,7 +949,7 @@ importers: version: 9.11.1(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) eslint-plugin-react-compiler: specifier: 0.0.0-experimental-8e3b87c-20240822 version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)) @@ -979,7 +982,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.8 - version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) tools: devDependencies: @@ -1012,7 +1015,7 @@ importers: version: 9.38.0(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) execa: specifier: ^9.5.2 version: 9.5.2 @@ -2051,6 +2054,18 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} + '@conventional-changelog/git-client@2.5.1': + resolution: {integrity: sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.1.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + '@corex/deepmerge@4.0.43': resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} @@ -2822,10 +2837,6 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} - '@hutson/parse-repository-url@5.0.0': - resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} - engines: {node: '>=10.13.0'} - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -3063,38 +3074,75 @@ packages: cpu: [x64] os: [win32] - '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} - '@inquirer/expand@2.3.0': - resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/figures@1.0.11': - resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/input@2.3.0': - resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/select@2.5.0': - resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -3242,9 +3290,9 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@lerna-lite/cli@3.9.0': - resolution: {integrity: sha512-sw7vVf9YDDjlLJVjcHyWkUSXF7cnwYNSFHaVjagmXyEoeeK5RtDBTEgCDkO17GP5mff1lRHoahrt/SCDV7KBxg==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/cli@4.9.4': + resolution: {integrity: sha512-n84BW9ZQULh8JgDCngRNcWAu8PXuwYa2BAFj5uGTk2FGSfi2jlAqRU1npduK1tn0n+qQ7GefeCoXDqFWGIB2ag==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true peerDependencies: '@lerna-lite/exec': '*' @@ -3267,29 +3315,25 @@ packages: '@lerna-lite/watch': optional: true - '@lerna-lite/core@3.9.0': - resolution: {integrity: sha512-gpQ8TYB5HE1R31zmaNsSuutm8QBPIw7Fyxd0/xbY3VZ76tEt0PtpU0BIcoPlFx1ZvRAWWUCr/Obq8rvpyF622Q==} - engines: {node: ^18.0.0 || >=20.0.0} - - '@lerna-lite/init@3.9.0': - resolution: {integrity: sha512-OwKpywZAllU/gLdH+abESjp5+mvuoCyNaokhyaF/aeu6qVkEK0NONgU+5fnJwQrbMWYNLiujKtP0HQzmIW8YyA==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/core@4.9.4': + resolution: {integrity: sha512-dQOMJXyT0nyL4H7UZn2Gnj+1I1Zoh47/l1+cJ8xPQzCUjQYkTwH/9dcj3NLeQ7Vyt3Kqobhxl4aUnK3XUcNMjw==} + engines: {node: ^20.17.0 || >=22.9.0} - '@lerna-lite/npmlog@3.12.1': - resolution: {integrity: sha512-+2bEqCrTw7DkARfuWjVCgVZEdlwTE7l/ha05K+o/WIouLDkf3YpZKPv/cx9hOo61y5ALGXHIyY6gvAAKGHQQhA==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/init@4.9.4': + resolution: {integrity: sha512-KHmXKABFLOn0mncmnZRrQ0+yvXFilv209dcF2EOe6UeJN26SOPaEax8lDJOL2c+hto+d127OYfYD0KyQkBH24w==} + engines: {node: ^20.17.0 || >=22.9.0} - '@lerna-lite/npmlog@3.8.0': - resolution: {integrity: sha512-ny8vueqyhWZtNRsoOVUybdOK6KcGDpLzFD01Ae4k/NjEw1ap3v6sUS0k7h/U2/HmZgiR0bU+XRJShuoUZf6E/g==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/npmlog@4.9.4': + resolution: {integrity: sha512-ekxGJgN6hGqHEah+JHwk38COCqqyfTCpr7WpuyeYAEPjTInYg1HcudUJzNDXsMuEiVLclyAyf0DoY9k59/utcA==} + engines: {node: ^20.17.0 || >=22.9.0} - '@lerna-lite/publish@3.9.0': - resolution: {integrity: sha512-D5YVwTtMFjZa1sMQ4mQ/TiaFD1b/S9N+XL4L5/hsy8JiTPE8S8O1SyyqJQ5iyaGAdi/sLXT+xyF5Z9aAeIvwhw==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/publish@4.9.4': + resolution: {integrity: sha512-ms3GqUAqAM5ut2Ki9uhUMyV7x91S1Y7eQPBTd1E3oWoa6htKavAnM/bmc4yoHq9zVZcEhIAvysKSEo6vkGFGRg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@lerna-lite/version@3.9.0': - resolution: {integrity: sha512-tVtZL4c7+9lTOxIVWlztJGjGxQvJxG7gojApHcoCJ2MAq0mtIPAOIts2JJWjPxKXOzqKq1S5N3Ke+e74/zx/4g==} - engines: {node: ^18.0.0 || >=20.0.0} + '@lerna-lite/version@4.9.4': + resolution: {integrity: sha512-hRFGB47RWHNKZkh9t+ka34kNlv5DQwrIDBvjI+mmzZqZK7UAtPRsJoE+MlQHVlQApDFwUPiSTdxY9UXzJrYFdQ==} + engines: {node: ^20.17.0 || >=22.9.0} '@loaderkit/resolve@1.0.3': resolution: {integrity: sha512-oo51csrgEfeHO593bqoPOGwrX093QzDWrc/7y876b/ObDqp2Hbw+rl+3s26WRXIbnhty40T403nwU4UFX3KQCg==} @@ -3633,13 +3677,13 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@npmcli/agent@2.2.2': - resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/arborist@7.5.4': - resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/arborist@9.1.8': + resolution: {integrity: sha512-TYAzq0oaXQU+uLfXFbR2wYx62qHIOSg/TYhGWJSphJDypyjdNXC7B/+k29ElC2vWlWfX4OJnhmSY5DTwSFiNpg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true '@npmcli/fs@1.1.1': @@ -3649,126 +3693,212 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/git@4.1.0': resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@npmcli/git@5.0.8': - resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/git@7.0.1': + resolution: {integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/installed-package-contents@2.1.0': - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/installed-package-contents@4.0.0': + resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/map-workspaces@5.0.3': + resolution: {integrity: sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/metavuln-calculator@7.1.1': - resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/metavuln-calculator@9.0.3': + resolution: {integrity: sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg==} + engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/move-file@1.1.2': resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/name-from-folder@4.0.0': + resolution: {integrity: sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/package-json@4.0.1': resolution: {integrity: sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@npmcli/package-json@5.2.1': - resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/package-json@7.0.4': + resolution: {integrity: sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==} + engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/promise-spawn@6.0.2': resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@npmcli/promise-spawn@7.0.2': - resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/promise-spawn@9.0.1': + resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/query@3.1.0': - resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/query@5.0.0': + resolution: {integrity: sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/redact@2.0.1': - resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/redact@4.0.0': + resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/run-script@8.1.0': - resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@10.0.3': + resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==} + engines: {node: ^20.17.0 || >=22.9.0} - '@octokit/auth-token@5.1.2': - resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} - engines: {node: '>= 18'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} - '@octokit/core@6.1.4': - resolution: {integrity: sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==} - engines: {node: '>= 18'} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} + engines: {node: '>= 20'} - '@octokit/endpoint@10.1.3': - resolution: {integrity: sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==} - engines: {node: '>= 18'} + '@octokit/endpoint@11.0.2': + resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==} + engines: {node: '>= 20'} - '@octokit/graphql@8.2.1': - resolution: {integrity: sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==} - engines: {node: '>= 18'} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} + engines: {node: '>= 20'} - '@octokit/openapi-types@23.0.1': - resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} '@octokit/plugin-enterprise-rest@6.0.1': resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - '@octokit/plugin-paginate-rest@11.4.3': - resolution: {integrity: sha512-tBXaAbXkqVJlRoA/zQVe9mUdb8rScmivqtpv3ovsC5xhje/a+NOCivs7eUhWBwCApJVsR4G5HMeaLbq7PxqZGA==} - engines: {node: '>= 18'} + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-request-log@5.3.1': - resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} - engines: {node: '>= 18'} + '@octokit/plugin-request-log@6.0.0': + resolution: {integrity: sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@13.3.1': - resolution: {integrity: sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ==} - engines: {node: '>= 18'} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@6.1.7': - resolution: {integrity: sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==} - engines: {node: '>= 18'} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} - '@octokit/request@9.2.2': - resolution: {integrity: sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==} - engines: {node: '>= 18'} + '@octokit/request@10.0.7': + resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==} + engines: {node: '>= 20'} - '@octokit/rest@21.1.1': - resolution: {integrity: sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==} - engines: {node: '>= 18'} + '@octokit/rest@22.0.1': + resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} + engines: {node: '>= 20'} - '@octokit/types@13.8.0': - resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} '@panva/hkdf@1.2.0': resolution: {integrity: sha512-97ZQvZJ4gJhi24Io6zI+W7B67I82q1I8i3BSzQ4OyZj1z4OW87/ruF26lrMES58inTKLy2KgVIDcx8PU4AaANQ==} + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -4471,29 +4601,37 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sigstore/bundle@2.3.2': - resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@1.1.0': - resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/core@3.0.0': + resolution: {integrity: sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.3.3': - resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + '@sigstore/protobuf-specs@0.5.0': + resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/sign@2.3.2': - resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/sign@4.0.1': + resolution: {integrity: sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/tuf@2.3.4': - resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/tuf@4.0.0': + resolution: {integrity: sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/verify@1.2.1': - resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/verify@3.0.0': + resolution: {integrity: sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@simple-libs/child-process-utils@1.0.1': + resolution: {integrity: sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==} + engines: {node: '>=18'} + + '@simple-libs/stream-utils@1.1.0': + resolution: {integrity: sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==} + engines: {node: '>=18'} '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -4502,10 +4640,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -4786,9 +4920,9 @@ packages: resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} - '@tufjs/models@2.0.1': - resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@tufjs/models@4.0.0': + resolution: {integrity: sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==} + engines: {node: ^20.17.0 || >=22.9.0} '@types/accept-language-parser@1.5.7': resolution: {integrity: sha512-bFq8qAT6yYi1kgeO2Wk+/ciZSos6UB7q0gic+rzNrT0tRdVm5ZF5+Ou+EHdLWedP0607LO0SKd66ylhKTypS3w==} @@ -5021,9 +5155,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/negotiator@0.6.3': resolution: {integrity: sha512-JkXTOdKs5MF086b/pt8C3+yVp3iDUwG635L7oCH6HvJvvr6lSUU5oe/gLXnPEfYRROHjJIPgCV6cuAg8gGkntQ==} @@ -5045,6 +5176,10 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. + '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -5130,9 +5265,6 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@types/ws@8.18.0': resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} @@ -5532,17 +5664,13 @@ packages: '@zxing/text-encoding@0.9.0': resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -5596,9 +5724,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - address@1.1.2: resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} engines: {node: '>= 0.12.0'} @@ -5742,8 +5867,8 @@ packages: aproba@1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} arg@4.1.0: resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} @@ -6059,8 +6184,8 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - before-after-hook@3.0.2: - resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} @@ -6081,9 +6206,9 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - bin-links@4.0.4: - resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + bin-links@6.0.0: + resolution: {integrity: sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w==} + engines: {node: ^20.17.0 || >=22.9.0} binary-extensions@1.13.1: resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} @@ -6279,9 +6404,9 @@ packages: resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - cacache@18.0.4: - resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} - engines: {node: ^16.14.0 || >=18.0.0} + cacache@20.0.3: + resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} + engines: {node: ^20.17.0 || >=22.9.0} cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} @@ -6424,6 +6549,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -6439,8 +6568,8 @@ packages: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} - ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} cipher-base@1.0.4: @@ -6527,6 +6656,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -6543,9 +6676,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cmd-shim@6.0.3: - resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cmd-shim@8.0.0: + resolution: {integrity: sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA==} + engines: {node: ^20.17.0 || >=22.9.0} co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -6581,10 +6714,6 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} @@ -6714,9 +6843,6 @@ packages: console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} @@ -6728,39 +6854,40 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@8.1.0: + resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} + engines: {node: '>=18'} - conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + conventional-changelog-conventionalcommits@8.0.0: + resolution: {integrity: sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==} + engines: {node: '>=18'} - conventional-changelog-core@7.0.0: - resolution: {integrity: sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==} - engines: {node: '>=16'} + conventional-changelog-preset-loader@5.0.0: + resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} + engines: {node: '>=18'} - conventional-changelog-preset-loader@4.1.0: - resolution: {integrity: sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==} - engines: {node: '>=16'} + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} + engines: {node: '>=18'} + hasBin: true - conventional-changelog-writer@7.0.1: - resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} - engines: {node: '>=16'} + conventional-changelog@7.1.1: + resolution: {integrity: sha512-rlqa8Lgh8YzT3Akruk05DR79j5gN9NCglHtJZwpi6vxVeaoagz+84UAtKQj/sT+RsfGaZkt3cdFCjcN6yjr5sw==} + engines: {node: '>=18'} hasBin: true - conventional-commits-filter@4.0.0: - resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} - engines: {node: '>=16'} + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} + conventional-commits-parser@6.2.1: + resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + engines: {node: '>=18'} hasBin: true - conventional-recommended-bump@9.0.0: - resolution: {integrity: sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ==} - engines: {node: '>=16'} + conventional-recommended-bump@11.2.0: + resolution: {integrity: sha512-lqIdmw330QdMBgfL0e6+6q5OMKyIpy4OZNmepit6FS3GldhkG+70drZjuZ0A5NFpze5j85dlYs3GabQXl6sMHw==} + engines: {node: '>=18'} hasBin: true convert-source-map@1.9.0: @@ -7163,18 +7290,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - data-uri-to-buffer@3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} @@ -7250,6 +7369,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -7278,6 +7406,14 @@ packages: babel-plugin-macros: optional: true + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -7396,6 +7532,11 @@ packages: resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} engines: {node: '>=12.20'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -7526,8 +7667,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -8142,6 +8283,10 @@ packages: resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} engines: {node: ^18.19.0 || >=20.5.0} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} @@ -8244,8 +8389,8 @@ packages: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} - fast-content-type-parse@2.0.1: - resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8270,6 +8415,12 @@ packages: fast-loops@1.1.3: resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -8299,6 +8450,9 @@ packages: fbjs@3.0.4: resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: @@ -8307,9 +8461,14 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true fetch-retry@4.1.1: resolution: {integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==} @@ -8486,10 +8645,6 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -8522,8 +8677,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -8668,21 +8823,11 @@ packages: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true - - git-semver-tags@7.0.1: - resolution: {integrity: sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==} - engines: {node: '>=16'} - hasBin: true - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} - git-url-parse@15.0.0: - resolution: {integrity: sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==} + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -8710,6 +8855,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} deprecated: Glob versions prior to v9 are no longer supported @@ -8767,10 +8916,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} @@ -8790,9 +8935,15 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grammex@3.1.12: + resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphmatch@1.1.0: + resolution: {integrity: sha512-0E62MaTW5rPZVRLyIJZG/YejmdA/Xr1QydHEw3Vt+qOKkMIOE8WDLc9ZX2bmAjtJFZcId4lEdrdmASsEy7D1QA==} + graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -9011,6 +9162,14 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -9148,6 +9307,10 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -9183,9 +9346,9 @@ packages: resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ignore-walk@6.0.5: - resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -9266,9 +9429,9 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -9411,10 +9574,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - is-color-stop@1.1.0: resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} @@ -9545,9 +9704,6 @@ packages: resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} engines: {node: '>=0.10.0'} - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -9686,10 +9842,6 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} - is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} @@ -10079,6 +10231,10 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@5.0.0: + resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} + engines: {node: ^20.17.0 || >=22.9.0} + json-schema-deref-sync@0.13.0: resolution: {integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==} engines: {node: '>=6.0.0'} @@ -10095,9 +10251,6 @@ packages: json-stringify-nice@1.1.4: resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json3@3.3.3: resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==} @@ -10203,13 +10356,13 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libnpmaccess@8.0.6: - resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} - engines: {node: ^16.14.0 || >=18.0.0} + libnpmaccess@10.0.3: + resolution: {integrity: sha512-JPHTfWJxIK+NVPdNMNGnkz4XGX56iijPbe0qFWbdt68HL+kIvSzh+euBL8npLZvl2fpaxo+1eZSdoG15f5YdIQ==} + engines: {node: ^20.17.0 || >=22.9.0} - libnpmpublish@9.0.9: - resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} - engines: {node: ^16.14.0 || >=18.0.0} + libnpmpublish@11.1.3: + resolution: {integrity: sha512-NVPTth/71cfbdYHqypcO9Lt5WFGTzFEcx81lWd7GDJIgZ95ERdYHGUfCtFejHCyqodKsQkNEx2JCkMpreDty/A==} + engines: {node: ^20.17.0 || >=22.9.0} lightningcss-darwin-arm64@1.29.2: resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} @@ -10286,10 +10439,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - load-json-file@7.0.1: resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -10435,13 +10584,9 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-dir@5.0.0: - resolution: {integrity: sha512-G0yBotnlWVonPClw+tq+xi4K7DZC9n96HjGTBDdHkstAVsDkfZhi1sTvZypXLpyQTbISBkDtK0E5XlUqDsShQg==} - engines: {node: '>=18'} - - make-fetch-happen@13.0.1: - resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} - engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@15.0.3: + resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==} + engines: {node: ^20.17.0 || >=22.9.0} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -10632,9 +10777,9 @@ packages: resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -11028,6 +11173,10 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.0.4: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} @@ -11057,9 +11206,9 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@3.0.5: - resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@5.0.0: + resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==} + engines: {node: ^20.17.0 || >=22.9.0} minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} @@ -11093,6 +11242,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mississippi@3.0.0: resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} engines: {node: '>=4.0.0'} @@ -11159,9 +11312,9 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} mv@2.1.1: resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} @@ -11341,14 +11494,13 @@ packages: node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -11371,10 +11523,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} @@ -11383,9 +11531,9 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp@10.3.1: - resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} - engines: {node: ^16.14.0 || >=18.0.0} + node-gyp@12.1.0: + resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true node-html-parser@1.4.9: @@ -11416,9 +11564,9 @@ packages: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true normalize-css-color@1.0.2: @@ -11435,6 +11583,10 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@7.0.1: + resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} + engines: {node: ^18.17.0 || >=20.5.0} + normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -11455,14 +11607,18 @@ packages: resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - npm-bundled@3.0.1: - resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@5.0.0: + resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} + engines: {node: ^20.17.0 || >=22.9.0} npm-install-checks@6.3.0: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-normalize-package-bin@2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -11471,37 +11627,41 @@ packages: resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-package-arg@10.1.0: resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-package-arg@11.0.3: - resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@13.0.2: + resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} + engines: {node: ^20.17.0 || >=22.9.0} npm-package-arg@7.0.0: resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} + npm-packlist@10.0.3: + resolution: {integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-packlist@5.1.3: resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} npm-pick-manifest@8.0.2: resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-pick-manifest@9.1.0: - resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-registry-fetch@17.1.0: - resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-registry-fetch@19.1.1: + resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} + engines: {node: ^20.17.0 || >=22.9.0} npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} @@ -11739,6 +11899,10 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-limit@7.2.0: + resolution: {integrity: sha512-ATHLtwoTNDloHRFFxFJdHnG6n2WUeFjaR8XQMFdKIv0xkXjrER8/iG9iu265jOM95zXHAfv9oTkqhrfbIzosrQ==} + engines: {node: '>=20'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -11763,17 +11927,17 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} p-pipe@4.0.0: resolution: {integrity: sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w==} engines: {node: '>=12'} - p-queue@8.1.0: - resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} - engines: {node: '>=18'} + p-queue@9.0.1: + resolution: {integrity: sha512-RhBdVhSwJb7Ocn3e8ULk4NMwBEuOxe+1zcgphUy9c2e5aR/xbEsdVXxHJ3lynw6Qiqu7OINEyHlZkiblEpaq7w==} + engines: {node: '>=20'} p-reduce@3.0.0: resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} @@ -11787,9 +11951,9 @@ packages: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} @@ -11804,9 +11968,9 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - pacote@18.0.6: - resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} - engines: {node: ^16.14.0 || >=18.0.0} + pacote@21.0.4: + resolution: {integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true pako@0.2.9: @@ -11832,9 +11996,9 @@ packages: resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} engines: {node: '>= 0.10'} - parse-conflict-json@3.0.1: - resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + parse-conflict-json@5.0.1: + resolution: {integrity: sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ==} + engines: {node: ^20.17.0 || >=22.9.0} parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} @@ -11847,10 +12011,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - parse-json@8.1.0: resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} engines: {node: '>=18'} @@ -11879,8 +12039,9 @@ packages: parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -11961,6 +12122,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} @@ -11974,10 +12139,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -12015,6 +12176,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -12095,8 +12260,8 @@ packages: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} - po-parser@1.0.2: - resolution: {integrity: sha512-yTIQL8PZy7V8c0psPoJUx7fayez+Mo/53MZgX9MPuPHx+Dt+sRPNuRbI+6Oqxnddhkd68x4Nlgon/zizL1Xg+w==} + po-parser@2.0.0: + resolution: {integrity: sha512-SZvoKi3PoI/hHa2V9je9CW7Xgxl4dvO74cvaa6tWShIHT51FkPxje6pt0gTJznJrU67ix91nDaQp2hUxkOYhKA==} points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -12435,9 +12600,13 @@ packages: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -12446,9 +12615,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - proggy@2.0.0: - resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proggy@4.0.0: + resolution: {integrity: sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ==} + engines: {node: ^20.17.0 || >=22.9.0} progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -12751,17 +12920,9 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} - engines: {node: '>=16'} + read-cmd-shim@6.0.0: + resolution: {integrity: sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A==} + engines: {node: ^20.17.0 || >=22.9.0} read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -12771,10 +12932,6 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - read-pkg@9.0.1: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} @@ -13336,6 +13493,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -13469,9 +13631,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@2.3.1: - resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} - engines: {node: ^16.14.0 || >=18.0.0} + sigstore@4.0.0: + resolution: {integrity: sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==} + engines: {node: ^20.17.0 || >=22.9.0} simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -13555,6 +13717,10 @@ packages: resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==} engines: {node: '>=12'} + sort-keys@6.0.0: + resolution: {integrity: sha512-ueSlHJMwpIw42CJ4B11Uxzh/S0p0AlOyiNktlv2KOu5e1JpUE6DlC4AAUjXqesHdBRv/g0wC9Q4vwq0NP2pA9w==} + engines: {node: '>=20'} + source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} @@ -13618,10 +13784,6 @@ packages: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -13635,6 +13797,10 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@13.0.0: + resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==} + engines: {node: ^20.17.0 || >=22.9.0} + ssri@6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} @@ -13851,11 +14017,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true - structured-headers@0.4.1: resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} @@ -14019,6 +14180,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} engines: {node: '>=4'} @@ -14027,10 +14192,6 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} - temp-dir@3.0.0: - resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} - engines: {node: '>=14.16'} - temp@0.8.3: resolution: {integrity: sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==} engines: {'0': node >=0.8.0} @@ -14098,10 +14259,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -14150,6 +14307,10 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -14162,6 +14323,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} @@ -14311,9 +14476,9 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - tuf-js@2.2.1: - resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} - engines: {node: ^16.14.0 || >=18.0.0} + tuf-js@4.0.0: + resolution: {integrity: sha512-Lq7ieeGvXDXwpoSmOSgLWVdsGGV9J4a77oDTAPe/Ltrqnnm/ETaRlBAQTH5JatEh8KXuE6sddf9qAv1Q2282Hg==} + engines: {node: ^20.17.0 || >=22.9.0} turbo-darwin-64@2.4.4: resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} @@ -14400,10 +14565,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - type-fest@4.37.0: resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} engines: {node: '>=16'} @@ -14565,6 +14726,10 @@ packages: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@5.0.0: + resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} + engines: {node: ^20.17.0 || >=22.9.0} + unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} @@ -14572,6 +14737,10 @@ packages: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@6.0.0: + resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} + engines: {node: ^20.17.0 || >=22.9.0} + unique-string@1.0.0: resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} engines: {node: '>=4'} @@ -14787,8 +14956,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true uuid@3.4.0: @@ -14838,6 +15007,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@7.0.0: + resolution: {integrity: sha512-bwVk/OK+Qu108aJcMAEiU4yavHUI7aN20TgZNBj9MR2iU1zPUl1Z1Otr7771ExfYTPTvfN8ZJ1pbr5Iklgt4xg==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -15005,8 +15178,9 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -15258,9 +15432,9 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + which@6.0.0: + resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true why-is-node-running@2.3.0: @@ -15305,6 +15479,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -15319,12 +15497,24 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@6.0.0: + resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + write-file-atomic@7.0.0: + resolution: {integrity: sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg==} + engines: {node: ^20.17.0 || >=22.9.0} + write-json-file@6.0.0: resolution: {integrity: sha512-MNHcU3f9WxnNyR6MxsYSj64Jz0+dwIpisWKWq9gqLj/GwmA9INg3BZ3vt70/HB3GEwrnDQWr4RPrywnhNzmUFA==} engines: {node: '>=18'} - write-package@7.1.0: - resolution: {integrity: sha512-DqUx8GI3r9BFWwU2DPKddL1E7xWfbFED82mLVhGXKlFEPe8IkBftzO7WfNwHtk7oGDHDeuH/o8VMpzzfMwmLUA==} + write-json-file@7.0.0: + resolution: {integrity: sha512-rj8As6LkachKauGxvZkFzCEd6hIRTi9FKtCNKOa4SaH5vPOiACbGcmPUEJXgkhTHwzNsYmcSbD3C9a6whBfyOg==} + engines: {node: '>=20'} + + write-package@7.2.0: + resolution: {integrity: sha512-uMQTubF/vcu+Wd0b5BGtDmiXePd/+44hUWQz2nZPbs92/BnxRo74tqs+hqDo12RLiEd+CXFKUwxvvIZvtt34Jw==} engines: {node: '>=18'} ws@6.2.3: @@ -15426,6 +15616,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -15440,6 +15634,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} @@ -15455,6 +15654,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} @@ -15470,6 +15673,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -15478,14 +15685,21 @@ packages: resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} + zeptomatch@2.1.0: + resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==} + zod-validation-error@3.4.0: resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} @@ -16825,6 +17039,15 @@ snapshots: '@colors/colors@1.5.0': optional: true + '@conventional-changelog/git-client@2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1)': + dependencies: + '@simple-libs/child-process-utils': 1.0.1 + '@simple-libs/stream-utils': 1.1.0 + semver: 7.7.3 + optionalDependencies: + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.1 + '@corex/deepmerge@4.0.43': {} '@csstools/color-helpers@5.1.0': @@ -17682,8 +17905,6 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@hutson/parse-repository-url@5.0.0': {} - '@iconify/types@2.0.0': {} '@iconify/utils@2.3.0': @@ -17863,49 +18084,57 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true - '@inquirer/core@9.2.1': + '@inquirer/ansi@1.0.2': {} + + '@inquirer/core@10.3.2(@types/node@22.13.10)': dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.13.10 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.13.10) cli-width: 4.1.0 - mute-stream: 1.0.0 + mute-stream: 2.0.0 signal-exit: 4.1.0 - strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.13.10 - '@inquirer/expand@2.3.0': + '@inquirer/expand@4.0.23(@types/node@22.13.10)': dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.2(@types/node@22.13.10) + '@inquirer/type': 3.0.10(@types/node@22.13.10) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.13.10 - '@inquirer/figures@1.0.11': {} + '@inquirer/figures@1.0.15': {} - '@inquirer/input@2.3.0': + '@inquirer/input@4.3.1(@types/node@22.13.10)': dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + '@inquirer/core': 10.3.2(@types/node@22.13.10) + '@inquirer/type': 3.0.10(@types/node@22.13.10) + optionalDependencies: + '@types/node': 22.13.10 - '@inquirer/select@2.5.0': + '@inquirer/select@4.4.2(@types/node@22.13.10)': dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.11 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.13.10) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.13.10) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.13.10 - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 + '@inquirer/type@3.0.10(@types/node@22.13.10)': + optionalDependencies: + '@types/node': 22.13.10 + + '@isaacs/balanced-match@4.0.1': {} - '@inquirer/type@2.0.0': + '@isaacs/brace-expansion@5.0.0': dependencies: - mute-stream: 1.0.0 + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: @@ -17916,6 +18145,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@isaacs/string-locale-compare@1.1.0': {} '@istanbuljs/load-nyc-config@1.1.0': @@ -18174,179 +18407,157 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': optional: true - '@lerna-lite/cli@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(@lerna-lite/version@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2))(typescript@5.8.2)': + '@lerna-lite/cli@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@lerna-lite/version@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)': dependencies: - '@lerna-lite/core': 3.9.0(typescript@5.8.2) - '@lerna-lite/init': 3.9.0(typescript@5.8.2) - '@lerna-lite/npmlog': 3.8.0 - dedent: 1.5.3 - dotenv: 16.4.7 + '@lerna-lite/core': 4.9.4(@types/node@22.13.10) + '@lerna-lite/init': 4.9.4(@types/node@22.13.10) + '@lerna-lite/npmlog': 4.9.4 + dedent: 1.7.0 + dotenv: 17.2.3 import-local: 3.2.0 load-json-file: 7.0.1 - yargs: 17.7.2 + yargs: 18.0.0 optionalDependencies: - '@lerna-lite/publish': 3.9.0(typescript@5.8.2) - '@lerna-lite/version': 3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2) + '@lerna-lite/publish': 4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0) + '@lerna-lite/version': 4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0) transitivePeerDependencies: + - '@types/node' - babel-plugin-macros - - bluebird - supports-color - - typescript - '@lerna-lite/core@3.9.0(typescript@5.8.2)': + '@lerna-lite/core@4.9.4(@types/node@22.13.10)': dependencies: - '@inquirer/expand': 2.3.0 - '@inquirer/input': 2.3.0 - '@inquirer/select': 2.5.0 - '@lerna-lite/npmlog': 3.12.1 - '@npmcli/run-script': 8.1.0 - chalk: 5.4.1 - clone-deep: 4.0.1 + '@inquirer/expand': 4.0.23(@types/node@22.13.10) + '@inquirer/input': 4.3.1(@types/node@22.13.10) + '@inquirer/select': 4.4.2(@types/node@22.13.10) + '@lerna-lite/npmlog': 4.9.4 + '@npmcli/run-script': 10.0.3 + ci-info: 4.3.1 config-chain: 1.1.13 - cosmiconfig: 9.0.0(typescript@5.8.2) - dedent: 1.5.3 - execa: 8.0.1 - fs-extra: 11.3.0 + dedent: 1.7.0 + execa: 9.6.1 + fs-extra: 11.3.2 glob-parent: 6.0.2 - globby: 14.1.0 - is-ci: 3.0.1 json5: 2.2.3 + lilconfig: 3.1.3 load-json-file: 7.0.1 - minimatch: 9.0.5 - npm-package-arg: 11.0.3 - p-map: 7.0.3 - p-queue: 8.1.0 - resolve-from: 5.0.0 - semver: 7.7.1 + npm-package-arg: 13.0.2 + p-map: 7.0.4 + p-queue: 9.0.1 + semver: 7.7.3 slash: 5.1.0 - strong-log-transformer: 2.1.0 - write-file-atomic: 5.0.1 - write-json-file: 6.0.0 - write-package: 7.1.0 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + write-file-atomic: 7.0.0 + write-json-file: 7.0.0 + write-package: 7.2.0 + yaml: 2.8.2 + zeptomatch: 2.1.0 transitivePeerDependencies: + - '@types/node' - babel-plugin-macros - - bluebird - supports-color - - typescript - '@lerna-lite/init@3.9.0(typescript@5.8.2)': + '@lerna-lite/init@4.9.4(@types/node@22.13.10)': dependencies: - '@lerna-lite/core': 3.9.0(typescript@5.8.2) - fs-extra: 11.3.0 - p-map: 7.0.3 - write-json-file: 6.0.0 + '@lerna-lite/core': 4.9.4(@types/node@22.13.10) + fs-extra: 11.3.2 + p-map: 7.0.4 + write-json-file: 7.0.0 transitivePeerDependencies: + - '@types/node' - babel-plugin-macros - - bluebird - supports-color - - typescript - '@lerna-lite/npmlog@3.12.1': + '@lerna-lite/npmlog@4.9.4': dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 + aproba: 2.1.0 + fast-string-width: 3.0.2 has-unicode: 2.0.1 set-blocking: 2.0.0 signal-exit: 4.1.0 - string-width: 7.2.0 + tinyrainbow: 3.0.3 wide-align: 1.1.5 - '@lerna-lite/npmlog@3.8.0': + '@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0)': dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - set-blocking: 2.0.0 - signal-exit: 4.1.0 - string-width: 7.2.0 - strip-ansi: 7.1.0 - wide-align: 1.1.5 - - '@lerna-lite/publish@3.9.0(typescript@5.8.2)': - dependencies: - '@lerna-lite/cli': 3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(@lerna-lite/version@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2))(typescript@5.8.2) - '@lerna-lite/core': 3.9.0(typescript@5.8.2) - '@lerna-lite/npmlog': 3.12.1 - '@lerna-lite/version': 3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2) - '@npmcli/arborist': 7.5.4 - '@npmcli/package-json': 5.2.1 + '@lerna-lite/cli': 4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@lerna-lite/version@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10) + '@lerna-lite/core': 4.9.4(@types/node@22.13.10) + '@lerna-lite/npmlog': 4.9.4 + '@lerna-lite/version': 4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0) + '@npmcli/arborist': 9.1.8 + '@npmcli/package-json': 7.0.4 byte-size: 9.0.1 - chalk: 5.4.1 + ci-info: 4.3.1 columnify: 1.6.0 - fs-extra: 11.3.0 - glob: 10.4.5 + fs-extra: 11.3.2 has-unicode: 2.0.1 - libnpmaccess: 8.0.6 - libnpmpublish: 9.0.9 + libnpmaccess: 10.0.3 + libnpmpublish: 11.1.3 normalize-path: 3.0.0 - npm-package-arg: 11.0.3 - npm-packlist: 8.0.2 - npm-registry-fetch: 17.1.0 - p-map: 7.0.3 + npm-package-arg: 13.0.2 + npm-packlist: 10.0.3 + npm-registry-fetch: 19.1.1 + p-map: 7.0.4 p-pipe: 4.0.0 - pacote: 18.0.6 - semver: 7.7.1 - ssri: 10.0.6 - tar: 6.2.1 - temp-dir: 3.0.0 + pacote: 21.0.4 + semver: 7.7.3 + ssri: 13.0.0 + tar: 7.5.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 transitivePeerDependencies: - '@75lb/nature' - '@lerna-lite/exec' - '@lerna-lite/list' - '@lerna-lite/run' - '@lerna-lite/watch' + - '@types/node' - babel-plugin-macros - - bluebird + - conventional-commits-filter - supports-color - - typescript - '@lerna-lite/version@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2)': + '@lerna-lite/version@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0)': dependencies: - '@lerna-lite/cli': 3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(@lerna-lite/version@3.9.0(@lerna-lite/publish@3.9.0(typescript@5.8.2))(typescript@5.8.2))(typescript@5.8.2) - '@lerna-lite/core': 3.9.0(typescript@5.8.2) - '@lerna-lite/npmlog': 3.12.1 + '@conventional-changelog/git-client': 2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) + '@lerna-lite/cli': 4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@lerna-lite/version@4.9.4(@lerna-lite/publish@4.9.4(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10)(conventional-commits-filter@5.0.0))(@types/node@22.13.10) + '@lerna-lite/core': 4.9.4(@types/node@22.13.10) + '@lerna-lite/npmlog': 4.9.4 '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 21.1.1 - chalk: 5.4.1 - conventional-changelog-angular: 7.0.0 - conventional-changelog-core: 7.0.0 - conventional-changelog-writer: 7.0.1 - conventional-commits-parser: 5.0.0 - conventional-recommended-bump: 9.0.0 - dedent: 1.5.3 - fs-extra: 11.3.0 - get-stream: 9.0.1 - git-url-parse: 15.0.0 - graceful-fs: 4.2.11 + '@octokit/rest': 22.0.1 + conventional-changelog: 7.1.1(conventional-commits-filter@5.0.0) + conventional-changelog-angular: 8.1.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.1 + conventional-recommended-bump: 11.2.0 + dedent: 1.7.0 + fs-extra: 11.3.2 + git-url-parse: 16.1.0 is-stream: 4.0.1 load-json-file: 7.0.1 - make-dir: 5.0.0 - minimatch: 9.0.5 new-github-release-url: 2.0.0 - node-fetch: 3.3.2 - npm-package-arg: 11.0.3 - p-limit: 6.2.0 - p-map: 7.0.3 + npm-package-arg: 13.0.2 + p-limit: 7.2.0 + p-map: 7.0.4 p-pipe: 4.0.0 p-reduce: 3.0.0 pify: 6.1.0 - semver: 7.7.1 + semver: 7.7.3 slash: 5.1.0 - temp-dir: 3.0.0 - uuid: 10.0.0 - write-json-file: 6.0.0 + tinyrainbow: 3.0.3 + uuid: 13.0.0 + write-json-file: 7.0.0 + zeptomatch: 2.1.0 transitivePeerDependencies: - '@lerna-lite/exec' - '@lerna-lite/list' - '@lerna-lite/publish' - '@lerna-lite/run' - '@lerna-lite/watch' + - '@types/node' - babel-plugin-macros - - bluebird + - conventional-commits-filter - supports-color - - typescript '@loaderkit/resolve@1.0.3': dependencies: @@ -18646,55 +18857,52 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@npmcli/agent@2.2.2': + '@npmcli/agent@4.0.0': dependencies: agent-base: 7.1.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - lru-cache: 10.4.3 + lru-cache: 11.2.2 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - '@npmcli/arborist@7.5.4': + '@npmcli/arborist@9.1.8': dependencies: '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/fs': 3.1.1 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/map-workspaces': 3.0.6 - '@npmcli/metavuln-calculator': 7.1.1 - '@npmcli/name-from-folder': 2.0.0 - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/query': 3.1.0 - '@npmcli/redact': 2.0.1 - '@npmcli/run-script': 8.1.0 - bin-links: 4.0.4 - cacache: 18.0.4 + '@npmcli/fs': 5.0.0 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/map-workspaces': 5.0.3 + '@npmcli/metavuln-calculator': 9.0.3 + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.4 + '@npmcli/query': 5.0.0 + '@npmcli/redact': 4.0.0 + '@npmcli/run-script': 10.0.3 + bin-links: 6.0.0 + cacache: 20.0.3 common-ancestor-path: 1.0.1 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 + hosted-git-info: 9.0.2 json-stringify-nice: 1.1.4 - lru-cache: 10.4.3 - minimatch: 9.0.5 - nopt: 7.2.1 - npm-install-checks: 6.3.0 - npm-package-arg: 11.0.3 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - pacote: 18.0.6 - parse-conflict-json: 3.0.1 - proc-log: 4.2.0 - proggy: 2.0.0 + lru-cache: 11.2.2 + minimatch: 10.1.1 + nopt: 9.0.0 + npm-install-checks: 8.0.0 + npm-package-arg: 13.0.2 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + pacote: 21.0.4 + parse-conflict-json: 5.0.1 + proc-log: 6.1.0 + proggy: 4.0.0 promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 - read-package-json-fast: 3.0.2 - semver: 7.7.1 - ssri: 10.0.6 + semver: 7.7.3 + ssri: 13.0.0 treeverse: 3.0.0 - walk-up-path: 3.0.1 + walk-up-path: 4.0.0 transitivePeerDependencies: - - bluebird - supports-color '@npmcli/fs@1.1.1': @@ -18706,6 +18914,10 @@ snapshots: dependencies: semver: 7.7.2 + '@npmcli/fs@5.0.0': + dependencies: + semver: 7.7.3 + '@npmcli/git@4.1.0': dependencies: '@npmcli/promise-spawn': 6.0.2 @@ -18719,41 +18931,37 @@ snapshots: transitivePeerDependencies: - bluebird - '@npmcli/git@5.0.8': + '@npmcli/git@7.0.1': dependencies: - '@npmcli/promise-spawn': 7.0.2 - ini: 4.1.3 - lru-cache: 10.4.3 - npm-pick-manifest: 9.1.0 - proc-log: 4.2.0 - promise-inflight: 1.0.1(bluebird@3.7.2) + '@npmcli/promise-spawn': 9.0.1 + ini: 6.0.0 + lru-cache: 11.2.2 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 promise-retry: 2.0.1 - semver: 7.7.2 - which: 4.0.0 - transitivePeerDependencies: - - bluebird + semver: 7.7.3 + which: 6.0.0 - '@npmcli/installed-package-contents@2.1.0': + '@npmcli/installed-package-contents@4.0.0': dependencies: - npm-bundled: 3.0.1 - npm-normalize-package-bin: 3.0.1 + npm-bundled: 5.0.0 + npm-normalize-package-bin: 5.0.0 - '@npmcli/map-workspaces@3.0.6': + '@npmcli/map-workspaces@5.0.3': dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.4.5 - minimatch: 9.0.5 - read-package-json-fast: 3.0.2 + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/package-json': 7.0.4 + glob: 13.0.0 + minimatch: 10.1.1 - '@npmcli/metavuln-calculator@7.1.1': + '@npmcli/metavuln-calculator@9.0.3': dependencies: - cacache: 18.0.4 - json-parse-even-better-errors: 3.0.2 - pacote: 18.0.6 - proc-log: 4.2.0 - semver: 7.7.2 + cacache: 20.0.3 + json-parse-even-better-errors: 5.0.0 + pacote: 21.0.4 + proc-log: 6.1.0 + semver: 7.7.3 transitivePeerDependencies: - - bluebird - supports-color '@npmcli/move-file@1.1.2': @@ -18761,9 +18969,9 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@npmcli/name-from-folder@2.0.0': {} + '@npmcli/name-from-folder@4.0.0': {} - '@npmcli/node-gyp@3.0.0': {} + '@npmcli/node-gyp@5.0.0': {} '@npmcli/package-json@4.0.1': dependencies: @@ -18777,110 +18985,167 @@ snapshots: transitivePeerDependencies: - bluebird - '@npmcli/package-json@5.2.1': + '@npmcli/package-json@7.0.4': dependencies: - '@npmcli/git': 5.0.8 - glob: 10.4.5 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 - normalize-package-data: 6.0.2 - proc-log: 4.2.0 - semver: 7.7.1 - transitivePeerDependencies: - - bluebird + '@npmcli/git': 7.0.1 + glob: 13.0.0 + hosted-git-info: 9.0.2 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 '@npmcli/promise-spawn@6.0.2': dependencies: which: 3.0.1 - '@npmcli/promise-spawn@7.0.2': + '@npmcli/promise-spawn@9.0.1': dependencies: - which: 4.0.0 + which: 6.0.0 - '@npmcli/query@3.1.0': + '@npmcli/query@5.0.0': dependencies: - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 7.1.0 - '@npmcli/redact@2.0.1': {} + '@npmcli/redact@4.0.0': {} - '@npmcli/run-script@8.1.0': + '@npmcli/run-script@10.0.3': dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/promise-spawn': 7.0.2 - node-gyp: 10.3.1 - proc-log: 4.2.0 - which: 4.0.0 + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.4 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.1.0 + proc-log: 6.1.0 + which: 6.0.0 transitivePeerDependencies: - - bluebird - supports-color - '@octokit/auth-token@5.1.2': {} + '@octokit/auth-token@6.0.0': {} - '@octokit/core@6.1.4': + '@octokit/core@7.0.6': dependencies: - '@octokit/auth-token': 5.1.2 - '@octokit/graphql': 8.2.1 - '@octokit/request': 9.2.2 - '@octokit/request-error': 6.1.7 - '@octokit/types': 13.8.0 - before-after-hook: 3.0.2 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.7 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 universal-user-agent: 7.0.2 - '@octokit/endpoint@10.1.3': + '@octokit/endpoint@11.0.2': dependencies: - '@octokit/types': 13.8.0 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.2 - '@octokit/graphql@8.2.1': + '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 9.2.2 - '@octokit/types': 13.8.0 + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.2 - '@octokit/openapi-types@23.0.1': {} + '@octokit/openapi-types@27.0.0': {} '@octokit/plugin-enterprise-rest@6.0.1': {} - '@octokit/plugin-paginate-rest@11.4.3(@octokit/core@6.1.4)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.4 - '@octokit/types': 13.8.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.4)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.4 + '@octokit/core': 7.0.6 - '@octokit/plugin-rest-endpoint-methods@13.3.1(@octokit/core@6.1.4)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.4 - '@octokit/types': 13.8.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/request-error@6.1.7': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/types': 13.8.0 + '@octokit/types': 16.0.0 - '@octokit/request@9.2.2': + '@octokit/request@10.0.7': dependencies: - '@octokit/endpoint': 10.1.3 - '@octokit/request-error': 6.1.7 - '@octokit/types': 13.8.0 - fast-content-type-parse: 2.0.1 + '@octokit/endpoint': 11.0.2 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 universal-user-agent: 7.0.2 - '@octokit/rest@21.1.1': + '@octokit/rest@22.0.1': dependencies: - '@octokit/core': 6.1.4 - '@octokit/plugin-paginate-rest': 11.4.3(@octokit/core@6.1.4) - '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.4) - '@octokit/plugin-rest-endpoint-methods': 13.3.1(@octokit/core@6.1.4) + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/types@13.8.0': + '@octokit/types@16.0.0': dependencies: - '@octokit/openapi-types': 23.0.1 + '@octokit/openapi-types': 27.0.0 '@panva/hkdf@1.2.0': {} + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -19401,7 +19666,7 @@ snapshots: dependencies: react: 18.3.1 - '@remix-run/dev@2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(yaml@2.7.0)': + '@remix-run/dev@2.16.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))(yaml@2.8.2)': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.24.7 @@ -19458,12 +19723,12 @@ snapshots: tar-fs: 2.1.1 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.2) - vite-node: 3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.16.0(typescript@5.8.2) typescript: 5.8.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - bluebird @@ -19741,44 +20006,51 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sigstore/bundle@2.3.2': + '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.3.3 + '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/core@1.1.0': {} + '@sigstore/core@3.0.0': {} - '@sigstore/protobuf-specs@0.3.3': {} + '@sigstore/protobuf-specs@0.5.0': {} - '@sigstore/sign@2.3.2': + '@sigstore/sign@4.0.1': dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 - make-fetch-happen: 13.0.1 - proc-log: 4.2.0 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + make-fetch-happen: 15.0.3 + proc-log: 5.0.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@2.3.4': + '@sigstore/tuf@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.3.3 - tuf-js: 2.2.1 + '@sigstore/protobuf-specs': 0.5.0 + tuf-js: 4.0.0 transitivePeerDependencies: - supports-color - '@sigstore/verify@1.2.1': + '@sigstore/verify@3.0.0': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + + '@simple-libs/child-process-utils@1.0.1': dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 + '@simple-libs/stream-utils': 1.1.0 + '@types/node': 22.13.10 + + '@simple-libs/stream-utils@1.1.0': + dependencies: + '@types/node': 22.13.10 '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@sindresorhus/merge-streams@4.0.0': {} '@sinonjs/commons@3.0.1': @@ -20174,7 +20446,7 @@ snapshots: '@tufjs/canonical-json@2.0.0': {} - '@tufjs/models@2.0.1': + '@tufjs/models@4.0.0': dependencies: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 @@ -20474,10 +20746,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/mute-stream@0.0.4': - dependencies: - '@types/node': 20.17.24 - '@types/negotiator@0.6.3': {} '@types/nlcst@2.0.3': @@ -20501,6 +20769,10 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/parse-path@7.1.0': + dependencies: + parse-path: 7.0.1 + '@types/prop-types@15.7.14': {} '@types/q@1.5.8': {} @@ -20617,8 +20889,6 @@ snapshots: - webpack-cli optional: true - '@types/wrap-ansi@3.0.0': {} - '@types/ws@8.18.0': dependencies: '@types/node': 20.17.24 @@ -21026,32 +21296,32 @@ snapshots: next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) eslint: 9.11.1(jiti@2.4.2) optionalDependencies: typescript: 5.8.2 - vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) - '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@typescript-eslint/utils': 8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) eslint: 9.38.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.2 - vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) '@vitest/expect@2.0.5': dependencies: @@ -21067,21 +21337,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) - '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) '@vitest/pretty-format@2.0.5': dependencies: @@ -21313,14 +21583,9 @@ snapshots: '@zxing/text-encoding@0.9.0': optional: true - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - abab@2.0.6: {} - abbrev@2.0.0: {} + abbrev@4.0.0: {} abort-controller@3.0.0: dependencies: @@ -21368,8 +21633,6 @@ snapshots: acorn@8.15.0: {} - add-stream@1.0.0: {} - address@1.1.2: {} adjust-sourcemap-loader@4.0.0: @@ -21505,7 +21768,7 @@ snapshots: aproba@1.2.0: {} - aproba@2.0.0: {} + aproba@2.1.0: {} arg@4.1.0: {} @@ -21954,7 +22217,7 @@ snapshots: batch@0.6.1: {} - before-after-hook@3.0.2: {} + before-after-hook@4.0.0: {} better-opn@3.0.2: dependencies: @@ -21974,12 +22237,13 @@ snapshots: big.js@5.2.2: {} - bin-links@4.0.4: + bin-links@6.0.0: dependencies: - cmd-shim: 6.0.3 - npm-normalize-package-bin: 3.0.1 - read-cmd-shim: 4.0.0 - write-file-atomic: 5.0.1 + cmd-shim: 8.0.0 + npm-normalize-package-bin: 5.0.0 + proc-log: 6.1.0 + read-cmd-shim: 6.0.0 + write-file-atomic: 7.0.0 binary-extensions@1.13.1: {} @@ -22274,20 +22538,19 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 - cacache@18.0.4: + cacache@20.0.3: dependencies: - '@npmcli/fs': 3.1.1 + '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 - glob: 10.4.5 - lru-cache: 10.4.3 + glob: 13.0.0 + lru-cache: 11.2.2 minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.6 - tar: 6.2.1 - unique-filename: 3.0.0 + p-map: 7.0.4 + ssri: 13.0.0 + unique-filename: 5.0.0 cache-base@1.0.1: dependencies: @@ -22463,6 +22726,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chrome-trace-event@1.0.4: {} ci-info@2.0.0: {} @@ -22471,7 +22736,7 @@ snapshots: ci-info@4.0.0: {} - ci-info@4.2.0: {} + ci-info@4.3.1: {} cipher-base@1.0.4: dependencies: @@ -22570,6 +22835,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.2 + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 @@ -22582,7 +22853,7 @@ snapshots: clsx@2.1.1: {} - cmd-shim@6.0.3: {} + cmd-shim@8.0.0: {} co@4.6.0: {} @@ -22618,8 +22889,6 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 - color-support@1.1.3: {} - color@3.2.1: dependencies: color-convert: 1.9.3 @@ -22738,8 +23007,6 @@ snapshots: console-browserify@1.2.0: {} - console-control-strings@1.1.0: {} - constants-browserify@1.0.0: {} content-disposition@0.5.4: @@ -22748,55 +23015,49 @@ snapshots: content-type@1.0.5: {} - conventional-changelog-angular@7.0.0: + conventional-changelog-angular@8.1.0: dependencies: compare-func: 2.0.0 - conventional-changelog-conventionalcommits@7.0.2: + conventional-changelog-conventionalcommits@8.0.0: dependencies: compare-func: 2.0.0 - conventional-changelog-core@7.0.0: - dependencies: - '@hutson/parse-repository-url': 5.0.0 - add-stream: 1.0.0 - conventional-changelog-writer: 7.0.1 - conventional-commits-parser: 5.0.0 - git-raw-commits: 4.0.0 - git-semver-tags: 7.0.1 - hosted-git-info: 7.0.2 - normalize-package-data: 6.0.2 - read-pkg: 8.1.0 - read-pkg-up: 10.1.0 + conventional-changelog-preset-loader@5.0.0: {} - conventional-changelog-preset-loader@4.1.0: {} - - conventional-changelog-writer@7.0.1: + conventional-changelog-writer@8.2.0: dependencies: - conventional-commits-filter: 4.0.0 + conventional-commits-filter: 5.0.0 handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - meow: 12.1.1 - semver: 7.7.2 - split2: 4.2.0 + meow: 13.2.0 + semver: 7.7.3 - conventional-commits-filter@4.0.0: {} + conventional-changelog@7.1.1(conventional-commits-filter@5.0.0): + dependencies: + '@conventional-changelog/git-client': 2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) + '@types/normalize-package-data': 2.4.4 + conventional-changelog-preset-loader: 5.0.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.1 + fd-package-json: 2.0.0 + meow: 13.2.0 + normalize-package-data: 7.0.1 + transitivePeerDependencies: + - conventional-commits-filter - conventional-commits-parser@5.0.0: + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@6.2.1: dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 + meow: 13.2.0 - conventional-recommended-bump@9.0.0: + conventional-recommended-bump@11.2.0: dependencies: - conventional-changelog-preset-loader: 4.1.0 - conventional-commits-filter: 4.0.0 - conventional-commits-parser: 5.0.0 - git-raw-commits: 4.0.0 - git-semver-tags: 7.0.1 - meow: 12.1.1 + '@conventional-changelog/git-client': 2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) + conventional-changelog-preset-loader: 5.0.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.1 + meow: 13.2.0 convert-source-map@1.9.0: {} @@ -23334,12 +23595,8 @@ snapshots: damerau-levenshtein@1.0.8: {} - dargs@8.1.0: {} - data-uri-to-buffer@3.0.1: {} - data-uri-to-buffer@4.0.1: {} - data-urls@3.0.2: dependencies: abab: 2.0.6 @@ -23416,6 +23673,10 @@ snapshots: optionalDependencies: supports-color: 6.1.0 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decimal.js@10.5.0: {} @@ -23433,6 +23694,8 @@ snapshots: dedent@1.5.3: {} + dedent@1.7.0: {} + deep-eql@5.0.2: {} deep-equal@1.1.2: @@ -23569,6 +23832,8 @@ snapshots: detect-indent@7.0.1: {} + detect-libc@1.0.3: {} + detect-libc@2.0.3: {} detect-libc@2.1.2: @@ -23698,7 +23963,7 @@ snapshots: dotenv@16.4.5: {} - dotenv@16.4.7: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -24141,11 +24406,11 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)): dependencies: '@eslint/js': 9.12.0 '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) confusing-browser-globals: 1.0.11 eslint: 9.11.1(jiti@2.4.2) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) @@ -24172,11 +24437,11 @@ snapshots: - typescript - vitest - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.10))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)): dependencies: '@eslint/js': 9.12.0 '@typescript-eslint/utils': 8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) confusing-browser-globals: 1.0.11 eslint: 9.38.0(jiti@2.4.2) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.38.0(jiti@2.4.2)) @@ -24203,11 +24468,11 @@ snapshots: - typescript - vitest - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)): dependencies: '@eslint/js': 9.12.0 '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) confusing-browser-globals: 1.0.11 eslint: 9.11.1(jiti@2.4.2) eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) @@ -25125,6 +25390,21 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + exit-hook@2.2.1: {} exit@0.1.2: {} @@ -25352,7 +25632,7 @@ snapshots: transitivePeerDependencies: - supports-color - fast-content-type-parse@2.0.1: {} + fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -25380,6 +25660,12 @@ snapshots: fast-loops@1.1.3: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.0.6: {} fastq@1.19.1: @@ -25422,14 +25708,17 @@ snapshots: transitivePeerDependencies: - encoding + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 fetch-retry@4.1.1: {} @@ -25636,10 +25925,6 @@ snapshots: format@0.2.2: {} - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} fraction.js@4.3.7: {} @@ -25671,7 +25956,7 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.0 - fs-extra@11.3.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -25831,25 +26116,14 @@ snapshots: getenv@1.0.0: {} - git-raw-commits@4.0.0: - dependencies: - dargs: 8.1.0 - meow: 12.1.1 - split2: 4.2.0 - - git-semver-tags@7.0.1: - dependencies: - meow: 12.1.1 - semver: 7.7.2 - - git-up@7.0.0: + git-up@8.1.1: dependencies: is-ssh: 1.4.1 - parse-url: 8.1.0 + parse-url: 9.2.0 - git-url-parse@15.0.0: + git-url-parse@16.1.0: dependencies: - git-up: 7.0.0 + git-up: 8.1.1 github-slugger@2.0.0: {} @@ -25886,6 +26160,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@6.0.4: dependencies: inflight: 1.0.6 @@ -25964,15 +26244,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.3 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - globby@6.1.0: dependencies: array-union: 1.0.2 @@ -25993,8 +26264,12 @@ snapshots: graceful-fs@4.2.11: {} + grammex@3.1.12: {} + graphemer@1.4.0: {} + graphmatch@1.1.0: {} + graphql-tag@2.12.6(graphql@15.8.0): dependencies: graphql: 15.8.0 @@ -26328,6 +26603,14 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@8.1.0: + dependencies: + lru-cache: 10.4.3 + + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.2 + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -26513,6 +26796,8 @@ snapshots: human-signals@8.0.0: {} + human-signals@8.0.1: {} + hyperdyperid@1.2.0: optional: true @@ -26542,9 +26827,9 @@ snapshots: dependencies: minimatch: 5.1.6 - ignore-walk@6.0.5: + ignore-walk@8.0.0: dependencies: - minimatch: 9.0.5 + minimatch: 10.1.1 ignore@5.3.2: {} @@ -26609,7 +26894,7 @@ snapshots: ini@1.3.8: {} - ini@4.1.3: {} + ini@6.0.0: {} inline-style-parser@0.1.1: {} @@ -26757,10 +27042,6 @@ snapshots: is-callable@1.2.7: {} - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - is-color-stop@1.1.0: dependencies: css-color-names: 0.0.4 @@ -26878,8 +27159,6 @@ snapshots: dependencies: is-glob: 2.0.1 - is-lambda@1.0.1: {} - is-map@2.0.2: {} is-map@2.0.3: {} @@ -26994,10 +27273,6 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-text-path@2.0.0: - dependencies: - text-extensions: 2.4.0 - is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.19 @@ -27696,6 +27971,8 @@ snapshots: json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@5.0.0: {} + json-schema-deref-sync@0.13.0: dependencies: clone: 2.1.2 @@ -27715,8 +27992,6 @@ snapshots: json-stringify-nice@1.1.4: {} - json-stringify-safe@5.0.1: {} - json3@3.3.3: {} json5@1.0.2: @@ -27820,23 +28095,23 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libnpmaccess@8.0.6: + libnpmaccess@10.0.3: dependencies: - npm-package-arg: 11.0.3 - npm-registry-fetch: 17.1.0 + npm-package-arg: 13.0.2 + npm-registry-fetch: 19.1.1 transitivePeerDependencies: - supports-color - libnpmpublish@9.0.9: + libnpmpublish@11.1.3: dependencies: - ci-info: 4.2.0 - normalize-package-data: 6.0.2 - npm-package-arg: 11.0.3 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 - semver: 7.7.1 - sigstore: 2.3.1 - ssri: 10.0.6 + '@npmcli/package-json': 7.0.4 + ci-info: 4.3.1 + npm-package-arg: 13.0.2 + npm-registry-fetch: 19.1.1 + proc-log: 6.1.0 + semver: 7.7.3 + sigstore: 4.0.0 + ssri: 13.0.0 transitivePeerDependencies: - supports-color @@ -27892,8 +28167,6 @@ snapshots: lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} - load-json-file@7.0.1: {} loader-runner@2.4.0: {} @@ -27995,8 +28268,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: - optional: true + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -28031,22 +28303,19 @@ snapshots: dependencies: semver: 7.7.2 - make-dir@5.0.0: {} - - make-fetch-happen@13.0.1: + make-fetch-happen@15.0.3: dependencies: - '@npmcli/agent': 2.2.2 - cacache: 18.0.4 + '@npmcli/agent': 4.0.0 + cacache: 20.0.3 http-cache-semantics: 4.1.1 - is-lambda: 1.0.1 minipass: 7.1.2 - minipass-fetch: 3.0.5 + minipass-fetch: 5.0.0 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - proc-log: 4.2.0 + negotiator: 1.0.0 + proc-log: 6.1.0 promise-retry: 2.0.1 - ssri: 10.0.6 + ssri: 13.0.0 transitivePeerDependencies: - supports-color @@ -28457,7 +28726,7 @@ snapshots: errno: 0.1.8 readable-stream: 2.3.8 - meow@12.1.1: {} + meow@13.2.0: {} merge-descriptors@1.0.3: {} @@ -29426,6 +29695,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.0.4: dependencies: brace-expansion: 1.1.11 @@ -29456,11 +29729,11 @@ snapshots: dependencies: minipass: 7.1.2 - minipass-fetch@3.0.5: + minipass-fetch@5.0.0: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 - minizlib: 2.1.2 + minizlib: 3.1.0 optionalDependencies: encoding: 0.1.13 @@ -29493,6 +29766,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mississippi@3.0.0: dependencies: concat-stream: 1.6.2 @@ -29577,7 +29854,7 @@ snapshots: thunky: 1.1.0 optional: true - mute-stream@1.0.0: {} + mute-stream@2.0.0: {} mv@2.1.1: dependencies: @@ -29640,7 +29917,7 @@ snapshots: dependencies: type-fest: 2.19.0 - next-auth@4.24.11(next@16.0.8(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next-auth@4.24.11(next@16.0.8(@playwright/test@1.55.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@babel/runtime': 7.24.7 '@panva/hkdf': 1.2.0 @@ -29836,12 +30113,12 @@ snapshots: node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 - node-domexception@1.0.0: {} - node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -29861,28 +30138,22 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@0.10.0: {} node-forge@1.3.1: {} - node-gyp@10.3.1: + node-gyp@12.1.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.2 - glob: 10.4.5 graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1 - nopt: 7.2.1 - proc-log: 4.2.0 - semver: 7.7.2 - tar: 6.2.1 - which: 4.0.0 + make-fetch-happen: 15.0.3 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.7.3 + tar: 7.5.2 + tinyglobby: 0.2.15 + which: 6.0.0 transitivePeerDependencies: - supports-color @@ -29955,9 +30226,9 @@ snapshots: node-stream-zip@1.15.0: {} - nopt@7.2.1: + nopt@9.0.0: dependencies: - abbrev: 2.0.0 + abbrev: 4.0.0 normalize-css-color@1.0.2: {} @@ -29978,7 +30249,13 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + normalize-package-data@7.0.1: + dependencies: + hosted-git-info: 8.1.0 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -29995,18 +30272,24 @@ snapshots: dependencies: npm-normalize-package-bin: 2.0.0 - npm-bundled@3.0.1: + npm-bundled@5.0.0: dependencies: - npm-normalize-package-bin: 3.0.1 + npm-normalize-package-bin: 5.0.0 npm-install-checks@6.3.0: dependencies: semver: 7.7.2 + npm-install-checks@8.0.0: + dependencies: + semver: 7.7.3 + npm-normalize-package-bin@2.0.0: {} npm-normalize-package-bin@3.0.1: {} + npm-normalize-package-bin@5.0.0: {} + npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 @@ -30014,12 +30297,12 @@ snapshots: semver: 7.7.2 validate-npm-package-name: 5.0.1 - npm-package-arg@11.0.3: + npm-package-arg@13.0.2: dependencies: - hosted-git-info: 7.0.2 - proc-log: 4.2.0 - semver: 7.7.1 - validate-npm-package-name: 5.0.1 + hosted-git-info: 9.0.2 + proc-log: 6.1.0 + semver: 7.7.3 + validate-npm-package-name: 7.0.0 npm-package-arg@7.0.0: dependencies: @@ -30028,6 +30311,11 @@ snapshots: semver: 5.7.2 validate-npm-package-name: 3.0.0 + npm-packlist@10.0.3: + dependencies: + ignore-walk: 8.0.0 + proc-log: 6.1.0 + npm-packlist@5.1.3: dependencies: glob: 8.1.0 @@ -30035,9 +30323,12 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 - npm-packlist@8.0.2: + npm-pick-manifest@11.0.3: dependencies: - ignore-walk: 6.0.5 + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.2 + semver: 7.7.3 npm-pick-manifest@8.0.2: dependencies: @@ -30046,23 +30337,16 @@ snapshots: npm-package-arg: 10.1.0 semver: 7.7.2 - npm-pick-manifest@9.1.0: + npm-registry-fetch@19.1.1: dependencies: - npm-install-checks: 6.3.0 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.3 - semver: 7.7.2 - - npm-registry-fetch@17.1.0: - dependencies: - '@npmcli/redact': 2.0.1 + '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 13.0.1 + make-fetch-happen: 15.0.3 minipass: 7.1.2 - minipass-fetch: 3.0.5 - minizlib: 2.1.2 - npm-package-arg: 11.0.3 - proc-log: 4.2.0 + minipass-fetch: 5.0.0 + minizlib: 3.1.0 + npm-package-arg: 13.0.2 + proc-log: 6.1.0 transitivePeerDependencies: - supports-color @@ -30340,6 +30624,10 @@ snapshots: dependencies: yocto-queue: 1.2.0 + p-limit@7.2.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -30362,14 +30650,14 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@7.0.3: {} + p-map@7.0.4: {} p-pipe@4.0.0: {} - p-queue@8.1.0: + p-queue@9.0.1: dependencies: eventemitter3: 5.0.1 - p-timeout: 6.1.4 + p-timeout: 7.0.1 p-reduce@3.0.0: {} @@ -30384,7 +30672,7 @@ snapshots: retry: 0.13.1 optional: true - p-timeout@6.1.4: {} + p-timeout@7.0.1: {} p-try@2.2.0: {} @@ -30396,27 +30684,26 @@ snapshots: dependencies: quansync: 0.2.8 - pacote@18.0.6: + pacote@21.0.4: dependencies: - '@npmcli/git': 5.0.8 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/promise-spawn': 7.0.2 - '@npmcli/run-script': 8.1.0 - cacache: 18.0.4 + '@npmcli/git': 7.0.1 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/package-json': 7.0.4 + '@npmcli/promise-spawn': 9.0.1 + '@npmcli/run-script': 10.0.3 + cacache: 20.0.3 fs-minipass: 3.0.3 minipass: 7.1.2 - npm-package-arg: 11.0.3 - npm-packlist: 8.0.2 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 + npm-package-arg: 13.0.2 + npm-packlist: 10.0.3 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + proc-log: 6.1.0 promise-retry: 2.0.1 - sigstore: 2.3.1 - ssri: 10.0.6 - tar: 6.2.1 + sigstore: 4.0.0 + ssri: 13.0.0 + tar: 7.5.2 transitivePeerDependencies: - - bluebird - supports-color pako@0.2.9: {} @@ -30455,9 +30742,9 @@ snapshots: pbkdf2: 3.1.2 safe-buffer: 5.2.1 - parse-conflict-json@3.0.1: + parse-conflict-json@5.0.1: dependencies: - json-parse-even-better-errors: 3.0.2 + json-parse-even-better-errors: 5.0.0 just-diff: 6.0.2 just-diff-apply: 5.5.0 @@ -30484,14 +30771,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@7.1.1: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - parse-json@8.1.0: dependencies: '@babel/code-frame': 7.27.1 @@ -30523,8 +30802,9 @@ snapshots: parse-srcset@1.0.2: {} - parse-url@8.1.0: + parse-url@9.2.0: dependencies: + '@types/parse-path': 7.1.0 parse-path: 7.0.1 parse5-htmlparser2-tree-adapter@6.0.1: @@ -30589,6 +30869,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + path-to-regexp@0.1.10: {} path-to-regexp@0.1.12: {} @@ -30597,8 +30882,6 @@ snapshots: path-type@4.0.0: {} - path-type@6.0.0: {} - pathe@1.1.2: {} pathe@2.0.3: {} @@ -30635,6 +30918,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -30709,7 +30994,7 @@ snapshots: transitivePeerDependencies: - typescript - po-parser@1.0.2: {} + po-parser@2.0.0: {} points-on-curve@0.2.0: {} @@ -31112,13 +31397,15 @@ snapshots: proc-log@3.0.0: {} - proc-log@4.2.0: {} + proc-log@5.0.0: {} + + proc-log@6.1.0: {} process-nextick-args@2.0.1: {} process@0.11.10: {} - proggy@2.0.0: {} + proggy@4.0.0: {} progress@2.0.3: {} @@ -31506,18 +31793,7 @@ snapshots: dependencies: pify: 2.3.0 - read-cmd-shim@4.0.0: {} - - read-package-json-fast@3.0.2: - dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 - - read-pkg-up@10.1.0: - dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.37.0 + read-cmd-shim@6.0.0: {} read-pkg-up@7.0.1: dependencies: @@ -31532,13 +31808,6 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - read-pkg@8.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 7.1.1 - type-fest: 4.37.0 - read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 @@ -32273,6 +32542,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + send@0.18.0: dependencies: debug: 2.6.9(supports-color@6.1.0) @@ -32516,14 +32787,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@2.3.1: + sigstore@4.0.0: dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 - '@sigstore/sign': 2.3.2 - '@sigstore/tuf': 2.3.4 - '@sigstore/verify': 1.2.1 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/sign': 4.0.1 + '@sigstore/tuf': 4.0.0 + '@sigstore/verify': 3.0.0 transitivePeerDependencies: - supports-color @@ -32650,6 +32921,10 @@ snapshots: dependencies: is-plain-obj: 4.1.0 + sort-keys@6.0.0: + dependencies: + is-plain-obj: 4.1.0 + source-list-map@2.0.1: {} source-map-js@1.2.1: {} @@ -32727,8 +33002,6 @@ snapshots: dependencies: extend-shallow: 3.0.2 - split2@4.2.0: {} - split@1.0.1: dependencies: through: 2.3.8 @@ -32741,6 +33014,10 @@ snapshots: dependencies: minipass: 7.1.2 + ssri@13.0.0: + dependencies: + minipass: 7.1.2 + ssri@6.0.2: dependencies: figgy-pudding: 3.5.2 @@ -32986,12 +33263,6 @@ snapshots: strip-json-comments@3.1.1: {} - strong-log-transformer@2.1.0: - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - structured-headers@0.4.1: {} style-loader@1.2.1(webpack@4.43.0): @@ -33167,12 +33438,18 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + temp-dir@1.0.0: {} temp-dir@2.0.0: {} - temp-dir@3.0.0: {} - temp@0.8.3: dependencies: os-tmpdir: 1.0.2 @@ -33290,8 +33567,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-extensions@2.4.0: {} - text-table@0.2.0: {} thenify-all@1.6.0: @@ -33335,12 +33610,19 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinypool@1.0.2: {} tinyrainbow@1.2.0: {} tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@3.0.2: {} title@4.0.1: @@ -33479,11 +33761,11 @@ snapshots: tty-browserify@0.0.1: {} - tuf-js@2.2.1: + tuf-js@4.0.0: dependencies: - '@tufjs/models': 2.0.1 - debug: 4.4.0(supports-color@6.1.0) - make-fetch-happen: 13.0.1 + '@tufjs/models': 4.0.0 + debug: 4.4.3 + make-fetch-happen: 15.0.3 transitivePeerDependencies: - supports-color @@ -33548,8 +33830,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@3.13.1: {} - type-fest@4.37.0: {} type-is@1.6.18: @@ -33762,6 +34042,10 @@ snapshots: dependencies: unique-slug: 4.0.0 + unique-filename@5.0.0: + dependencies: + unique-slug: 6.0.0 + unique-slug@2.0.2: dependencies: imurmurhash: 0.1.4 @@ -33770,6 +34054,10 @@ snapshots: dependencies: imurmurhash: 0.1.4 + unique-slug@6.0.0: + dependencies: + imurmurhash: 0.1.4 + unique-string@1.0.0: dependencies: crypto-random-string: 1.0.0 @@ -34017,7 +34305,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@10.0.0: {} + uuid@13.0.0: {} uuid@3.4.0: {} @@ -34057,6 +34345,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validate-npm-package-name@7.0.0: {} + vary@1.1.2: {} vendors@1.0.4: {} @@ -34108,13 +34398,13 @@ snapshots: - supports-color - terser - vite-node@3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.0-beta.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -34129,13 +34419,13 @@ snapshots: - tsx - yaml - vite-node@3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -34150,13 +34440,13 @@ snapshots: - tsx - yaml - vite-node@3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@6.1.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -34182,7 +34472,7 @@ snapshots: lightningcss: 1.29.2 terser: 5.39.0 - vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -34193,9 +34483,9 @@ snapshots: jiti: 2.4.2 lightningcss: 1.29.2 terser: 5.39.0 - yaml: 2.7.0 + yaml: 2.8.2 - vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -34206,12 +34496,12 @@ snapshots: jiti: 2.4.2 lightningcss: 1.29.2 terser: 5.39.0 - yaml: 2.7.0 + yaml: 2.8.2 - vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: '@vitest/expect': 3.0.8 - '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.0.8 '@vitest/runner': 3.0.8 '@vitest/snapshot': 3.0.8 @@ -34227,8 +34517,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) + vite-node: 3.0.8(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 @@ -34249,10 +34539,10 @@ snapshots: - tsx - yaml - vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2): dependencies: '@vitest/expect': 3.0.8 - '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.0.8 '@vitest/runner': 3.0.8 '@vitest/snapshot': 3.0.8 @@ -34268,8 +34558,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) + vite-node: 3.0.8(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 @@ -34320,7 +34610,7 @@ snapshots: xml-name-validator: 5.0.0 optional: true - walk-up-path@3.0.1: {} + walk-up-path@4.0.0: {} walker@1.0.8: dependencies: @@ -34805,7 +35095,7 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: + which@6.0.0: dependencies: isexe: 3.1.1 @@ -34858,6 +35148,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@2.4.3: @@ -34876,6 +35172,16 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + write-file-atomic@6.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + write-file-atomic@7.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + write-json-file@6.0.0: dependencies: detect-indent: 7.0.1 @@ -34883,7 +35189,14 @@ snapshots: sort-keys: 5.1.0 write-file-atomic: 5.0.1 - write-package@7.1.0: + write-json-file@7.0.0: + dependencies: + detect-indent: 7.0.1 + is-plain-obj: 4.1.0 + sort-keys: 6.0.0 + write-file-atomic: 6.0.0 + + write-package@7.2.0: dependencies: deepmerge-ts: 7.1.5 read-pkg: 9.0.1 @@ -34937,12 +35250,16 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.4.5: {} yaml@2.7.0: {} + yaml@2.8.2: {} + yargs-parser@13.1.2: dependencies: camelcase: 5.3.1 @@ -34957,6 +35274,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@13.3.2: dependencies: cliui: 5.0.0 @@ -35004,14 +35323,30 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} yocto-queue@1.2.0: {} - yoctocolors-cjs@2.1.2: {} + yocto-queue@1.2.2: {} + + yoctocolors-cjs@2.1.3: {} yoctocolors@2.1.1: {} + zeptomatch@2.1.0: + dependencies: + grammex: 3.1.12 + graphmatch: 1.1.0 + zod-validation-error@3.4.0(zod@3.24.2): dependencies: zod: 3.24.2