From e96c535a38c237b7d7006a6e16feef70e2af8605 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:20:08 +0200 Subject: [PATCH 01/19] =?UTF-8?q?chore:=20bedre=20tester=20for=20=C3=A5=20?= =?UTF-8?q?utelukke=20feil=20ved=20oppgradering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/cli.test.ts | 170 ++++ .../build-nybolig-usage.test.ts.snap | 866 ++++++++++++++++++ test/commands/build-nybolig-usage.test.ts | 185 ++++ test/commands/watch.test.ts | 115 +++ test/deps/chokidar-api.test.ts | 81 ++ test/fixtures/nybolig-usage.ts | 150 +++ 6 files changed, 1567 insertions(+) create mode 100644 test/cli.test.ts create mode 100644 test/commands/__snapshots__/build-nybolig-usage.test.ts.snap create mode 100644 test/commands/build-nybolig-usage.test.ts create mode 100644 test/commands/watch.test.ts create mode 100644 test/deps/chokidar-api.test.ts create mode 100644 test/fixtures/nybolig-usage.ts diff --git a/test/cli.test.ts b/test/cli.test.ts new file mode 100644 index 0000000..f4aec01 --- /dev/null +++ b/test/cli.test.ts @@ -0,0 +1,170 @@ +import { describe, it, expect, afterEach, vi } from 'vitest'; +import { vol } from 'memfs'; +import type { Command } from 'commander'; +import { nyboligBuildFlags, nyboligMessages } from './fixtures/nybolig-usage'; + +const srcDir = '/app/src/intl/messages'; +const outDir = '/app/src/intl/compiled'; + +/** + * Commander keeps parsed option values on the Command instance, and the commands are + * module level singletons, so every test gets a freshly imported instance. Output is + * silenced and exits are turned into exceptions so parse errors can be asserted. + */ +async function freshCommand(name: 'build' | 'watch' | 'validate' | 'fix'): Promise { + vi.resetModules(); + const command: Command = await { + build: async () => (await import('../src/commands/build')).buildCommand, + watch: async () => (await import('../src/commands/watch')).watchCommand, + validate: async () => (await import('../src/commands/validate')).validateCommand, + fix: async () => (await import('../src/commands/fix')).fixCommand, + }[name](); + + return command.exitOverride().configureOutput({ writeOut: () => {}, writeErr: () => {} }); +} + +async function runCli(name: 'build' | 'watch' | 'validate' | 'fix', args: string[]): Promise { + const command = await freshCommand(name); + await command.parseAsync(args, { from: 'user' }); +} + +function readOut(file: string): string { + return vol.readFileSync(`${outDir}/${file}`, 'utf-8').toString(); +} + +describe('cli argument parsing', () => { + afterEach(() => { + vol.reset(); + vi.restoreAllMocks(); + }); + + describe('build', () => { + it('should accept the exact invocation used by nybolig-nettsider', async () => { + vol.fromNestedJSON(nyboligMessages, srcDir); + + await runCli('build', [srcDir, outDir, ...nyboligBuildFlags]); + + expect(Object.keys(vol.toJSON(outDir)).sort()).toEqual([ + `${outDir}/bundle_nb.compiled.json`, + `${outDir}/bundle_nb.json`, + `${outDir}/bundle_sv.compiled.json`, + `${outDir}/bundle_sv.json`, + `${outDir}/lut.ts`, + ]); + }); + + it('should default to the formatjs format', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk' }, srcDir); + + await runCli('build', [srcDir, outDir]); + + expect(JSON.parse(readOut('bundle_nb.json'))).toEqual({ close: { defaultMessage: 'Lukk' } }); + }); + + it('should default --typescript to false, emitting a javascript lut', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk' }, srcDir); + + await runCli('build', [srcDir, outDir, '--lut']); + + expect(Object.keys(vol.toJSON(outDir))).toContain(`${outDir}/lut.js`); + expect(readOut('lut.js')).toContain('export function createIntlLUT(intl) {'); + }); + + it('should map -t to the timeZone option and inject it into date skeletons', async () => { + vol.fromNestedJSON({ 'date_nb.txt': '{d, date, ::yyyyMMdd}' }, srcDir); + + await runCli('build', [srcDir, outDir, '--ast', '-t', 'Europe/Oslo']); + + const compiled = JSON.parse(readOut('bundle_nb.compiled.json')); + expect(compiled.date[0].style.parsedOptions.timeZone).toBe('Europe/Oslo'); + }); + + it('should accept every documented format', async () => { + for (const format of ['json', 'jsonlut', 'script', 'formatjs']) { + vol.reset(); + vol.fromNestedJSON({ group: { 'close_nb.txt': 'Lukk' } }, srcDir); + + await runCli('build', [srcDir, outDir, '-f', format]); + + const written = Object.keys(vol.toJSON(outDir)); + const expectedExtension = format === 'script' ? 'js' : 'json'; + expect(written, format).toEqual([`${outDir}/bundle_nb.${expectedExtension}`]); + } + }); + + it('should nest keys for the jsonlut format and keep them flat for json', async () => { + vol.fromNestedJSON({ group: { 'close_nb.txt': 'Lukk' } }, srcDir); + await runCli('build', [srcDir, outDir, '-f', 'jsonlut']); + expect(JSON.parse(readOut('bundle_nb.json'))).toEqual({ group: { close: 'Lukk' } }); + + vol.reset(); + vol.fromNestedJSON({ group: { 'close_nb.txt': 'Lukk' } }, srcDir); + await runCli('build', [srcDir, outDir, '-f', 'json']); + expect(JSON.parse(readOut('bundle_nb.json'))).toEqual({ 'group.close': 'Lukk' }); + }); + + it('should reject an unknown format', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk' }, srcDir); + + await expect(runCli('build', [srcDir, outDir, '-f', 'nope'])).rejects.toThrowError( + /Allowed choices are script, json, jsonlut, formatjs/, + ); + }); + + it('should require both srcDir and outDir', async () => { + await expect(runCli('build', [srcDir])).rejects.toThrowError(/missing required argument/); + }); + + it('should fail on --strict when the locales have different keys', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk', 'open_sv.txt': 'Öppna' }, srcDir); + + await expect(runCli('build', [srcDir, outDir, '--strict'])).rejects.toThrowError(); + }); + }); + + describe('watch', () => { + it('should expose the same options as build, so intl:watch can mirror intl', async () => { + const build = await freshCommand('build'); + const watch = await freshCommand('watch'); + + const flags = (command: Command) => + command.options + .map((option) => option.flags) + .sort() + .join('\n'); + + expect(flags(watch)).toEqual(flags(build)); + }); + }); + + describe('validate', () => { + it('should pass when every locale has the same keys', async () => { + vol.fromNestedJSON(nyboligMessages, srcDir); + + await expect(runCli('validate', [srcDir])).resolves.toBeUndefined(); + }); + + it('should fail when a key is missing in one locale', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk', 'close_sv.txt': 'Stäng', 'open_nb.txt': 'Åpne' }, srcDir); + + await expect(runCli('validate', [srcDir])).rejects.toThrowError(); + }); + + it('should require srcDir', async () => { + await expect(runCli('validate', [])).rejects.toThrowError(/missing required argument/); + }); + }); + + describe('fix', () => { + it('should create the missing files as TODO placeholders', async () => { + vol.fromNestedJSON( + { 'close_nb.txt': 'Lukk', 'close_sv.txt': 'Stäng', group: { 'open_nb.txt': 'Åpne' } }, + srcDir, + ); + + await runCli('fix', [srcDir]); + + expect(vol.readFileSync(`${srcDir}/group/open_sv.txt`, 'utf-8').toString()).toBe('[sv] TODO'); + }); + }); +}); diff --git a/test/commands/__snapshots__/build-nybolig-usage.test.ts.snap b/test/commands/__snapshots__/build-nybolig-usage.test.ts.snap new file mode 100644 index 0000000..a4e5991 --- /dev/null +++ b/test/commands/__snapshots__/build-nybolig-usage.test.ts.snap @@ -0,0 +1,866 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`build command, as used by nybolig-nettsider > should match the snapshot for the whole nybolig-shaped output 1`] = ` +{ + "/app/src/intl/compiled/bundle_nb.compiled.json": "{ + "anchors.tabs.default": [ + { + "type": 0, + "value": "Oversikt" + } + ], + "bkmLabel": [ + { + "options": { + "PARTOWNERSHIP": { + "value": [ + { + "type": 0, + "value": "Deleie" + } + ] + }, + "PROPERTY_SWAP": { + "value": [ + { + "type": 0, + "value": "Boligbytte" + } + ] + }, + "START_LIVING": { + "value": [ + { + "type": 0, + "value": "Bostart" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "bkmModel" + } + ] + } + }, + "type": 5, + "value": "bkmModel" + } + ], + "close": [ + { + "type": 0, + "value": "Lukk" + } + ], + "commonProjectAndProperty.informationmeeting.formIntro": [ + { + "children": [ + { + "type": 0, + "value": "\\n Om informasjonsmøtet.\\n" + } + ], + "type": 8, + "value": "p" + }, + { + "type": 0, + "value": "\\n\\n" + }, + { + "children": [ + { + "type": 0, + "value": "\\n Velkommen.\\n" + } + ], + "type": 8, + "value": "p" + }, + { + "type": 0, + "value": "\\n" + } + ], + "plannedProjectsMatched": [ + { + "options": { + "other": { + "value": [ + { + "type": 0, + "value": "Planlagte prosjekter" + } + ] + }, + "true": { + "value": [ + { + "type": 0, + "value": "Planlagte prosjekter i området" + } + ] + } + }, + "type": 5, + "value": "region_selected" + } + ], + "propertyProject.banners.comingForSaleBodyText": [ + { + "children": [ + { + "type": 0, + "value": "\\n " + }, + { + "type": 1, + "value": "propertyProjectName" + }, + { + "type": 0, + "value": " kommer snart for salg.\\n" + } + ], + "type": 8, + "value": "p" + }, + { + "type": 0, + "value": "\\n" + } + ], + "propertyProject.newLeadForm.part1.heading": [ + { + "type": 0, + "value": "Om deg" + } + ], + "propertyProject.newLeadForm.receipt.heading": [ + { + "type": 0, + "value": "Takk" + } + ], + "salesassignment-table.parking.assigned-spaces": [ + { + "type": 0, + "value": "Tildelte plasser" + } + ], + "salesassignment-table.parking.electric-charging-for-sale": [ + { + "type": 0, + "value": "Ladeplass til salgs" + } + ], + "salesassignmentTable.heading.unitTBA": [ + { + "type": 0, + "value": "BRA" + } + ], + "searchMatchHeading": [ + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "Ingen treff" + } + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "Treff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommende prosjekt" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "Treff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommende prosjekter" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_planned_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "\\n Fant " + }, + { + "offset": 0, + "options": { + "=1": { + "value": [ + { + "type": 7 + }, + { + "type": 0, + "value": " prosjekt" + } + ] + }, + "other": { + "value": [ + { + "type": 7 + }, + { + "type": 0, + "value": " prosjekter" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_project" + }, + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "og " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommende prosjekt" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "og " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommende prosjekter" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_planned_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "Treff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " ledig bolig" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "Treff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " ledige boliger" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_properties" + } + ], + "traffic-split.mobileCta": [ + { + "type": 0, + "value": "Se boliger" + } + ] +}", + "/app/src/intl/compiled/bundle_nb.json": "{ + "anchors.tabs.default": { + "defaultMessage": "Oversikt" + }, + "bkmLabel": { + "defaultMessage": "{bkmModel, select,\\n PARTOWNERSHIP {Deleie}\\n START_LIVING {Bostart}\\n PROPERTY_SWAP {Boligbytte}\\n other {{bkmModel}}\\n}" + }, + "close": { + "defaultMessage": "Lukk" + }, + "commonProjectAndProperty.informationmeeting.formIntro": { + "defaultMessage": "

\\n Om informasjonsmøtet.\\n

\\n\\n

\\n Velkommen.\\n

\\n" + }, + "plannedProjectsMatched": { + "defaultMessage": "{ region_selected, select,\\n true {Planlagte prosjekter i området}\\n other {Planlagte prosjekter}\\n}" + }, + "propertyProject.banners.comingForSaleBodyText": { + "defaultMessage": "

\\n { propertyProjectName} kommer snart for salg.\\n

\\n" + }, + "propertyProject.newLeadForm.part1.heading": { + "defaultMessage": "Om deg" + }, + "propertyProject.newLeadForm.receipt.heading": { + "defaultMessage": "Takk" + }, + "salesassignment-table.parking.assigned-spaces": { + "defaultMessage": "Tildelte plasser" + }, + "salesassignment-table.parking.electric-charging-for-sale": { + "defaultMessage": "Ladeplass til salgs" + }, + "salesassignmentTable.heading.unitTBA": { + "defaultMessage": "BRA" + }, + "searchMatchHeading": { + "defaultMessage": "{count_properties, plural,\\n =0 {\\n {count_project, plural,\\n =0 {\\n {count_planned_project, plural,\\n =0 {Ingen treff}\\n one {Treff på # kommende prosjekt}\\n other {Treff på # kommende prosjekter}\\n }\\n }\\n other {\\n Fant {count_project,plural,=1{# prosjekt} other {# prosjekter}}\\n {count_planned_project, plural,\\n =0 {}\\n one {og # kommende prosjekt}\\n other {og # kommende prosjekter}\\n }\\n }\\n }\\n }\\n one {Treff på # ledig bolig}\\n other {Treff på # ledige boliger}\\n}" + }, + "traffic-split.mobileCta": { + "defaultMessage": "Se boliger" + } +}", + "/app/src/intl/compiled/bundle_sv.compiled.json": "{ + "anchors.tabs.default": [ + { + "type": 0, + "value": "Översikt" + } + ], + "bkmLabel": [ + { + "options": { + "PARTOWNERSHIP": { + "value": [ + { + "type": 0, + "value": "Delagt" + } + ] + }, + "PROPERTY_SWAP": { + "value": [ + { + "type": 0, + "value": "Bostadsbyte" + } + ] + }, + "START_LIVING": { + "value": [ + { + "type": 0, + "value": "Bostart" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "bkmModel" + } + ] + } + }, + "type": 5, + "value": "bkmModel" + } + ], + "close": [ + { + "type": 0, + "value": "Stäng" + } + ], + "commonProjectAndProperty.informationmeeting.formIntro": [ + { + "children": [ + { + "type": 0, + "value": "[TODO]" + } + ], + "type": 8, + "value": "p" + } + ], + "plannedProjectsMatched": [ + { + "options": { + "other": { + "value": [ + { + "type": 0, + "value": "Planerade projekt" + } + ] + }, + "true": { + "value": [ + { + "type": 0, + "value": "Planerade projekt i området" + } + ] + } + }, + "type": 5, + "value": "region_selected" + } + ], + "propertyProject.banners.comingForSaleBodyText": [ + { + "children": [ + { + "type": 0, + "value": "\\n " + }, + { + "type": 1, + "value": "propertyProjectName" + }, + { + "type": 0, + "value": " kommer snart till försäljning.\\n" + } + ], + "type": 8, + "value": "p" + }, + { + "type": 0, + "value": "\\n" + } + ], + "propertyProject.newLeadForm.part1.heading": [ + { + "type": 0, + "value": "Om dig" + } + ], + "propertyProject.newLeadForm.receipt.heading": [ + { + "type": 0, + "value": "Tack" + } + ], + "salesassignment-table.parking.assigned-spaces": [ + { + "type": 0, + "value": "Tilldelade platser" + } + ], + "salesassignment-table.parking.electric-charging-for-sale": [ + { + "type": 0, + "value": "Laddplats till försäljning" + } + ], + "salesassignmentTable.heading.unitTBA": [ + { + "type": 0, + "value": "BOA" + } + ], + "searchMatchHeading": [ + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + { + "type": 0, + "value": "Inga träffar" + } + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "Träff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommande projekt" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "Träff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommande projekt" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_planned_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "\\n Träff på " + }, + { + "offset": 0, + "options": { + "=1": { + "value": [ + { + "type": 7 + }, + { + "type": 0, + "value": " projekt" + } + ] + }, + "other": { + "value": [ + { + "type": 7 + }, + { + "type": 0, + "value": " projekt" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_project" + }, + { + "type": 0, + "value": "\\n " + }, + { + "offset": 0, + "options": { + "=0": { + "value": [ + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "och " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommande projekt" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "och " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " kommande projekt" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_planned_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_project" + }, + { + "type": 0, + "value": "\\n " + } + ] + }, + "one": { + "value": [ + { + "type": 0, + "value": "Träff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " ledig bostad" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "Träff på " + }, + { + "type": 7 + }, + { + "type": 0, + "value": " lediga bostäder" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count_properties" + } + ], + "traffic-split.mobileCta": [ + { + "type": 0, + "value": "Se bostäder" + } + ] +}", + "/app/src/intl/compiled/bundle_sv.json": "{ + "anchors.tabs.default": { + "defaultMessage": "Översikt" + }, + "bkmLabel": { + "defaultMessage": "{bkmModel, select,\\n PARTOWNERSHIP {Delagt}\\n START_LIVING {Bostart}\\n PROPERTY_SWAP {Bostadsbyte}\\n other {{bkmModel}}\\n}" + }, + "close": { + "defaultMessage": "Stäng" + }, + "commonProjectAndProperty.informationmeeting.formIntro": { + "defaultMessage": "

[TODO]

" + }, + "plannedProjectsMatched": { + "defaultMessage": "{ region_selected, select,\\n true {Planerade projekt i området}\\n other {Planerade projekt}\\n}" + }, + "propertyProject.banners.comingForSaleBodyText": { + "defaultMessage": "

\\n { propertyProjectName} kommer snart till försäljning.\\n

\\n" + }, + "propertyProject.newLeadForm.part1.heading": { + "defaultMessage": "Om dig" + }, + "propertyProject.newLeadForm.receipt.heading": { + "defaultMessage": "Tack" + }, + "salesassignment-table.parking.assigned-spaces": { + "defaultMessage": "Tilldelade platser" + }, + "salesassignment-table.parking.electric-charging-for-sale": { + "defaultMessage": "Laddplats till försäljning" + }, + "salesassignmentTable.heading.unitTBA": { + "defaultMessage": "BOA" + }, + "searchMatchHeading": { + "defaultMessage": "{count_properties, plural,\\n =0 {\\n {count_project, plural,\\n =0 {\\n {count_planned_project, plural,\\n =0 {Inga träffar}\\n one {Träff på # kommande projekt}\\n other {Träff på # kommande projekt}\\n }\\n }\\n other {\\n Träff på {count_project,plural,=1{# projekt} other {# projekt}}\\n {count_planned_project, plural,\\n =0 {}\\n one {och # kommande projekt}\\n other {och # kommande projekt}\\n }\\n }\\n }\\n }\\n one {Träff på # ledig bostad}\\n other {Träff på # lediga bostäder}\\n}" + }, + "traffic-split.mobileCta": { + "defaultMessage": "Se bostäder" + } +}", + "/app/src/intl/compiled/lut.ts": "import React from "react"; +import {IntlShape} from "@formatjs/intl"; +// @ts-ignore +import {FormatXMLElementFn} from "intl-messageformat"; + +export function createIntlLUT(intl: IntlShape) { + return { + "anchors": { + "tabs": { + "default": () => intl.formatMessage({ id: 'anchors.tabs.default' }, {}), + }, + }, + "bkmLabel": (args: { bkmModel: 'PARTOWNERSHIP' | 'START_LIVING' | 'PROPERTY_SWAP' | 'other' | string }) => intl.formatMessage({ id: 'bkmLabel' }, {bkmModel: args.bkmModel}), + "close": () => intl.formatMessage({ id: 'close' }, {}), + "commonProjectAndProperty": { + "informationmeeting": { + "formIntro": (args: { p: FormatXMLElementFn }) => intl.formatMessage({ id: 'commonProjectAndProperty.informationmeeting.formIntro' }, {p: args.p}), + }, + }, + "plannedProjectsMatched": (args: { region_selected: 'true' | 'other' | string }) => intl.formatMessage({ id: 'plannedProjectsMatched' }, {region_selected: args.region_selected}), + "propertyProject": { + "banners": { + "comingForSaleBodyText": (args: { p: FormatXMLElementFn;propertyProjectName: string }) => intl.formatMessage({ id: 'propertyProject.banners.comingForSaleBodyText' }, {p: args.p, propertyProjectName: args.propertyProjectName}), + }, + "newLeadForm": { + "part1": { + "heading": () => intl.formatMessage({ id: 'propertyProject.newLeadForm.part1.heading' }, {}), + }, + "receipt": { + "heading": () => intl.formatMessage({ id: 'propertyProject.newLeadForm.receipt.heading' }, {}), + }, + }, + }, + "salesassignmentTable": { + "parking": { + "assignedSpaces": () => intl.formatMessage({ id: 'salesassignment-table.parking.assigned-spaces' }, {}), + "electricChargingForSale": () => intl.formatMessage({ id: 'salesassignment-table.parking.electric-charging-for-sale' }, {}), + }, + "heading": { + "unitTBA": () => intl.formatMessage({ id: 'salesassignmentTable.heading.unitTBA' }, {}), + }, + }, + "searchMatchHeading": (args: { count_properties: number;count_project: number;count_planned_project: number }) => intl.formatMessage({ id: 'searchMatchHeading' }, {count_properties: args.count_properties, count_project: args.count_project, count_planned_project: args.count_planned_project}), + "trafficSplit": { + "mobileCta": () => intl.formatMessage({ id: 'traffic-split.mobileCta' }, {}), + }, + } +}", +} +`; diff --git a/test/commands/build-nybolig-usage.test.ts b/test/commands/build-nybolig-usage.test.ts new file mode 100644 index 0000000..2aec19e --- /dev/null +++ b/test/commands/build-nybolig-usage.test.ts @@ -0,0 +1,185 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { vol } from 'memfs'; +import { runBuildCommand } from '../../src/commands/build'; +import { nyboligBuildOptions, nyboligMessages } from '../fixtures/nybolig-usage'; + +const srcDir = '/app/src/intl/messages'; +const outDir = '/app/src/intl/compiled'; + +function build() { + vol.fromNestedJSON(nyboligMessages, srcDir); + return runBuildCommand(srcDir, outDir, nyboligBuildOptions); +} + +function readOut(file: string): string { + return vol.readFileSync(`${outDir}/${file}`, 'utf-8').toString(); +} + +function readBundle(locale: string): Record { + return JSON.parse(readOut(`bundle_${locale}.json`)); +} + +describe('build command, as used by nybolig-nettsider', () => { + afterEach(() => { + vol.reset(); + }); + + it('should emit the exact set of files apps/frontend imports', async () => { + await build(); + + expect(Object.keys(vol.toJSON(outDir)).sort()).toEqual( + [ + `${outDir}/bundle_nb.compiled.json`, + `${outDir}/bundle_nb.json`, + `${outDir}/bundle_sv.compiled.json`, + `${outDir}/bundle_sv.json`, + `${outDir}/lut.ts`, + ].sort(), + ); + }); + + it('should give both locales the same ids', async () => { + await build(); + + expect(Object.keys(readBundle('nb')).sort()).toEqual(Object.keys(readBundle('sv')).sort()); + }); + + it('should build ids from folder path and file name, keeping kebab-case', async () => { + await build(); + + expect(Object.keys(readBundle('nb')).sort()).toEqual([ + 'anchors.tabs.default', + 'bkmLabel', + 'close', + 'commonProjectAndProperty.informationmeeting.formIntro', + 'plannedProjectsMatched', + 'propertyProject.banners.comingForSaleBodyText', + 'propertyProject.newLeadForm.part1.heading', + 'propertyProject.newLeadForm.receipt.heading', + 'salesassignment-table.parking.assigned-spaces', + 'salesassignment-table.parking.electric-charging-for-sale', + 'salesassignmentTable.heading.unitTBA', + 'searchMatchHeading', + 'traffic-split.mobileCta', + ]); + }); + + it('should ignore files without a locale suffix', async () => { + await build(); + + const ids = Object.keys(readBundle('nb')); + expect(ids.some((id) => id.toLowerCase().includes('readme'))).toBe(false); + }); + + it('should include .html messages alongside .txt messages', async () => { + await build(); + + expect(readBundle('nb')['commonProjectAndProperty.informationmeeting.formIntro'].defaultMessage).toContain( + '

', + ); + }); + + it('should wrap every message in defaultMessage for the formatjs format', async () => { + await build(); + + expect(readBundle('nb').close).toEqual({ defaultMessage: 'Lukk' }); + }); + + describe('lut.ts', () => { + it('should camelCase kebab-cased folders and files into LUT keys', async () => { + await build(); + const lut = readOut('lut.ts'); + + expect(lut).toContain('"assignedSpaces": () => intl.formatMessage'); + expect(lut).toContain('"electricChargingForSale": () => intl.formatMessage'); + expect(lut).toContain('"trafficSplit": {'); + expect(lut).toContain("id: 'salesassignment-table.parking.assigned-spaces'"); + }); + + it('should merge folders that camelCase to the same LUT key', async () => { + await build(); + const lut = readOut('lut.ts'); + + // 'salesassignment-table' and 'salesassignmentTable' both become + // 'salesassignmentTable', so parking and heading must end up as siblings. + expect(lut.match(/"salesassignmentTable": \{/g)).toHaveLength(1); + const block = lut.slice(lut.indexOf('"salesassignmentTable": {')); + expect(block).toContain('"parking": {'); + expect(block).toContain('"heading": {'); + }); + + it('should type html tags as FormatXMLElementFn', async () => { + await build(); + + expect(readOut('lut.ts')).toContain( + '"formIntro": (args: { p: FormatXMLElementFn }) => intl.formatMessage', + ); + }); + + it('should type select options as a union including other and string', async () => { + await build(); + + expect(readOut('lut.ts')).toContain( + "\"bkmLabel\": (args: { bkmModel: 'PARTOWNERSHIP' | 'START_LIVING' | 'PROPERTY_SWAP' | 'other' | string }) =>", + ); + }); + + it('should not duplicate an argument that is reused inside its own select', async () => { + await build(); + const lut = readOut('lut.ts'); + const line = lut.split('\n').find((it) => it.includes('"bkmLabel"')) ?? ''; + + expect(line.match(/bkmModel:/g)).toHaveLength(2); // once in args type, once in formatMessage values + }); + + it('should type every level of a nested plural as a number argument', async () => { + await build(); + const lut = readOut('lut.ts'); + const line = lut.split('\n').find((it) => it.includes('"searchMatchHeading"')) ?? ''; + + expect(line).toContain( + 'args: { count_properties: number;count_project: number;count_planned_project: number }', + ); + expect(line).toContain( + '{count_properties: args.count_properties, count_project: args.count_project, count_planned_project: args.count_planned_project}', + ); + }); + + it('should keep an argument surrounded by whitespace usable', async () => { + await build(); + + expect(readOut('lut.ts')).toContain('"comingForSaleBodyText": (args: { p: FormatXMLElementFn'); + expect(readOut('lut.ts')).toContain('propertyProjectName: args.propertyProjectName'); + }); + + it('should emit the typescript preamble the frontend type-checks against', async () => { + await build(); + + expect(readOut('lut.ts')).toContain('export function createIntlLUT(intl: IntlShape) {'); + }); + }); + + describe('compiled AST bundles', () => { + it('should compile messages to AST keyed by the same ids as the text bundle', async () => { + await build(); + const compiled = JSON.parse(readOut('bundle_nb.compiled.json')); + + expect(Object.keys(compiled).sort()).toEqual(Object.keys(readBundle('nb')).sort()); + expect(Array.isArray(compiled.close)).toBe(true); + }); + + it('should keep html tags as tag elements in the AST', async () => { + await build(); + const compiled = JSON.parse(readOut('bundle_nb.compiled.json')); + const ast = compiled['commonProjectAndProperty.informationmeeting.formIntro']; + + expect(ast.some((part: { type: number; value?: string }) => part.value === 'p')).toBe(true); + }); + }); + + it('should match the snapshot for the whole nybolig-shaped output', async () => { + await build(); + + expect(vol.toJSON(outDir)).toMatchSnapshot(); + }); +}); diff --git a/test/commands/watch.test.ts b/test/commands/watch.test.ts new file mode 100644 index 0000000..39e8b79 --- /dev/null +++ b/test/commands/watch.test.ts @@ -0,0 +1,115 @@ +import { describe, it, expect, afterEach, beforeEach, vi } from 'vitest'; +import { vol } from 'memfs'; +import type { Command } from 'commander'; + +type Handler = (...args: unknown[]) => void; + +const handlers: Record = {}; +const closeMock = vi.fn(async () => {}); +const fakeWatcher = { + on: vi.fn((event: string, handler: Handler) => { + handlers[event] = [...(handlers[event] ?? []), handler]; + return fakeWatcher; + }), + close: closeMock, +}; +const watchMock = vi.fn(() => fakeWatcher); + +vi.mock('chokidar', () => ({ watch: watchMock })); + +const srcDir = '/app/src/intl/messages'; +const outDir = '/app/src/intl/compiled'; + +/** + * apps/frontend runs `i18n-tool watch src/intl/messages src/intl/compiled --strict + * --ast --lut --typescript --timeZone Europe/Oslo` as its intl:watch script. chokidar + * is mocked here so the wiring can be asserted without touching the real filesystem; + * see test/deps/chokidar-api.test.ts for the real chokidar contract. + */ +async function startWatch(args: string[] = []): Promise { + vi.resetModules(); + const { watchCommand }: { watchCommand: Command } = await import('../../src/commands/watch'); + await watchCommand + .exitOverride() + .configureOutput({ writeOut: () => {}, writeErr: () => {} }) + .parseAsync([srcDir, outDir, ...args], { from: 'user' }); +} + +// process.stdin is not a TTY under vitest, so setRawMode does not exist and has to be +// installed rather than spied on. +const stdin = process.stdin as NodeJS.ReadStream & { setRawMode?: unknown }; +const realSetRawMode = stdin.setRawMode; + +describe('watch command', () => { + beforeEach(() => { + stdin.setRawMode = vi.fn(() => stdin); + vi.spyOn(process, 'exit').mockImplementation(() => undefined as never); + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk', 'close_sv.txt': 'Stang' }, srcDir); + }); + + afterEach(() => { + stdin.setRawMode = realSetRawMode; + process.stdin.removeAllListeners('keypress'); + for (const event of Object.keys(handlers)) delete handlers[event]; + vi.restoreAllMocks(); + vi.clearAllMocks(); + vol.reset(); + }); + + it('should watch the source folder and ignore the initial scan', async () => { + await startWatch(); + + expect(watchMock).toHaveBeenCalledWith(srcDir, { ignoreInitial: true }); + expect(handlers.all).toHaveLength(1); + }); + + it('should build once before watching', async () => { + await startWatch(['--lut', '--typescript']); + + expect(Object.keys(vol.toJSON(outDir))).toContain(`${outDir}/lut.ts`); + }); + + it('should rebuild when the watcher reports a change', async () => { + await startWatch(); + vol.unlinkSync(`${outDir}/bundle_nb.json`); + + handlers.all[0]('add', `${srcDir}/open_nb.txt`); + + await vi.waitFor(() => expect(Object.keys(vol.toJSON(outDir))).toContain(`${outDir}/bundle_nb.json`)); + }); + + it('should not exit the process when validation fails, unlike build', async () => { + vol.reset(); + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk', 'open_sv.txt': 'Oppna' }, srcDir); + + await expect(startWatch(['--strict'])).resolves.toBeUndefined(); + }); + + it('should pass --timeZone through to the compiled bundles', async () => { + vol.reset(); + vol.fromNestedJSON({ 'date_nb.txt': '{d, date, ::yyyyMMdd}' }, srcDir); + + await startWatch(['--ast', '-t', 'Europe/Oslo']); + + const compiled = JSON.parse(vol.readFileSync(`${outDir}/bundle_nb.compiled.json`, 'utf-8').toString()); + expect(compiled.date[0].style.parsedOptions.timeZone).toBe('Europe/Oslo'); + }); + + it("should run the fixer when 'f' is pressed", async () => { + vol.reset(); + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk', 'close_sv.txt': 'Stang', 'open_nb.txt': 'Apne' }, srcDir); + + await startWatch(); + process.stdin.emit('keypress', 'f', { sequence: 'f', name: 'f', ctrl: false, meta: false, shift: false }); + + await vi.waitFor(() => expect(vol.readFileSync(`${srcDir}/open_sv.txt`, 'utf-8').toString()).toBe('[sv] TODO')); + }); + + it('should exit on ctrl-c', async () => { + await startWatch(); + + process.stdin.emit('keypress', '', { sequence: '', name: 'c', ctrl: true, meta: false, shift: false }); + + expect(process.exit).toHaveBeenCalledWith(0); + }); +}); diff --git a/test/deps/chokidar-api.test.ts b/test/deps/chokidar-api.test.ts new file mode 100644 index 0000000..9bef915 --- /dev/null +++ b/test/deps/chokidar-api.test.ts @@ -0,0 +1,81 @@ +import { describe, it, expect, afterEach, vi } from 'vitest'; +import * as chokidar from 'chokidar'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; + +type Watcher = ReturnType; + +/** + * src/commands/watch.ts uses exactly three things from chokidar: watch(dir, { + * ignoreInitial: true }), the 'all' event, and recursive coverage of nested folders + * (apps/frontend nests messages four levels deep). These tests run against the real + * filesystem so a chokidar upgrade that changes any of those fails here instead of in + * nybolig-nettsider's intl:watch script. + */ +describe('chokidar api contract', () => { + let dir = ''; + let watcher: Watcher | undefined; + + afterEach(async () => { + await watcher?.close(); + watcher = undefined; + if (dir) fs.rmSync(dir, { recursive: true, force: true }); + dir = ''; + }); + + async function startWatching(): Promise { + const events: string[] = []; + watcher = chokidar.watch(dir, { ignoreInitial: true }); + watcher.on('all', (event: string, changedPath: string) => + events.push(`${event} ${path.relative(dir, changedPath)}`), + ); + await new Promise((resolve) => watcher!.on('ready', () => resolve())); + return events; + } + + it('should report added files through the all event', async () => { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + const events = await startWatching(); + + fs.writeFileSync(path.join(dir, 'close_nb.txt'), 'Lukk'); + + await vi.waitFor(() => expect(events).toContain('add close_nb.txt'), { timeout: 5000, interval: 25 }); + }); + + it('should report files added in nested folders', async () => { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + fs.mkdirSync(path.join(dir, 'propertyProject/newLeadForm/part1'), { recursive: true }); + const events = await startWatching(); + + fs.writeFileSync(path.join(dir, 'propertyProject/newLeadForm/part1/heading_nb.txt'), 'Om deg'); + + await vi.waitFor( + () => expect(events).toContain(`add ${path.join('propertyProject/newLeadForm/part1/heading_nb.txt')}`), + { timeout: 5000, interval: 25 }, + ); + }); + + it('should report changes to existing files', async () => { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + const file = path.join(dir, 'close_nb.txt'); + fs.writeFileSync(file, 'Lukk'); + const events = await startWatching(); + + fs.writeFileSync(file, 'Lukk vinduet'); + + await vi.waitFor(() => expect(events).toContain('change close_nb.txt'), { timeout: 5000, interval: 25 }); + }); + + it('should not report existing files as added when ignoreInitial is set', async () => { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + fs.writeFileSync(path.join(dir, 'close_nb.txt'), 'Lukk'); + const events = await startWatching(); + + await new Promise((resolve) => setTimeout(resolve, 250)); + + // A 'change' can still arrive for a file written just before the watcher + // started; ignoreInitial only promises no 'add' for the initial scan. + expect(events.filter((event) => event.startsWith('add'))).toEqual([]); + }); +}); diff --git a/test/fixtures/nybolig-usage.ts b/test/fixtures/nybolig-usage.ts new file mode 100644 index 0000000..5dec783 --- /dev/null +++ b/test/fixtures/nybolig-usage.ts @@ -0,0 +1,150 @@ +import { NestedDirectoryJSON } from 'memfs/lib/volume'; + +/** + * Mirrors how @code-obos/i18n-tools is used in nybolig-nettsider (apps/frontend): + * + * i18n-tool build src/intl/messages src/intl/compiled \ + * --strict --ast --lut --typescript --timeZone Europe/Oslo + * + * The message contents here are synthetic, but every structural trait of the real + * message folder is reproduced: + * - two locales, nb + sv, with identical key sets (required by --strict) + * - up to four levels of nested folders + * - kebab-cased folder and file names alongside camelCased ones, including + * 'salesassignment-table' and 'salesassignmentTable' which collapse into the + * same LUT key + * - .html messages containing tags next to .txt messages + * - files without a locale suffix, which must be ignored + * - multi-line ICU: plurals nested three deep, selects with UPPER_SNAKE options, + * and an argument reused inside its own select + */ +export const nyboligMessages: NestedDirectoryJSON = { + 'README.md': 'Not a message, has no locale suffix.', + 'close_nb.txt': 'Lukk', + 'close_sv.txt': 'Stäng', + 'bkmLabel_nb.txt': `{bkmModel, select, + PARTOWNERSHIP {Deleie} + START_LIVING {Bostart} + PROPERTY_SWAP {Boligbytte} + other {{bkmModel}} +}`, + 'bkmLabel_sv.txt': `{bkmModel, select, + PARTOWNERSHIP {Delagt} + START_LIVING {Bostart} + PROPERTY_SWAP {Bostadsbyte} + other {{bkmModel}} +}`, + 'plannedProjectsMatched_nb.txt': `{ region_selected, select, + true {Planlagte prosjekter i området} + other {Planlagte prosjekter} +}`, + 'plannedProjectsMatched_sv.txt': `{ region_selected, select, + true {Planerade projekt i området} + other {Planerade projekt} +}`, + 'searchMatchHeading_nb.txt': `{count_properties, plural, + =0 { + {count_project, plural, + =0 { + {count_planned_project, plural, + =0 {Ingen treff} + one {Treff på # kommende prosjekt} + other {Treff på # kommende prosjekter} + } + } + other { + Fant {count_project,plural,=1{# prosjekt} other {# prosjekter}} + {count_planned_project, plural, + =0 {} + one {og # kommende prosjekt} + other {og # kommende prosjekter} + } + } + } + } + one {Treff på # ledig bolig} + other {Treff på # ledige boliger} +}`, + 'searchMatchHeading_sv.txt': `{count_properties, plural, + =0 { + {count_project, plural, + =0 { + {count_planned_project, plural, + =0 {Inga träffar} + one {Träff på # kommande projekt} + other {Träff på # kommande projekt} + } + } + other { + Träff på {count_project,plural,=1{# projekt} other {# projekt}} + {count_planned_project, plural, + =0 {} + one {och # kommande projekt} + other {och # kommande projekt} + } + } + } + } + one {Träff på # ledig bostad} + other {Träff på # lediga bostäder} +}`, + anchors: { + tabs: { + 'default_nb.txt': 'Oversikt', + 'default_sv.txt': 'Översikt', + }, + }, + commonProjectAndProperty: { + informationmeeting: { + 'formIntro_nb.html': '

\n Om informasjonsmøtet.\n

\n\n

\n Velkommen.\n

\n', + 'formIntro_sv.html': '

[TODO]

', + }, + }, + propertyProject: { + banners: { + 'comingForSaleBodyText_nb.html': '

\n { propertyProjectName} kommer snart for salg.\n

\n', + 'comingForSaleBodyText_sv.html': '

\n { propertyProjectName} kommer snart till försäljning.\n

\n', + }, + newLeadForm: { + part1: { + 'heading_nb.txt': 'Om deg', + 'heading_sv.txt': 'Om dig', + }, + receipt: { + 'heading_nb.txt': 'Takk', + 'heading_sv.txt': 'Tack', + }, + }, + }, + 'salesassignment-table': { + parking: { + 'assigned-spaces_nb.txt': 'Tildelte plasser', + 'assigned-spaces_sv.txt': 'Tilldelade platser', + 'electric-charging-for-sale_nb.txt': 'Ladeplass til salgs', + 'electric-charging-for-sale_sv.txt': 'Laddplats till försäljning', + }, + }, + salesassignmentTable: { + heading: { + 'unitTBA_nb.txt': 'BRA', + 'unitTBA_sv.txt': 'BOA', + }, + }, + 'traffic-split': { + 'mobileCta_nb.txt': 'Se boliger', + 'mobileCta_sv.txt': 'Se bostäder', + }, +}; + +/** The exact flags apps/frontend passes to `i18n-tool build`. */ +export const nyboligBuildFlags = ['--strict', '--ast', '--lut', '--typescript', '--timeZone', 'Europe/Oslo']; + +/** The same flags as a BuildOptions object, for calling runBuildCommand directly. */ +export const nyboligBuildOptions = { + format: 'formatjs' as const, + strict: true, + ast: true, + lut: true, + typescript: true, + timeZone: 'Europe/Oslo', +}; From a21f4ffe323457a639953b83356d756b5a2c211b Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:20:31 +0200 Subject: [PATCH 02/19] bump vitest og vitest coverage --- package-lock.json | 965 ++++++++++++++++++---------------------------- package.json | 4 +- 2 files changed, 380 insertions(+), 589 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5777c4f..bca0f77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@code-obos/i18n-tools", - "version": "3.0.0", + "version": "4.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@code-obos/i18n-tools", - "version": "3.0.0", + "version": "4.0.0", "license": "MIT", "dependencies": { "@formatjs/cli-lib": "^8.6.0", @@ -21,7 +21,7 @@ "@changesets/cli": "^2.31.0", "@formatjs/intl": "^4.1.12", "@types/node": "^24.12.4", - "@vitest/coverage-v8": "^4.1.8", + "@vitest/coverage-v8": "^5.0.0", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", "husky": "^8.0.3", @@ -30,7 +30,7 @@ "prettier": "^3.8.3", "ts-node": "^10.9.1", "typescript": "^5.6.3", - "vitest": "^4.1.8" + "vitest": "^5.0.0" }, "peerDependencies": { "@formatjs/intl": "^4.1.12" @@ -81,13 +81,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -107,9 +107,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { @@ -509,42 +509,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@formatjs/cli-lib": { "version": "8.7.5", "resolved": "https://registry.npmjs.org/@formatjs/cli-lib/-/cli-lib-8.7.5.tgz", @@ -1303,25 +1267,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1358,19 +1303,38 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", + "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", "dev": true, "license": "MIT", + "peer": true, "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", + "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", + "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", "cpu": [ "arm64" ], @@ -1380,14 +1344,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", "cpu": [ "arm64" ], @@ -1397,14 +1362,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", "cpu": [ "x64" ], @@ -1414,14 +1380,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", + "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", "cpu": [ "x64" ], @@ -1431,14 +1398,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", + "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", "cpu": [ "arm" ], @@ -1448,14 +1416,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", "cpu": [ "arm64" ], @@ -1465,14 +1434,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", "cpu": [ "arm64" ], @@ -1482,14 +1452,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", + "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", "cpu": [ "ppc64" ], @@ -1499,14 +1470,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", + "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", "cpu": [ "s390x" ], @@ -1516,14 +1488,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", "cpu": [ "x64" ], @@ -1533,14 +1506,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", "cpu": [ "x64" ], @@ -1550,14 +1524,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", + "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", "cpu": [ "arm64" ], @@ -1567,33 +1542,15 @@ "os": [ "openharmony" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", "cpu": [ "arm64" ], @@ -1603,14 +1560,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", "cpu": [ "x64" ], @@ -1620,6 +1578,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } @@ -1629,7 +1588,8 @@ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@simple-libs/stream-utils": { "version": "1.2.0", @@ -1645,13 +1605,6 @@ "url": "https://ko-fi.com/dangreen" } }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, "node_modules/@tsconfig/node10": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", @@ -1680,17 +1633,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -1739,36 +1681,32 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.0.tgz", "integrity": "sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } }, "node_modules/@vitest/coverage-v8": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.8.tgz", - "integrity": "sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.0.tgz", + "integrity": "sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.8", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" + "@vitest/istanbul-lib-coverage": "^1.0.0", + "@vitest/istanbul-lib-report": "^1.0.0", + "ast-v8-to-istanbul": "^1.0.5", + "magicast": "^0.5.4", + "obug": "^2.1.4", + "std-env": "^4.2.0", + "tinyrainbow": "^3.1.1" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.1.8", - "vitest": "4.1.8" + "@vitest/browser": "5.0.0", + "vitest": "5.0.0" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -1776,88 +1714,63 @@ } } }, - "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "node_modules/@vitest/istanbul-lib-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz", + "integrity": "sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==", "dev": true, "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=22" } }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "node_modules/@vitest/istanbul-lib-report": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-report/-/istanbul-lib-report-1.0.1.tgz", + "integrity": "sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.1.0" + "@vitest/istanbul-lib-coverage": "1.0.1" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=22" } }, - "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "node_modules/@vitest/mocker": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", + "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.8", - "pathe": "^2.0.3" + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.0", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" }, "funding": { "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, "node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", + "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, "funding": { "url": "https://opencollective.com/vitest" } @@ -1999,9 +1912,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.3.tgz", - "integrity": "sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.6.tgz", + "integrity": "sha512-fvpl29helSO2w/z7utIbrkNXILdrLwDwAMH2I/zPKlGf5244+gf+B4cyS1sANcrPY2h+hWCGSgC8N61s/+AF9A==", "dev": true, "license": "MIT", "dependencies": { @@ -2488,21 +2401,13 @@ "node": ">=18" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -2679,6 +2584,7 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8" } @@ -2789,9 +2695,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT" }, @@ -2898,9 +2804,9 @@ } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3109,6 +3015,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -3390,13 +3297,6 @@ "node": ">=0.10.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, "node_modules/human-id": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.0.tgz", @@ -3808,68 +3708,6 @@ "dev": true, "license": "ISC" }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -3966,11 +3804,12 @@ } }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", + "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -3982,23 +3821,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -4008,6 +3847,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4017,9 +3857,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -4029,6 +3869,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4038,9 +3879,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -4050,6 +3891,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4059,9 +3901,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -4071,6 +3913,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4080,9 +3923,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -4092,6 +3935,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4101,9 +3945,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], @@ -4113,6 +3957,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4122,9 +3967,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], @@ -4134,6 +3979,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4143,9 +3989,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], @@ -4155,6 +4001,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4164,9 +4011,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], @@ -4176,6 +4023,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4185,9 +4033,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -4197,6 +4045,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4206,9 +4055,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -4218,6 +4067,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -4309,6 +4159,16 @@ "node": ">=8.6" } }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, "node_modules/listr2": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", @@ -4764,9 +4624,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", "dev": true, "license": "MIT", "dependencies": { @@ -4774,33 +4634,17 @@ } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4958,9 +4802,9 @@ "license": "ISC" }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -4969,6 +4813,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5015,9 +4860,9 @@ } }, "node_modules/obug": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.2.tgz", - "integrity": "sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -5327,13 +5172,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5377,9 +5215,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, "funding": [ { @@ -5396,8 +5234,9 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5629,13 +5468,14 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", + "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@oxc-project/types": "=0.133.0", + "@oxc-project/types": "=0.148.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -5645,21 +5485,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" + "@rolldown/binding-android-arm-eabi": "1.2.7", + "@rolldown/binding-android-arm64": "1.2.7", + "@rolldown/binding-darwin-arm64": "1.2.7", + "@rolldown/binding-darwin-x64": "1.2.7", + "@rolldown/binding-freebsd-x64": "1.2.7", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", + "@rolldown/binding-linux-arm64-gnu": "1.2.7", + "@rolldown/binding-linux-arm64-musl": "1.2.7", + "@rolldown/binding-linux-ppc64-gnu": "1.2.7", + "@rolldown/binding-linux-s390x-gnu": "1.2.7", + "@rolldown/binding-linux-x64-gnu": "1.2.7", + "@rolldown/binding-linux-x64-musl": "1.2.7", + "@rolldown/binding-openharmony-arm64": "1.2.7", + "@rolldown/binding-win32-arm64-msvc": "1.2.7", + "@rolldown/binding-win32-x64-msvc": "1.2.7" } }, "node_modules/run-async": { @@ -5888,9 +5728,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, @@ -6039,16 +5879,19 @@ "license": "MIT" }, "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", + "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", "engines": { @@ -6091,12 +5934,11 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6105,9 +5947,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -6205,8 +6047,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-fest": { "version": "0.21.3", @@ -6226,7 +6067,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6265,130 +6105,92 @@ "dev": true, "license": "MIT" }, - "node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" }, "bin": { - "vitest": "vitest.mjs" + "vite": "bin/vite.js" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { + "@types/node": { "optional": true }, - "@types/node": { + "@vitejs/devtools": { "optional": true }, - "@vitest/browser-playwright": { + "esbuild": { "optional": true }, - "@vitest/browser-preview": { + "jiti": { "optional": true }, - "@vitest/browser-webdriverio": { + "less": { "optional": true }, - "@vitest/coverage-istanbul": { + "sass": { "optional": true }, - "@vitest/coverage-v8": { + "sass-embedded": { "optional": true }, - "@vitest/ui": { + "stylus": { "optional": true }, - "happy-dom": { + "sugarss": { "optional": true }, - "jsdom": { + "terser": { "optional": true }, - "vite": { - "optional": false - } - } - }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.8", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { + "tsx": { "optional": true }, - "vite": { + "yaml": { "optional": true } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6396,101 +6198,100 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/vitest/node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "node_modules/vitest": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", + "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.0", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "6.1.4", + "tinyexec": "1.3.0", + "tinyglobby": "^0.2.17", + "why-is-node-running": "^2.3.0" }, "bin": { - "vite": "bin/vite.js" + "vitest": "vitest.mjs" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.0", + "@vitest/browser-preview": "5.0.0", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.0", + "@vitest/coverage-v8": "5.0.0", + "@vitest/ui": "5.0.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "@types/node": { + "@edge-runtime/vm": { "optional": true }, - "@vitejs/devtools": { + "@opentelemetry/api": { "optional": true }, - "esbuild": { + "@types/node": { "optional": true }, - "jiti": { + "@vitest/browser-playwright": { "optional": true }, - "less": { + "@vitest/browser-preview": { "optional": true }, - "sass": { + "@vitest/browser-webdriverio": { "optional": true }, - "sass-embedded": { + "@vitest/coverage-istanbul": { "optional": true }, - "stylus": { + "@vitest/coverage-v8": { "optional": true }, - "sugarss": { + "@vitest/ui": { "optional": true }, - "terser": { + "happy-dom": { "optional": true }, - "tsx": { + "jsdom": { "optional": true }, - "yaml": { - "optional": true + "vite": { + "optional": false } } }, - "node_modules/vitest/node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, + "license": "MIT", "engines": { - "node": ">= 14.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/eemeli" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/wcwidth": { @@ -6607,16 +6408,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index c388055..4181c3a 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@changesets/cli": "^2.31.0", "@formatjs/intl": "^4.1.12", "@types/node": "^24.12.4", - "@vitest/coverage-v8": "^4.1.8", + "@vitest/coverage-v8": "^5.0.0", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", "husky": "^8.0.3", @@ -52,7 +52,7 @@ "prettier": "^3.8.3", "ts-node": "^10.9.1", "typescript": "^5.6.3", - "vitest": "^4.1.8" + "vitest": "^5.0.0" }, "dependencies": { "@formatjs/cli-lib": "^8.6.0", From 0e421cd8c047f3ada25885394690dc16c152bd51 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:21:43 +0200 Subject: [PATCH 03/19] bump husky to 9.1.7 --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index bca0f77..fa84e84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@vitest/coverage-v8": "^5.0.0", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", - "husky": "^8.0.3", + "husky": "^9.1.7", "lint-staged": "^13.2.2", "memfs": "^4.57.3", "prettier": "^3.8.3", @@ -3318,16 +3318,16 @@ } }, "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { - "husky": "lib/bin.js" + "husky": "bin.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" diff --git a/package.json b/package.json index 4181c3a..b79d882 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "changeset": "changeset", "changeset:version": "changeset version", "changeset:release": "npm run build && changeset publish", - "prepare": "husky install", + "prepare": "husky", "commit": "git-cz", "test": "vitest --coverage", "test-local": "node lib/index.js build example/messages example/compiled -f formatjs --ast --lut --strict --typescript --timeZone Europe/Oslo", @@ -46,7 +46,7 @@ "@vitest/coverage-v8": "^5.0.0", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", - "husky": "^8.0.3", + "husky": "^9.1.7", "lint-staged": "^13.2.2", "memfs": "^4.57.3", "prettier": "^3.8.3", From f1745e1e0d59fc100802854edda97c5dc409f224 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:24:16 +0200 Subject: [PATCH 04/19] bump changesets, cli-lib, chokidar og commander --- example/compiled/bundle_en.compiled.json | 2 +- example/compiled/bundle_en.json | 2 +- example/compiled/lut.ts | 2 +- package-lock.json | 1282 +++++++++------------- package.json | 8 +- 5 files changed, 496 insertions(+), 800 deletions(-) diff --git a/example/compiled/bundle_en.compiled.json b/example/compiled/bundle_en.compiled.json index 2ebfd83..bb25987 100644 --- a/example/compiled/bundle_en.compiled.json +++ b/example/compiled/bundle_en.compiled.json @@ -163,7 +163,7 @@ "value": "start_date" } ], - "group-by-page/title": [ + "group-by-page.title": [ { "type": 0, "value": "The folder structure is preserved in the look-up-table." diff --git a/example/compiled/bundle_en.json b/example/compiled/bundle_en.json index c07a477..44ea9ff 100644 --- a/example/compiled/bundle_en.json +++ b/example/compiled/bundle_en.json @@ -11,7 +11,7 @@ "datetime": { "defaultMessage": "I started this project at {start_time,time,::HHmm} on {start_date,date,::ddMMM}" }, - "group-by-page/title": { + "group-by-page.title": { "defaultMessage": "The folder structure is preserved in the look-up-table." }, "literal": { diff --git a/example/compiled/lut.ts b/example/compiled/lut.ts index fc89cae..0946dee 100644 --- a/example/compiled/lut.ts +++ b/example/compiled/lut.ts @@ -10,7 +10,7 @@ export function createIntlLUT(intl: IntlShape) { "datePluralAndTag": (args: { div: FormatXMLElementFn;gender: 'male' | 'female' | 'other' | string;p: FormatXMLElementFn;date: Date }) => intl.formatMessage({ id: 'datePluralAndTag' }, {div: args.div, gender: args.gender, p: args.p, date: args.date}), "datetime": (args: { start_time: Date;start_date: Date }) => intl.formatMessage({ id: 'datetime' }, {start_time: args.start_time, start_date: args.start_date}), "groupByPage": { - "title": () => intl.formatMessage({ id: 'group-by-page/title' }, {}), + "title": () => intl.formatMessage({ id: 'group-by-page.title' }, {}), }, "literal": () => intl.formatMessage({ id: 'literal' }, {}), "number": (args: { smallest: number;biggest: number;bagel_price: number }) => intl.formatMessage({ id: 'number' }, {smallest: args.smallest, biggest: args.biggest, bagel_price: args.bagel_price}), diff --git a/package-lock.json b/package-lock.json index fa84e84..4c48ce9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,16 @@ "version": "4.0.0", "license": "MIT", "dependencies": { - "@formatjs/cli-lib": "^8.6.0", + "@formatjs/cli-lib": "^9.0.9", "@formatjs/icu-messageformat-parser": "^3.5.0", - "chokidar": "^4.0.3", - "commander": "^14.0.2" + "chokidar": "^5.0.0", + "commander": "^15.0.0" }, "bin": { "i18n-tool": "i18n-tool" }, "devDependencies": { - "@changesets/cli": "^2.31.0", + "@changesets/cli": "^3.0.0", "@formatjs/intl": "^4.1.12", "@types/node": "^24.12.4", "@vitest/coverage-v8": "^5.0.0", @@ -96,16 +96,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.29.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", @@ -131,277 +121,302 @@ } }, "node_modules/@changesets/apply-release-plan": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", - "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-8.1.0.tgz", + "integrity": "sha512-M93HOGyX3ssg6He3b5NotaHtQVu6uajHS6UIQ28xKt2RzskCy73ayX4I914qBKjTJmrE4YFlELQjfcqxbmGLJw==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/config": "^3.1.4", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" + "@changesets/config": "^4.0.0", + "@changesets/format": "^0.1.2", + "@changesets/git": "^4.0.1", + "@changesets/should-skip-package": "^1.0.0", + "@changesets/types": "^7.0.0", + "import-meta-resolve": "^4.2.0", + "jsonc-parser": "^3.3.1", + "semver": "^7.8.1" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", - "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-7.0.0.tgz", + "integrity": "sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" + "@changesets/errors": "^1.0.0", + "@changesets/get-dependents-graph": "^3.0.0", + "@changesets/should-skip-package": "^1.0.0", + "@changesets/types": "^7.0.0", + "semver": "^7.8.1" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/changelog-git": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-1.0.0.tgz", + "integrity": "sha512-3Dst2Ime2Op5nd4XmWJLPIgp11ZFqJqSkVug9izK6TDcIV4YlhPS4ECbEVR+eGI0bk0r1ItogD4j2Oli87bJrA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^6.1.0" + "@changesets/types": "^7.0.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/cli": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", - "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/apply-release-plan": "^7.1.1", - "@changesets/assemble-release-plan": "^6.0.10", - "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.4", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/get-release-plan": "^4.0.16", - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.7", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@changesets/write": "^0.4.0", - "@inquirer/external-editor": "^1.0.2", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "enquirer": "^2.4.1", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-3.0.2.tgz", + "integrity": "sha512-t/omGJj/I+Jv0kmJAkj5cstYEdUQiJnpip2F+2m3F4lQ3kAZ3o8Exep4/Fm1qq4rvw6ovlhJvZNrKdwLJ4lkuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^8.1.0", + "@changesets/assemble-release-plan": "^7.0.0", + "@changesets/changelog-git": "^1.0.0", + "@changesets/config": "^4.0.0", + "@changesets/errors": "^1.0.0", + "@changesets/get-dependents-graph": "^3.0.0", + "@changesets/git": "^4.0.1", + "@changesets/pre": "^3.0.0", + "@changesets/read": "^1.0.1", + "@changesets/should-skip-package": "^1.0.0", + "@changesets/types": "^7.0.0", + "@changesets/write": "^1.0.1", + "@clack/prompts": "^1.7.0", + "@manypkg/get-packages": "^3.1.0", + "@pnpm/deps.graph-sequencer": "^1100.0.1", + "cac": "^7.0.0", + "import-meta-resolve": "^4.2.0", + "launch-editor": "^2.14.1", + "package-manager-detector": "^1.6.0", + "semver": "^7.8.1", + "tinyexec": "^1.3.0" }, "bin": { "changeset": "bin.js" + }, + "engines": { + "node": "^22.11 || ^24 || >=26", + "npm": ">=10.9.0", + "pnpm": ">=10.0.0", + "yarn": ">=4.5.2" } }, "node_modules/@changesets/config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", - "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-4.0.0.tgz", + "integrity": "sha512-mw95/YrkOuhZZxfnVAA4bSXOFUi+KlhzOBTM8C4x777NhUU6HWIl9Z+K+nME+E4PVsv5NQVQwTfiHihAS1A/ow==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/logger": "^0.1.1", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" + "@changesets/get-dependents-graph": "^3.0.0", + "@changesets/should-skip-package": "^1.0.0", + "@changesets/types": "^7.0.0", + "@manypkg/get-packages": "^3.1.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "node_modules/@changesets/config/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", - "dependencies": { - "extendable-error": "^0.1.5" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", - "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", + "node_modules/@changesets/errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-1.0.0.tgz", + "integrity": "sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==", "dev": true, "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" + "engines": { + "node": "^22.11 || ^24 || >=26" } }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", - "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", + "node_modules/@changesets/format": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/format/-/format-0.1.2.tgz", + "integrity": "sha512-Caez5XtNXCFS/G5bwyav3wuXL0tMxVd2ZGbaumWbzN08tyzO21asCw7JZhNtVsAZDCvDRUzZN+Iit9SyRITSYA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/assemble-release-plan": "^6.0.10", - "@changesets/config": "^3.1.4", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.7", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" + "package-manager-detector": "^1.8.0", + "tinyexec": "^1.3.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "node_modules/@changesets/get-dependents-graph": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-3.0.0.tgz", + "integrity": "sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@changesets/types": "^7.0.0", + "semver": "^7.8.1" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" + } }, "node_modules/@changesets/git": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-4.0.1.tgz", + "integrity": "sha512-6vWpIAC4LkpmlqaIu37ViT5enyd9+uBwAiGqCGhASvkSHBgx4PrtTGXWTMFYpDmZbjgyonyVgMciPrW4MqtJsA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" + "@changesets/errors": "^1.0.0", + "@changesets/types": "^7.0.0", + "@manypkg/get-packages": "^3.1.0", + "picomatch": "^4.0.4", + "tinyexec": "^1.3.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, - "node_modules/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "node_modules/@changesets/git/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", - "dependencies": { - "picocolors": "^1.1.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@changesets/parse": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", - "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-1.0.0.tgz", + "integrity": "sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^6.1.0", - "js-yaml": "^4.1.1" + "@changesets/types": "^7.0.0", + "yaml": "^2.9.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/pre": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-3.0.0.tgz", + "integrity": "sha512-Zm/6YliV/a2oeWTqHJf6KxLrQwgcK1i/BRDl2m0EKZvbnxV5fG9QRhwJJGshjsZTUTS6dkfURQ2K6aAvgNw/3Q==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" + "@changesets/errors": "^1.0.0", + "@changesets/types": "^7.0.0", + "@manypkg/get-packages": "^3.1.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/read": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", - "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-1.0.1.tgz", + "integrity": "sha512-nzvSC6RcTiWf/dsuwZFXpLzGGsRHYCL68U3uHV7srsulU93aVWY7u2GEJiDZ+4GIIElfaW5EqtKC0UHroY+LTQ==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.3", - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" + "@changesets/git": "^4.0.1", + "@changesets/parse": "^1.0.0", + "@changesets/types": "^7.0.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/should-skip-package": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-1.0.0.tgz", + "integrity": "sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" + "@changesets/types": "^7.0.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-7.0.0.tgz", + "integrity": "sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^22.11 || ^24 || >=26" + } }, "node_modules/@changesets/write": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-1.0.1.tgz", + "integrity": "sha512-q/ThtP9gcnEP6xlv7LrY26C2mHqdGBti/MmOVngt/M/oIGYkssmQGxPK9WzBNt2juVcH/vml2WQ+ra8LXYOTaA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "human-id": "^4.1.1", - "prettier": "^2.7.1" + "@changesets/format": "^0.1.1", + "@changesets/types": "^7.0.0", + "human-id": "^4.2.0" + }, + "engines": { + "node": "^22.11 || ^24 || >=26" } }, - "node_modules/@changesets/write/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/@clack/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", + "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=10.13.0" + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", + "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "engines": { + "node": ">= 20.12.0" } }, "node_modules/@commitlint/config-validator": { @@ -510,39 +525,38 @@ } }, "node_modules/@formatjs/cli-lib": { - "version": "8.7.5", - "resolved": "https://registry.npmjs.org/@formatjs/cli-lib/-/cli-lib-8.7.5.tgz", - "integrity": "sha512-yaFFDQ2vOaZN/Uao4eJmc9SsFzRZPKsVeHS0hnMbvLicCu8OXhANqrU9uzr5S8xUNqn0uDx72H1SPAp8O4BKtw==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@formatjs/cli-lib/-/cli-lib-9.0.9.tgz", + "integrity": "sha512-eEr7rOC+ga1i1i0zKR7IA5Ifp4rpo8VWhMHoQStvIPxHuqR7TAo00zv/YuVpT2HD3bhpcNX6/2/Hi0YWZO9Kxw==", "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "3.5.10", - "@formatjs/icu-skeleton-parser": "2.1.9", - "@formatjs/ts-transformer": "4.4.11", - "@types/estree": "^1.0.8", - "@types/fs-extra": "^11.0.4", + "@babel/types": "8", + "@formatjs/icu-messageformat-parser": "3.5.17", + "@types/fs-extra": "11", "@types/node": "22 || 24", - "commander": "^14.0.0", - "fast-glob": "^3.3.3", - "fs-extra": "^11.3.3", - "json-stable-stringify": "^1.3.0", - "loud-rejection": "^2", - "typescript": "^5.6 || 6" + "commander": "14", + "fast-glob": "3", + "fs-extra": "11", + "json-stable-stringify": "1", + "loud-rejection": "2" }, "engines": { "node": ">= 20.12.0" }, "optionalDependencies": { - "@formatjs/cli-native-darwin-arm64": "1.1.1", - "@formatjs/cli-native-linux-arm64": "1.2.1", - "@formatjs/cli-native-linux-x64": "1.1.1", - "@formatjs/cli-native-win32-x64": "1.1.2" + "@formatjs/cli-native-darwin-arm64": "1.1.17", + "@formatjs/cli-native-linux-arm64": "1.2.17", + "@formatjs/cli-native-linux-arm64-musl": "1.0.15", + "@formatjs/cli-native-linux-x64": "1.1.17", + "@formatjs/cli-native-linux-x64-musl": "1.0.15", + "@formatjs/cli-native-win32-x64": "1.1.18" }, "peerDependencies": { "@glimmer/syntax": "^0.84.3 || ^0.95.0", - "@vue/compiler-core": "^3.5.0", - "content-tag": "^4.1.0", - "svelte": "^5.0.0", - "vue": "^3.5.0" + "@vue/compiler-core": "3", + "content-tag": "4", + "svelte": "5", + "vue": "3" }, "peerDependenciesMeta": { "@glimmer/env": { @@ -571,6 +585,61 @@ } } }, + "node_modules/@formatjs/cli-lib/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@formatjs/cli-lib/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@formatjs/cli-lib/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@formatjs/cli-lib/node_modules/@formatjs/icu-messageformat-parser": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.17.tgz", + "integrity": "sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg==", + "license": "MIT", + "dependencies": { + "@formatjs/icu-skeleton-parser": "2.1.11" + } + }, + "node_modules/@formatjs/cli-lib/node_modules/@formatjs/icu-skeleton-parser": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz", + "integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==", + "license": "MIT" + }, + "node_modules/@formatjs/cli-lib/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/@formatjs/cli-lib/node_modules/fs-extra": { "version": "11.3.5", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", @@ -607,9 +676,9 @@ } }, "node_modules/@formatjs/cli-native-darwin-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@formatjs/cli-native-darwin-arm64/-/cli-native-darwin-arm64-1.1.1.tgz", - "integrity": "sha512-G2IfmxwDN1kUMIbM9ec5HfJTNR89X11+U3bt4lewfrRqoHOc9bQAkkVHLsY8gNVLjyQIXch58Ewd+AAHkg6cag==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-darwin-arm64/-/cli-native-darwin-arm64-1.1.17.tgz", + "integrity": "sha512-RB3OD7yKakaUXocjqAy6HSBDFGlyFaDIveO/GA6ddjWF7UBHt2YdyJyUYxaA0rNDvs2DTyqt8YKgMl1kqVVlYQ==", "cpu": [ "arm64" ], @@ -620,9 +689,22 @@ ] }, "node_modules/@formatjs/cli-native-linux-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-arm64/-/cli-native-linux-arm64-1.2.1.tgz", - "integrity": "sha512-dbafLt5p1wQi16QnTFuz6s5j5c8HcyRSw+gUp5xEtaQ9Ua2YKRu+YqlgsERg+ArTWN+ZTHIGu+0YymTvfTropA==", + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-arm64/-/cli-native-linux-arm64-1.2.17.tgz", + "integrity": "sha512-t058WJ5nHDYdXTzwJt6EJ5xXNzHoEUG5hYCwBFkp1PvlTJok+vzaDiOnjNBxg/AWjxBWd324f3jpz5oIEL/c7w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@formatjs/cli-native-linux-arm64-musl": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-arm64-musl/-/cli-native-linux-arm64-musl-1.0.15.tgz", + "integrity": "sha512-dmie/XV+sycRUEBY9GwDIteNEXm/WafsIELkINyrHV3mCLkhsZAgWf6CJ4a/ohQKV7LDkWiaaJ/rRLcEYFwZrA==", "cpu": [ "arm64" ], @@ -633,9 +715,22 @@ ] }, "node_modules/@formatjs/cli-native-linux-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-x64/-/cli-native-linux-x64-1.1.1.tgz", - "integrity": "sha512-zi6eOPAc03fszPyiGCkmzBxjIxynDFflie9zgbyZIQgKV7MhXEmUmpGYeaTTDX903OFCJJ3ZvpajSTdZ7C7yeQ==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-x64/-/cli-native-linux-x64-1.1.17.tgz", + "integrity": "sha512-p7xALk3DyLNGKirurKeLjRmaQpGh06pW6TIrx0EN7H8ccTreH3PIZD1FWapSqDeY1/8OKo3cMhioy/Qhq5nPAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@formatjs/cli-native-linux-x64-musl": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-x64-musl/-/cli-native-linux-x64-musl-1.0.15.tgz", + "integrity": "sha512-XaeyOB/VQ/QQGoTRZffRLbd/tUIGNTLM/OprzpZ+leuCuGT42qDNPlcTBRmzXaBLG5qsWKeBO34N95uE6AZfag==", "cpu": [ "x64" ], @@ -646,9 +741,9 @@ ] }, "node_modules/@formatjs/cli-native-win32-x64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@formatjs/cli-native-win32-x64/-/cli-native-win32-x64-1.1.2.tgz", - "integrity": "sha512-2TKatQRlDbVc+eJE4b9n0/+bsDg+DpS0kmHw7OYI1zGXhus4YqRPtlJnraazRmPlXtRNgvY/UYCPgBvX7DbYhw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@formatjs/cli-native-win32-x64/-/cli-native-win32-x64-1.1.18.tgz", + "integrity": "sha512-3d/R3nRmi56gXvVmzpEJixCAOam/F74RWqqTBLxnXEikMOhxSuGMRt99YynqvJIIJsn7tsVSBt2tg6T3cpms3w==", "cpu": [ "x64" ], @@ -692,51 +787,6 @@ "intl-messageformat": "11.2.7" } }, - "node_modules/@formatjs/ts-transformer": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-4.4.11.tgz", - "integrity": "sha512-xfL/YAPRZZeO+X386WqAOA9XHHW7NymM1Fb53IxxHW6oV0p3OKfoBy6Oi98GvWQQsr8y0H/2RyD0ok+mkAExWg==", - "license": "MIT", - "dependencies": { - "@formatjs/icu-messageformat-parser": "3.5.10", - "@types/node": "22 || 24", - "json-stable-stringify": "^1.3.0", - "typescript": "^5.6 || 6" - }, - "engines": { - "node": ">= 20.12.0" - }, - "peerDependencies": { - "ts-jest": "^29" - }, - "peerDependenciesMeta": { - "ts-jest": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1196,75 +1246,45 @@ } }, "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-3.1.0.tgz", + "integrity": "sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@manypkg/tools": "^2.1.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=20.0.0" } }, "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-3.1.0.tgz", + "integrity": "sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" + "@manypkg/find-root": "^3.1.0", + "@manypkg/tools": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/@manypkg/tools": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-2.1.2.tgz", + "integrity": "sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jju": "^1.4.0", + "tinyglobby": "^0.2.13", + "yaml": "^2.9.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=20.0.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1313,6 +1333,19 @@ "url": "https://github.com/sponsors/oxc-project" } }, + "node_modules/@pnpm/deps.graph-sequencer": { + "version": "1100.0.1", + "resolved": "https://registry.npmjs.org/@pnpm/deps.graph-sequencer/-/deps.graph-sequencer-1100.0.1.tgz", + "integrity": "sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.13" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, "node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", @@ -1655,6 +1688,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, "node_modules/@types/fs-extra": { @@ -1819,16 +1853,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1880,7 +1904,8 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "Python-2.0" + "license": "Python-2.0", + "optional": true }, "node_modules/array-find-index": { "version": "1.0.2", @@ -1891,16 +1916,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1961,19 +1976,6 @@ ], "license": "MIT" }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2034,6 +2036,16 @@ "ieee754": "^1.1.13" } }, + "node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", @@ -2127,23 +2139,16 @@ "node": ">=4" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "dev": true, - "license": "MIT" - }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -2291,12 +2296,12 @@ "license": "MIT" }, "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "license": "MIT", "engines": { - "node": ">=20" + "node": ">=22.12.0" } }, "node_modules/commitizen": { @@ -2599,19 +2604,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2640,20 +2632,6 @@ "dev": true, "license": "MIT" }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2735,20 +2713,6 @@ "node": ">=0.8.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -2813,13 +2777,6 @@ "node": ">=12.0.0" } }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true, - "license": "MIT" - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -2879,6 +2836,23 @@ "node": ">=8.6.0" } }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, "node_modules/fast-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", @@ -2897,6 +2871,16 @@ "license": "BSD-3-Clause", "optional": true }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -2952,20 +2936,6 @@ "dev": true, "license": "MIT" }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/findup-sync": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", @@ -2979,22 +2949,7 @@ "resolve-dir": "^1.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "node": ">= 8" } }, "node_modules/fs.realpath": { @@ -3199,27 +3154,6 @@ "which": "bin/which" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3298,9 +3232,9 @@ } }, "node_modules/human-id": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.0.tgz", - "integrity": "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.1.tgz", + "integrity": "sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==", "dev": true, "license": "MIT", "bin": { @@ -3343,23 +3277,6 @@ "node": ">=10.18" } }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3381,16 +3298,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -3420,6 +3327,17 @@ "node": ">=4" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3652,19 +3570,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -3719,6 +3624,13 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, "node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -3742,6 +3654,7 @@ } ], "license": "MIT", + "optional": true, "dependencies": { "argparse": "^2.0.1" }, @@ -3784,15 +3697,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "license": "MIT" }, "node_modules/jsonify": { "version": "0.0.1", @@ -3803,6 +3713,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -4280,19 +4201,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -4307,13 +4215,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -4777,16 +4678,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5009,84 +4900,12 @@ "node": ">=0.10.0" } }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "dev": true, - "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" - } + "license": "MIT" }, "node_modules/parent-module": { "version": "1.0.1", @@ -5132,16 +4951,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5162,16 +4971,6 @@ "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5204,16 +5003,6 @@ "node": ">=0.10" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/postcss": { "version": "8.5.28", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", @@ -5260,23 +5049,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5297,56 +5069,6 @@ ], "license": "MIT" }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -5363,12 +5085,12 @@ } }, "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -5406,6 +5128,7 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=8" } @@ -5574,9 +5297,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -5626,6 +5349,19 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -5639,15 +5375,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/slice-ansi": { "version": "5.0.0", @@ -5689,37 +5422,6 @@ "node": ">=0.10.0" } }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", - "dev": true, - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" - } - }, - "node_modules/spawndamnit/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5841,19 +5543,6 @@ "node": ">=4" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/thingies": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", @@ -6066,6 +5755,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6081,16 +5771,6 @@ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6408,6 +6088,22 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index b79d882..1eef009 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@formatjs/intl": "^4.1.12" }, "devDependencies": { - "@changesets/cli": "^2.31.0", + "@changesets/cli": "^3.0.0", "@formatjs/intl": "^4.1.12", "@types/node": "^24.12.4", "@vitest/coverage-v8": "^5.0.0", @@ -55,10 +55,10 @@ "vitest": "^5.0.0" }, "dependencies": { - "@formatjs/cli-lib": "^8.6.0", + "@formatjs/cli-lib": "^9.0.9", "@formatjs/icu-messageformat-parser": "^3.5.0", - "chokidar": "^4.0.3", - "commander": "^14.0.2" + "chokidar": "^5.0.0", + "commander": "^15.0.0" }, "lint-staged": { "*.{ts,js,css,md}": "prettier --write" From 70428b6029717eacde4ac9838bca0bf6960d7a43 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:28:03 +0200 Subject: [PATCH 05/19] chore: bump ts, prettier, formatjs, lint-staged --- package-lock.json | 1777 ++++++++++++++++++--------------------------- package.json | 14 +- 2 files changed, 699 insertions(+), 1092 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c48ce9..27dee7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@formatjs/cli-lib": "^9.0.9", - "@formatjs/icu-messageformat-parser": "^3.5.0", + "@formatjs/icu-messageformat-parser": "^3.5.17", "chokidar": "^5.0.0", "commander": "^15.0.0" }, @@ -19,21 +19,21 @@ }, "devDependencies": { "@changesets/cli": "^3.0.0", - "@formatjs/intl": "^4.1.12", + "@formatjs/intl": "^4.1.20", "@types/node": "^24.12.4", "@vitest/coverage-v8": "^5.0.0", - "commitizen": "^4.3.0", + "commitizen": "^4.3.2", "cz-conventional-changelog": "^3.3.0", "husky": "^9.1.7", - "lint-staged": "^13.2.2", + "lint-staged": "^17.5.0", "memfs": "^4.57.3", - "prettier": "^3.8.3", + "prettier": "^3.9.6", "ts-node": "^10.9.1", - "typescript": "^5.6.3", + "typescript": "^7.0.0", "vitest": "^5.0.0" }, "peerDependencies": { - "@formatjs/intl": "^4.1.12" + "@formatjs/intl": "^4.1.20" } }, "node_modules/@babel/code-frame": { @@ -616,21 +616,6 @@ "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@formatjs/cli-lib/node_modules/@formatjs/icu-messageformat-parser": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.17.tgz", - "integrity": "sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg==", - "license": "MIT", - "dependencies": { - "@formatjs/icu-skeleton-parser": "2.1.11" - } - }, - "node_modules/@formatjs/cli-lib/node_modules/@formatjs/icu-skeleton-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz", - "integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==", - "license": "MIT" - }, "node_modules/@formatjs/cli-lib/node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -754,37 +739,59 @@ ] }, "node_modules/@formatjs/fast-memoize": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.5.tgz", - "integrity": "sha512-KLi3fan6WnCHmigd9pmEEN8Hid0v4wiFBW576M/d07KMWYecf1CvyMI3n34vCmHT4AoVqG2n702kiHbXjzZX2A==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.7.tgz", + "integrity": "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==", "dev": true, "license": "MIT" }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.10.tgz", - "integrity": "sha512-XeJihYLy1lCe19xfK1KWKG/betBOK2rB0luL8lSkjfvJj0zP+LTJvkC+RKd0jsFI8mWxN71LrarHSrEXE8xxOQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.17.tgz", + "integrity": "sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg==", "license": "MIT", "dependencies": { - "@formatjs/icu-skeleton-parser": "2.1.9" + "@formatjs/icu-skeleton-parser": "2.1.11" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.9.tgz", - "integrity": "sha512-rsxswgHMfU1zUgB2byc08fesf83wLGjFnzLCEtuf00mx2doiqc6pYrf67raI37XqdRcGUviQepk2UKGqpng74Q==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz", + "integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==", "license": "MIT" }, "node_modules/@formatjs/intl": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-4.1.12.tgz", - "integrity": "sha512-r288ut+p+CUQZSg+0gAT+D0i6xgrnoxE0B4HTbPY2zei/AtYmFhlu87BKjgCf1CweH4pZIbr152JFjxO8jVb1A==", + "version": "4.1.20", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-4.1.20.tgz", + "integrity": "sha512-q3gaFvc1mXrl0fcSY2QKSS+WzJxpbIXs48O+QLA3UsRtIwVhazvxtLrLGKEse5Mq4U8hAYyTB6Y9buU2ZRFz/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "3.1.7", + "@formatjs/icu-messageformat-parser": "3.5.17", + "intl-messageformat": "11.2.14" + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "3.1.5", - "@formatjs/icu-messageformat-parser": "3.5.10", - "intl-messageformat": "11.2.7" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@jridgewell/resolve-uri": { @@ -1719,175 +1726,515 @@ "undici-types": "~7.18.0" } }, - "node_modules/@vitest/coverage-v8": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.0.tgz", - "integrity": "sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==", + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/istanbul-lib-coverage": "^1.0.0", - "@vitest/istanbul-lib-report": "^1.0.0", - "ast-v8-to-istanbul": "^1.0.5", - "magicast": "^0.5.4", - "obug": "^2.1.4", - "std-env": "^4.2.0", - "tinyrainbow": "^3.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "5.0.0", - "vitest": "5.0.0" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@vitest/istanbul-lib-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz", - "integrity": "sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==", + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=22" + "node": ">=16.20.0" } }, - "node_modules/@vitest/istanbul-lib-report": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-report/-/istanbul-lib-report-1.0.1.tgz", - "integrity": "sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==", + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/istanbul-lib-coverage": "1.0.1" - }, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=22" + "node": ">=16.20.0" } }, - "node_modules/@vitest/mocker": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", - "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.0", - "estree-walker": "^3.0.3", - "magic-string": "^1.2.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@vitest/spy": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", - "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.0" + "node": ">=16.20.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.0" + "node": ">=16.20.0" } }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.20.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=16.20.0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.0.tgz", + "integrity": "sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/istanbul-lib-coverage": "^1.0.0", + "@vitest/istanbul-lib-report": "^1.0.0", + "ast-v8-to-istanbul": "^1.0.5", + "magicast": "^0.5.4", + "obug": "^2.1.4", + "std-env": "^4.2.0", + "tinyrainbow": "^3.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "5.0.0", + "vitest": "5.0.0" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/istanbul-lib-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz", + "integrity": "sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@vitest/istanbul-lib-report": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-report/-/istanbul-lib-report-1.0.1.tgz", + "integrity": "sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/istanbul-lib-coverage": "1.0.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@vitest/mocker": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", + "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.0", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/spy": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", + "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { "node": ">=4" } @@ -1989,9 +2336,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2047,9 +2394,9 @@ } }, "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true, "license": "MIT", "engines": { @@ -2139,6 +2486,13 @@ "node": ">=4" } }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -2180,77 +2534,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -2288,13 +2571,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, "node_modules/commander": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", @@ -2305,13 +2581,13 @@ } }, "node_modules/commitizen": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", - "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.2.tgz", + "integrity": "sha512-1Zs37z9JPvAcuTSSricZZwBhOPVNNxJouuY4yDEt+eD70EoxT2TU9kViG8CuB/PmVg2G4XsAGQiK4YCst97aDQ==", "dev": true, "license": "MIT", "dependencies": { - "cachedir": "2.3.0", + "cachedir": "2.4.0", "cz-conventional-changelog": "3.3.0", "dedent": "0.7.0", "detect-indent": "6.1.0", @@ -2319,10 +2595,10 @@ "find-root": "1.1.0", "fs-extra": "9.1.0", "glob": "7.2.3", - "inquirer": "8.2.5", + "inquirer": "8.2.7", "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", + "lodash": "4.18.1", + "minimist": "1.2.8", "strip-bom": "4.0.0", "strip-json-comments": "3.1.1" }, @@ -2332,7 +2608,7 @@ "git-cz": "bin/git-cz" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/commitizen/node_modules/fs-extra": { @@ -2460,21 +2736,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2508,24 +2769,6 @@ "@commitlint/load": ">6.1.1" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -2618,13 +2861,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2723,37 +2959,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -2777,41 +2982,6 @@ "node": ">=12.0.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2854,9 +3024,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", "dev": true, "funding": [ { @@ -3021,19 +3191,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3241,16 +3398,6 @@ "human-id": "dist/cli.js" } }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -3277,6 +3424,23 @@ "node": ">=10.18" } }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3369,17 +3533,17 @@ } }, "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", "dev": true, "license": "MIT", "dependencies": { + "@inquirer/external-editor": "^1.0.0", "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", - "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", @@ -3389,7 +3553,7 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^6.0.1" }, "engines": { "node": ">=12.0.0" @@ -3472,14 +3636,14 @@ } }, "node_modules/intl-messageformat": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.7.tgz", - "integrity": "sha512-+q6Ktg119nULZEpZ8YTuGOst9MyEzFtjD63FTGBlN1mLz0Z/MOUYDIvnpVKwq17eezIEh+cfJIebfJoCetpiNw==", + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.14.tgz", + "integrity": "sha512-9f2VD1HFuxUvMw0RxsaP8WmMns6JRTnsNB/zghTFrp11ZktiXWwVDeZBPQchBKEmo+Gx/ZhxI7Qht7YglFD4PA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@formatjs/fast-memoize": "3.1.5", - "@formatjs/icu-messageformat-parser": "3.5.10" + "@formatjs/fast-memoize": "3.1.7", + "@formatjs/icu-messageformat-parser": "3.5.17" } }, "node_modules/is-arrayish": { @@ -3500,16 +3664,13 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-glob": { @@ -3557,19 +3718,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -3639,9 +3787,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, "funding": [ { @@ -3997,16 +4145,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -4016,489 +4154,157 @@ "optional": true }, "node_modules/lint-staged": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.5.0.tgz", + "integrity": "sha512-ah2qsNtvKP1+Ak4rAvEEIvcXDLjjbr/xmxCvlequxqEOFYk0qINcZcRxD3Ic8wRn7/oQ8+wC9s0DfDrdMVCRFg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "5.3.0", - "commander": "11.0.0", - "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.1" + "picomatch": "^4.0.7", + "string-argv": "^0.3.2", + "tinyexec": "^1.3.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=22.22.1" }, "funding": { "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/lint-staged/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "yaml": "^2.9.0" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/lint-staged/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/lint-staged/node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, "node_modules/lodash.map": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/log-update/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=7.0.0" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/longest": { @@ -4613,13 +4419,6 @@ "dev": true, "license": "MIT" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4643,16 +4442,13 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/minimatch": { @@ -4669,22 +4465,15 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -4712,35 +4501,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4775,16 +4535,16 @@ } }, "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4890,16 +4650,6 @@ "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/package-manager-detector": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", @@ -4961,16 +4711,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4990,19 +4730,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/postcss": { "version": "8.5.28", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", @@ -5034,9 +4761,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, "license": "MIT", "bin": { @@ -5147,32 +4874,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -5183,13 +4884,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, "node_modules/rolldown": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", @@ -5326,29 +5020,6 @@ "node": ">= 0.4" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/shell-quote": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", @@ -5382,36 +5053,6 @@ "dev": true, "license": "MIT" }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5471,16 +5112,6 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5504,19 +5135,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5645,19 +5263,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5752,17 +5357,38 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", "dev": true, "license": "Apache-2.0", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "tsc": "bin/tsc" }, "engines": { - "node": ">=14.17" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" } }, "node_modules/undici-types": { @@ -5984,22 +5610,6 @@ "defaults": "^1.0.3" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -6028,9 +5638,9 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -6039,10 +5649,7 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { diff --git a/package.json b/package.json index 1eef009..f80ecff 100644 --- a/package.json +++ b/package.json @@ -37,26 +37,26 @@ "author": "Nicklas Utgaard", "license": "MIT", "peerDependencies": { - "@formatjs/intl": "^4.1.12" + "@formatjs/intl": "^4.1.20" }, "devDependencies": { "@changesets/cli": "^3.0.0", - "@formatjs/intl": "^4.1.12", + "@formatjs/intl": "^4.1.20", "@types/node": "^24.12.4", "@vitest/coverage-v8": "^5.0.0", - "commitizen": "^4.3.0", + "commitizen": "^4.3.2", "cz-conventional-changelog": "^3.3.0", "husky": "^9.1.7", - "lint-staged": "^13.2.2", + "lint-staged": "^17.5.0", "memfs": "^4.57.3", - "prettier": "^3.8.3", + "prettier": "^3.9.6", "ts-node": "^10.9.1", - "typescript": "^5.6.3", + "typescript": "^7.0.0", "vitest": "^5.0.0" }, "dependencies": { "@formatjs/cli-lib": "^9.0.9", - "@formatjs/icu-messageformat-parser": "^3.5.0", + "@formatjs/icu-messageformat-parser": "^3.5.17", "chokidar": "^5.0.0", "commander": "^15.0.0" }, From ed637cebe51fbca03b816855e23ef8c3e1882f71 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:32:57 +0200 Subject: [PATCH 06/19] chore: add engines field --- .changeset/quiet-lions-listen.md | 11 +++++++++++ package-lock.json | 3 +++ package.json | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 .changeset/quiet-lions-listen.md diff --git a/.changeset/quiet-lions-listen.md b/.changeset/quiet-lions-listen.md new file mode 100644 index 0000000..915d20b --- /dev/null +++ b/.changeset/quiet-lions-listen.md @@ -0,0 +1,11 @@ +--- +'@code-obos/i18n-tools': patch +--- + +Oppdaterer alle avhengigheter til siste major. + +WHAT: chokidar 4 -> 5, commander 14 -> 15, @formatjs/cli-lib 8 -> 9, vitest 4 -> 5, typescript 5 -> 7, husky 8 -> 9, lint-staged 13 -> 17, @changesets/cli 2 -> 3, samt patch-bump av resten. Legger i tillegg til tester for CLI-parsing, watch-kommandoen og chokidar sitt API. + +WHY: Utdaterte pakker, og ingen tester dekket CLI-laget der commander og chokidar faktisk brukes. + +HOW: Ingen endring i generert output - snapshottestene for lut.ts og de kompilerte bundlene er uendret. Merk at commander 15 krever node >= 22.12. diff --git a/package-lock.json b/package-lock.json index 27dee7c..c1d15d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,9 @@ "typescript": "^7.0.0", "vitest": "^5.0.0" }, + "engines": { + "node": ">=22.12" + }, "peerDependencies": { "@formatjs/intl": "^4.1.20" } diff --git a/package.json b/package.json index f80ecff..57ab84b 100644 --- a/package.json +++ b/package.json @@ -67,5 +67,8 @@ "commitizen": { "path": "node_modules/cz-conventional-changelog" } + }, + "engines": { + "node": ">=22.12" } } From 280cae20e9618fe0c58fc334b9634c1002458a26 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 18:33:23 +0200 Subject: [PATCH 07/19] convert to minor --- .changeset/quiet-lions-listen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/quiet-lions-listen.md b/.changeset/quiet-lions-listen.md index 915d20b..a2a770c 100644 --- a/.changeset/quiet-lions-listen.md +++ b/.changeset/quiet-lions-listen.md @@ -1,5 +1,5 @@ --- -'@code-obos/i18n-tools': patch +'@code-obos/i18n-tools': minor --- Oppdaterer alle avhengigheter til siste major. From 8ffbaaa90a248d4645f95aa12136aa56189026e6 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:18:01 +0200 Subject: [PATCH 08/19] test: make the suite report honest coverage and stop flaking coverage.include is needed because v8 otherwise only reports files a test imports, which hid src/index.ts entirely instead of showing it at 0%. The chokidar contract tests wait on real OS file events, and macOS occasionally takes far longer than usual to deliver one, failing the suite about one run in five. Running the files one at a time helped but did not fix it, so those tests also retry twice. A genuine chokidar regression never delivers the event at all, so it still fails all three attempts. Co-Authored-By: Claude Opus 5 (1M context) --- test/deps/chokidar-api.test.ts | 48 ++++++++++++++++++++++------------ vitest.config.ts | 12 +++++++++ 2 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 vitest.config.ts diff --git a/test/deps/chokidar-api.test.ts b/test/deps/chokidar-api.test.ts index 9bef915..63cc9f7 100644 --- a/test/deps/chokidar-api.test.ts +++ b/test/deps/chokidar-api.test.ts @@ -12,7 +12,18 @@ type Watcher = ReturnType; * (apps/frontend nests messages four levels deep). These tests run against the real * filesystem so a chokidar upgrade that changes any of those fails here instead of in * nybolig-nettsider's intl:watch script. + * + * These are the only tests in the suite that wait on real OS file events, and macOS + * occasionally takes far longer than usual to deliver one, which made the suite fail + * roughly one run in five. Hence the long timeout and the retries. Retrying does not + * hide a genuine chokidar regression: a broken api never delivers the event, so all + * three attempts fail and the test still reports. */ +const watchOptions = { ignoreInitial: true }; +const timeout = 20_000; +const testOptions = { timeout, retry: { count: 2, delay: 250 } }; +const waitOptions = { timeout: timeout - 2_000, interval: 25 }; + describe('chokidar api contract', () => { let dir = ''; let watcher: Watcher | undefined; @@ -24,9 +35,14 @@ describe('chokidar api contract', () => { dir = ''; }); + function makeDir(): string { + dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + return dir; + } + async function startWatching(): Promise { const events: string[] = []; - watcher = chokidar.watch(dir, { ignoreInitial: true }); + watcher = chokidar.watch(dir, watchOptions); watcher.on('all', (event: string, changedPath: string) => events.push(`${event} ${path.relative(dir, changedPath)}`), ); @@ -34,41 +50,39 @@ describe('chokidar api contract', () => { return events; } - it('should report added files through the all event', async () => { - dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + it('should report added files through the all event', testOptions, async () => { + makeDir(); const events = await startWatching(); fs.writeFileSync(path.join(dir, 'close_nb.txt'), 'Lukk'); - await vi.waitFor(() => expect(events).toContain('add close_nb.txt'), { timeout: 5000, interval: 25 }); + await vi.waitFor(() => expect(events).toContain('add close_nb.txt'), waitOptions); }); - it('should report files added in nested folders', async () => { - dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); - fs.mkdirSync(path.join(dir, 'propertyProject/newLeadForm/part1'), { recursive: true }); + it('should report files added in nested folders', testOptions, async () => { + makeDir(); + const nested = path.join('propertyProject', 'newLeadForm', 'part1'); + fs.mkdirSync(path.join(dir, nested), { recursive: true }); const events = await startWatching(); - fs.writeFileSync(path.join(dir, 'propertyProject/newLeadForm/part1/heading_nb.txt'), 'Om deg'); + fs.writeFileSync(path.join(dir, nested, 'heading_nb.txt'), 'Om deg'); - await vi.waitFor( - () => expect(events).toContain(`add ${path.join('propertyProject/newLeadForm/part1/heading_nb.txt')}`), - { timeout: 5000, interval: 25 }, - ); + await vi.waitFor(() => expect(events).toContain(`add ${path.join(nested, 'heading_nb.txt')}`), waitOptions); }); - it('should report changes to existing files', async () => { - dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + it('should report changes to existing files', testOptions, async () => { + makeDir(); const file = path.join(dir, 'close_nb.txt'); fs.writeFileSync(file, 'Lukk'); const events = await startWatching(); fs.writeFileSync(file, 'Lukk vinduet'); - await vi.waitFor(() => expect(events).toContain('change close_nb.txt'), { timeout: 5000, interval: 25 }); + await vi.waitFor(() => expect(events).toContain('change close_nb.txt'), waitOptions); }); - it('should not report existing files as added when ignoreInitial is set', async () => { - dir = fs.mkdtempSync(path.join(os.tmpdir(), 'i18n-tools-watch-')); + it('should not report existing files as added when ignoreInitial is set', testOptions, async () => { + makeDir(); fs.writeFileSync(path.join(dir, 'close_nb.txt'), 'Lukk'); const events = await startWatching(); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..0501b70 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + // test/deps/chokidar-api.test.ts waits on real OS file events. When the test + // files run in parallel, delivery of those events to the worker stalls long + // enough that the test times out. The whole suite runs in a couple of seconds, + // so running the files one at a time is a cheap way to keep it reliable. + fileParallelism: false, + coverage: { include: ['src/**/*.ts'] }, + }, +}); From 7b41085597358d3e462036387aeeaf74f306c8f8 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:21 +0200 Subject: [PATCH 09/19] refactor(cli): define the build options once for build and watch The six options were duplicated verbatim in build.ts and watch.ts, which is how the help text for --ast and --lut drifted into claiming they only work with formatjs. WatchOptions is now BuildOptions, since watch already passed --timeZone through to the build despite the type saying otherwise. Co-Authored-By: Claude Opus 5 (1M context) --- src/commands/build-options.ts | 16 ++++++++++++++++ src/commands/build.ts | 21 +++++++++------------ src/commands/watch.ts | 21 +++++++++------------ src/config.ts | 9 ++------- 4 files changed, 36 insertions(+), 31 deletions(-) create mode 100644 src/commands/build-options.ts diff --git a/src/commands/build-options.ts b/src/commands/build-options.ts new file mode 100644 index 0000000..501f7c4 --- /dev/null +++ b/src/commands/build-options.ts @@ -0,0 +1,16 @@ +import { Command, Option } from 'commander'; +import { validFormats } from '../config.js'; + +/** + * build and watch must accept the exact same options, since watch is just build on a + * loop. Defining them once keeps the two commands from drifting apart. + */ +export function addBuildOptions(command: Command): Command { + return command + .addOption(new Option('-f, --format ', 'Output format').choices(validFormats).default('formatjs')) + .option('--typescript', 'Output script files with typescript', false) + .option('--strict', 'Run validation before bundling', false) + .option('--ast', 'Compile generated bundles into AST (not available with -f script)', false) + .option('--lut', 'Generate look-up-table (intended for the formatjs format)', false) + .option('-t, --timeZone ', 'Inject timezone into date/time skeletons'); +} diff --git a/src/commands/build.ts b/src/commands/build.ts index 087afc4..edde978 100644 --- a/src/commands/build.ts +++ b/src/commands/build.ts @@ -1,6 +1,6 @@ import { Command, program } from 'commander'; import * as path from 'path'; -import { BuildOptions, validFormats } from '../config.js'; +import { BuildOptions } from '../config.js'; import { createMessageBundle, IntlLocaleBundle } from '../builder/create-message-bundle.js'; import { compileIntlTextBundles } from '../builder/compile-intl-text-bundles.js'; import { compileIntlLutBundle } from '../builder/compile-intl-lut-bundle.js'; @@ -8,18 +8,15 @@ import { getIntlFiles } from '../utils/get-intl-files.js'; import { validateStructure } from '../validator/validate.js'; import { getFilesystem } from '../utils/get-filesystem.js'; import { compile } from '../builder/compile-formatjs-bundle.js'; +import { addBuildOptions } from './build-options.js'; -export const buildCommand: Command = program - .createCommand('build') - .description('Bundles files in into i18n files') - .argument('', 'source folder of your i18n files') - .argument('', 'output folder for your i18n bundles') - .addOption(program.createOption('-f, --format ', 'Output format').choices(validFormats).default('formatjs')) - .option('--typescript', 'Output script files with typescript', false) - .option('--strict', 'Run validation before bundling', false) - .option('--ast', 'Compile generated bundles (only availble with formatjs)', false) - .option('--lut', 'Generate look-up-table (only availble with formatjs)', false) - .option('-t, --timeZone ', 'Inject timezone into date/time skeletons') +export const buildCommand: Command = addBuildOptions( + program + .createCommand('build') + .description('Bundles files in into i18n files') + .argument('', 'source folder of your i18n files') + .argument('', 'output folder for your i18n bundles'), +) .addHelpText('afterAll', '\n') .addHelpText('afterAll', 'Example: i18n-tool build example/messages example/compiled --ast --lut --typescript') .action(runBuildCommand); diff --git a/src/commands/watch.ts b/src/commands/watch.ts index ea74280..3693132 100644 --- a/src/commands/watch.ts +++ b/src/commands/watch.ts @@ -1,10 +1,11 @@ import { Command, program } from 'commander'; import * as readline from 'readline'; import * as chokidar from 'chokidar'; -import { validFormats, WatchOptions } from '../config.js'; +import { WatchOptions } from '../config.js'; import { runBuildCommand } from './build.js'; import logger from '../utils/logger.js'; import { runFixCommand } from './fix.js'; +import { addBuildOptions } from './build-options.js'; interface Key { sequence: string; @@ -14,17 +15,13 @@ interface Key { shift: boolean; } -export const watchCommand: Command = program - .createCommand('watch') - .description('Starts watching and rebundling files in into i18n files') - .argument('', 'source folder of your i18n files') - .argument('', 'output folder for your i18n bundles') - .addOption(program.createOption('-f, --format ', 'Output format').choices(validFormats).default('formatjs')) - .option('--typescript', 'Output script files with typescript', false) - .option('--strict', 'Run validation before bundling', false) - .option('--ast', 'Compile generated bundles (only availble with formatjs)', false) - .option('--lut', 'Generate look-up-table (only availble with formatjs)', false) - .option('-t, --timeZone ', 'Inject timezone into date/time skeletons') +export const watchCommand: Command = addBuildOptions( + program + .createCommand('watch') + .description('Starts watching and rebundling files in into i18n files') + .argument('', 'source folder of your i18n files') + .argument('', 'output folder for your i18n bundles'), +) .addHelpText('afterAll', '\n') .addHelpText('afterAll', 'Example: i18n-tool watch example/messages example/compiled --ast --lut --typescript') .action(runWatchCommand); diff --git a/src/config.ts b/src/config.ts index fe0e566..779e285 100644 --- a/src/config.ts +++ b/src/config.ts @@ -12,10 +12,5 @@ export interface BuildOptions { hasFixerListener?: boolean; } -export interface WatchOptions { - format: Format; - typescript: boolean; - strict: boolean; - ast: boolean; - lut: boolean; -} +/** watch is build on a loop, so it accepts exactly the same options. */ +export type WatchOptions = BuildOptions; From 772bcbf5763505e32cf5b423dc203257e2456908 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:33 +0200 Subject: [PATCH 10/19] chore(husky): drop the husky 8 shim from the pre-commit hook husky 9 keeps sourcing _/husky.sh working as a deprecation shim, but running the hook prints "husky - DEPRECATED" and asks for the two lines to be removed. Co-Authored-By: Claude Opus 5 (1M context) --- .husky/pre-commit | 3 --- 1 file changed, 3 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af219..2312dc5 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - npx lint-staged From 6911c335fbc58e9590c1440a0c2a4eb69493e5b4 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:34 +0200 Subject: [PATCH 11/19] chore(deps): fix where the formatjs and json-stable-stringify deps live @formatjs/cli-lib is only reachable as `import type { CompileOpts }`, and the built lib/ never references it, so consumers were downloading it plus fs-extra, fast-glob and a native binary for one type. json-stable-stringify is the opposite case: compile-formatjs-bundle.ts imports it at runtime and it shipped in lib/, but it was only resolvable through cli-lib's own dependency tree. Co-Authored-By: Claude Opus 5 (1M context) --- package-lock.json | 46 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 7 ++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1d15d7..db77be2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,17 @@ "version": "4.0.0", "license": "MIT", "dependencies": { - "@formatjs/cli-lib": "^9.0.9", "@formatjs/icu-messageformat-parser": "^3.5.17", "chokidar": "^5.0.0", - "commander": "^15.0.0" + "commander": "^15.0.0", + "json-stable-stringify": "^1.3.0" }, "bin": { "i18n-tool": "i18n-tool" }, "devDependencies": { "@changesets/cli": "^3.0.0", + "@formatjs/cli-lib": "^9.0.9", "@formatjs/intl": "^4.1.20", "@types/node": "^24.12.4", "@vitest/coverage-v8": "^5.0.0", @@ -531,6 +532,7 @@ "version": "9.0.9", "resolved": "https://registry.npmjs.org/@formatjs/cli-lib/-/cli-lib-9.0.9.tgz", "integrity": "sha512-eEr7rOC+ga1i1i0zKR7IA5Ifp4rpo8VWhMHoQStvIPxHuqR7TAo00zv/YuVpT2HD3bhpcNX6/2/Hi0YWZO9Kxw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "8", @@ -592,6 +594,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "dev": true, "license": "MIT", "engines": { "node": "^22.18.0 || >=24.11.0" @@ -601,6 +604,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "dev": true, "license": "MIT", "engines": { "node": "^22.18.0 || >=24.11.0" @@ -610,6 +614,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^8.0.0", @@ -623,6 +628,7 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -632,6 +638,7 @@ "version": "11.3.5", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -646,6 +653,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -658,6 +666,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -670,6 +679,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -683,6 +693,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -696,6 +707,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -709,6 +721,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -722,6 +735,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -735,6 +749,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1301,6 +1316,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1314,6 +1330,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1323,6 +1340,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1705,6 +1723,7 @@ "version": "11.0.4", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/jsonfile": "*", @@ -1715,6 +1734,7 @@ "version": "6.1.4", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -1724,6 +1744,7 @@ "version": "24.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.0.tgz", "integrity": "sha512-5vtOqGQr4NJKeEzV441FcOi2MeG9UTWq9LqVLGneDdu4vlX17H8kQ2PA2UmNwCUGPVDj4oBjNhS7ReVEIWJJrg==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -2261,6 +2282,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2353,6 +2375,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -2743,6 +2766,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, "license": "MIT", "dependencies": { "array-find-index": "^1.0.1" @@ -2997,6 +3021,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3058,6 +3083,7 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -3083,6 +3109,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -3220,6 +3247,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -3330,6 +3358,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/has-flag": { @@ -3661,6 +3690,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3680,6 +3710,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -3702,6 +3733,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4324,6 +4356,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "dev": true, "license": "MIT", "dependencies": { "currently-unhandled": "^0.4.1", @@ -4426,6 +4459,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -4435,6 +4469,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -4725,6 +4760,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -4783,6 +4819,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -4881,6 +4918,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -4936,6 +4974,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -5047,6 +5086,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/sisteransi": { @@ -5270,6 +5310,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -5398,6 +5439,7 @@ "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, "license": "MIT" }, "node_modules/util-deprecate": { diff --git a/package.json b/package.json index 57ab84b..4e94e3b 100644 --- a/package.json +++ b/package.json @@ -52,13 +52,14 @@ "prettier": "^3.9.6", "ts-node": "^10.9.1", "typescript": "^7.0.0", - "vitest": "^5.0.0" + "vitest": "^5.0.0", + "@formatjs/cli-lib": "^9.0.9" }, "dependencies": { - "@formatjs/cli-lib": "^9.0.9", "@formatjs/icu-messageformat-parser": "^3.5.17", "chokidar": "^5.0.0", - "commander": "^15.0.0" + "commander": "^15.0.0", + "json-stable-stringify": "^1.3.0" }, "lint-staged": { "*.{ts,js,css,md}": "prettier --write" From 42b1e9c6b42a493455c230dbc19bfa6e724cbc84 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:34 +0200 Subject: [PATCH 12/19] chore(ts): target es2025 and module node20 typescript 7 is the native compiler and accepts node20/nodenext. The package requires node 22.12 anyway, so target es2017 and module node16 were leaving downlevelling on for engines that no longer need it. Co-Authored-By: Claude Opus 5 (1M context) --- tsconfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index c21b4de..c2ce0f0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,9 +3,9 @@ "lib": [ "ESNext" ], - "target": "ES2017", - "module": "node16", - "moduleResolution": "node16", + "target": "es2025", + "module": "node20", + "moduleResolution": "nodenext", "resolveJsonModule": true, "esModuleInterop": true, "isolatedModules": true, From 93d2ef69e312d0315b4b1c81b14021afd8658c7d Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:47 +0200 Subject: [PATCH 13/19] fix(build): sort messages by id so generated bundles are reproducible The key order in bundle_.json and lut.ts followed the order the filesystem handed out directory entries in. That is sorted on APFS but arbitrary on ext4, so the same messages could produce different files on a laptop and in CI. sortIntlFiles orders by normalized id, so the result is also the same on Windows (\) and unix (/), and deliberately avoids localeCompare, whose ordering depends on the ICU data of the machine running the build. Verified against the 1268 message files in nybolig-nettsider: same key set, same values, and bundle_.compiled.json is bit-identical since json-stable-stringify already sorted that one. Only the order changes. A consumer that gitignores the generated output and regenerates it on predev, as nybolig-nettsider does, sees no difference at all; one that commits it gets a one-time reordering. Co-Authored-By: Claude Opus 5 (1M context) --- src/builder/compile-intl-text-bundles.ts | 8 +- src/builder/create-message-bundle.ts | 4 +- src/utils/intl-file.ts | 22 +++- test/builder/deterministic-output.test.ts | 137 ++++++++++++++++++++++ 4 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 test/builder/deterministic-output.test.ts diff --git a/src/builder/compile-intl-text-bundles.ts b/src/builder/compile-intl-text-bundles.ts index 8cb0cfb..21ee81e 100644 --- a/src/builder/compile-intl-text-bundles.ts +++ b/src/builder/compile-intl-text-bundles.ts @@ -1,4 +1,4 @@ -import { IntlFile } from '../utils/intl-file.js'; +import { IntlFile, sortIntlFiles } from '../utils/intl-file.js'; import { Format } from '../config.js'; import { normalizeId } from '../utils/string-utils.js'; @@ -20,7 +20,9 @@ const formatMap: Record = { export function compileIntlTextBundles(files: IntlFile[], format: Format): [string, string][] { const bundle = createTextBundle(files); const formatter: Formatter = formatMap[format]; - return Object.entries(bundle).map(([locale, content]) => [locale, formatter(content)]); + return Object.entries(bundle) + .sort(([a], [b]) => (a < b ? -1 : 1)) + .map(([locale, content]) => [locale, formatter(content)]); } function jsonFormatter(content: IntlTextBundle): string { @@ -59,7 +61,7 @@ function formatjsFormatter(content: IntlTextBundle): string { } function createTextBundle(files: IntlFile[]): IntlTextBundles { - return files.reduce((acc, file) => { + return sortIntlFiles(files).reduce((acc, file) => { const locale = file.locale; const key = normalizeId(file.textId); const content = file.content; diff --git a/src/builder/create-message-bundle.ts b/src/builder/create-message-bundle.ts index 730676a..8afefb9 100644 --- a/src/builder/create-message-bundle.ts +++ b/src/builder/create-message-bundle.ts @@ -1,4 +1,4 @@ -import { IntlFile } from '../utils/intl-file.js'; +import { IntlFile, sortIntlFiles } from '../utils/intl-file.js'; import { camelCase } from '../utils/string-utils.js'; import { normalizeId } from '../utils/string-utils.js'; @@ -13,7 +13,7 @@ export interface IntlBundle { export function createMessageBundle(files: IntlFile[]): IntlLocaleBundle { const localebundle: IntlLocaleBundle = {}; - for (const file of files) { + for (const file of sortIntlFiles(files)) { const idParts = normalizeId(file.textId).split('.'); const pathparts = [file.locale, ...idParts.slice(0, -1)]; const lastPart = idParts[idParts.length - 1]; diff --git a/src/utils/intl-file.ts b/src/utils/intl-file.ts index ac14ac4..eda02d7 100644 --- a/src/utils/intl-file.ts +++ b/src/utils/intl-file.ts @@ -1,5 +1,5 @@ import * as pathUtils from 'path'; -import { camelCase } from './string-utils.js'; +import { camelCase, normalizeId } from './string-utils.js'; import { getFilesystem } from './get-filesystem.js'; const languagePattern = /_([^\W_]+)\.\w+$/; @@ -19,6 +19,26 @@ function findKey(path: string): string { return path.replace(removeLanguagePattern, ''); } +/** + * Deliberately not localeCompare: its result depends on the ICU locale data of the + * machine running the build, which would defeat the point of sorting at all. + */ +function compare(a: string, b: string): number { + if (a === b) return 0; + return a < b ? -1 : 1; +} + +/** + * Orders files by id so that generated bundles do not depend on the order the + * filesystem happens to hand out directory entries in. Ids are normalized first, so + * the ordering is the same on Windows (\) and unix (/). + */ +export function sortIntlFiles(files: IntlFile[]): IntlFile[] { + return [...files].sort( + (a, b) => compare(normalizeId(a.textId), normalizeId(b.textId)) || compare(a.locale, b.locale), + ); +} + export class IntlFile { private path: string; readonly textId: string; diff --git a/test/builder/deterministic-output.test.ts b/test/builder/deterministic-output.test.ts new file mode 100644 index 0000000..1ca7661 --- /dev/null +++ b/test/builder/deterministic-output.test.ts @@ -0,0 +1,137 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { vol } from 'memfs'; +import { getIntlFiles } from '../../src/utils/get-intl-files'; +import { sortIntlFiles } from '../../src/utils/intl-file'; +import { compileIntlTextBundles } from '../../src/builder/compile-intl-text-bundles'; +import { createMessageBundle, IntlBundle } from '../../src/builder/create-message-bundle'; +import { compileIntlLutBundle } from '../../src/builder/compile-intl-lut-bundle'; + +const srcDir = '/app/messages'; + +/** + * readdirSync hands out directory entries in whatever order the filesystem stores + * them in, which is sorted on APFS but arbitrary on ext4. Since the generated bundles + * are committed by consumers, the output has to be ordered by us rather than by the + * filesystem, or the same messages produce different files on a laptop and in CI. + * + * memfs always returns sorted entries, so these tests shuffle the file list by hand to + * simulate a filesystem that does not. + */ +const messages = { + 'zebra_nb.txt': 'Sebra', + 'apple_nb.txt': 'Eple', + middle: { + 'one_nb.txt': 'En', + 'two_nb.txt': 'To', + }, + 'aardvark_nb.txt': 'Jordsvin', +}; + +function shuffledFiles() { + const files = getIntlFiles(srcDir); + // A fixed, deliberately wrong order: last file first, then the rest reversed. + return [files[files.length - 1], ...files.slice(0, -1).reverse()]; +} + +describe('deterministic output', () => { + afterEach(() => { + vol.reset(); + }); + + describe('sortIntlFiles', () => { + it('should order files by normalized id regardless of input order', () => { + vol.fromNestedJSON(messages, srcDir); + + expect(sortIntlFiles(shuffledFiles()).map((file) => file.textId)).toEqual([ + 'aardvark', + 'apple', + 'middle/one', + 'middle/two', + 'zebra', + ]); + }); + + it('should order the same ids by locale', () => { + vol.fromNestedJSON({ 'close_sv.txt': 'Stang', 'close_nb.txt': 'Lukk', 'close_en.txt': 'Close' }, srcDir); + const files = getIntlFiles(srcDir); + + expect(sortIntlFiles([files[2], files[0], files[1]]).map((file) => file.locale)).toEqual([ + 'en', + 'nb', + 'sv', + ]); + }); + + it('should not mutate the array it is given', () => { + vol.fromNestedJSON(messages, srcDir); + const files = shuffledFiles(); + const before = files.map((file) => file.textId); + + sortIntlFiles(files); + + expect(files.map((file) => file.textId)).toEqual(before); + }); + }); + + describe('compileIntlTextBundles', () => { + it('should sort ids for every format', () => { + vol.fromNestedJSON(messages, srcDir); + const expected = ['aardvark', 'apple', 'middle.one', 'middle.two', 'zebra']; + + for (const format of ['json', 'jsonlut', 'formatjs'] as const) { + const [[, content]] = compileIntlTextBundles(shuffledFiles(), format); + const keys = Object.keys(JSON.parse(content)); + + // jsonlut nests, so the middle.* ids collapse into one 'middle' key. + const flattened = format === 'jsonlut' ? ['aardvark', 'apple', 'middle', 'zebra'] : expected; + expect(keys, format).toEqual(flattened); + } + }); + + it('should sort locales', () => { + vol.fromNestedJSON({ 'close_sv.txt': 'Stang', 'close_nb.txt': 'Lukk', 'close_en.txt': 'Close' }, srcDir); + const files = getIntlFiles(srcDir); + + const compiled = compileIntlTextBundles([files[2], files[0], files[1]], 'json'); + + expect(compiled.map(([locale]) => locale)).toEqual(['en', 'nb', 'sv']); + }); + }); + + describe('createMessageBundle', () => { + it('should sort keys at every level', () => { + vol.fromNestedJSON( + { ...messages, middle: { 'two_nb.txt': 'To', 'one_nb.txt': 'En', 'aaa_nb.txt': 'A' } }, + srcDir, + ); + + const bundle = createMessageBundle(shuffledFiles()); + + expect(Object.keys(bundle.nb)).toEqual(['aardvark', 'apple', 'middle', 'zebra']); + expect(Object.keys(bundle.nb.middle as IntlBundle)).toEqual(['aaa', 'one', 'two']); + }); + }); + + describe('order independence', () => { + it('should produce identical text bundles for shuffled and sorted input', () => { + vol.fromNestedJSON(messages, srcDir); + + const fromShuffled = compileIntlTextBundles(shuffledFiles(), 'formatjs'); + const fromSorted = compileIntlTextBundles(sortIntlFiles(getIntlFiles(srcDir)), 'formatjs'); + + expect(fromShuffled).toEqual(fromSorted); + }); + + it('should produce an identical lut for shuffled and sorted input', () => { + vol.fromNestedJSON(messages, srcDir); + + const fromShuffled = compileIntlLutBundle(Object.values(createMessageBundle(shuffledFiles()))[0], true); + const fromSorted = compileIntlLutBundle( + Object.values(createMessageBundle(sortIntlFiles(getIntlFiles(srcDir))))[0], + true, + ); + + expect(fromShuffled).toEqual(fromSorted); + }); + }); +}); From d7808d38bb98bb6ca2f7c7e2bba45be1f0f622d9 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:17:47 +0200 Subject: [PATCH 14/19] refactor(utils): read the message tree with a recursive readdir memfs and node both support readdirSync(dir, { recursive: true }), so the hand-rolled recursion is no longer needed. The lstat check stays: a folder can be named close_nb.txt, and filtering on the name alone would let it through. Tests cover four levels of nesting, that folders are excluded, that a folder named like a message file is excluded, and that an empty tree yields nothing. Co-Authored-By: Claude Opus 5 (1M context) --- src/utils/io-utils.ts | 13 +++++-------- test/utils/io-utils.test.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/utils/io-utils.ts b/src/utils/io-utils.ts index 859767d..aa7b28c 100644 --- a/src/utils/io-utils.ts +++ b/src/utils/io-utils.ts @@ -3,12 +3,9 @@ import { getFilesystem } from './get-filesystem.js'; export function getAllFiles(directory: string): string[] { const fs = getFilesystem(); - return fs.readdirSync(directory).flatMap((file) => { - const fullPath = path.join(directory, file.toString()); - const isDirectory = fs.lstatSync(fullPath).isDirectory(); - if (isDirectory) { - return getAllFiles(fullPath); - } - return [fullPath]; - }); + const entries = fs.readdirSync(directory, { recursive: true }) as unknown as string[]; + + return entries + .map((entry) => path.join(directory, entry.toString())) + .filter((entryPath) => !fs.lstatSync(entryPath).isDirectory()); } diff --git a/test/utils/io-utils.test.ts b/test/utils/io-utils.test.ts index 9e1509c..7d7d714 100644 --- a/test/utils/io-utils.test.ts +++ b/test/utils/io-utils.test.ts @@ -32,4 +32,33 @@ describe('getAllFiles', () => { expect(files).toHaveLength(4); expectedFiles.every((file) => expect(files).toContain(file)); }); + + it('should reach files nested several folders deep', () => { + vol.fromNestedJSON( + { propertyProject: { newLeadForm: { part1: { receipt: { 'heading_nb.txt': 'Takk' } } } } }, + '/app', + ); + + expect(getAllFiles('/app')).toEqual(['/app/propertyProject/newLeadForm/part1/receipt/heading_nb.txt']); + }); + + it('should not return the folders themselves', () => { + vol.fromNestedJSON({ folder: { nested: { 'file.txt': 'x' } } }, '/app'); + + expect(getAllFiles('/app')).toEqual(['/app/folder/nested/file.txt']); + }); + + it('should not return a folder that is named like a file', () => { + // A folder called 'close_nb.txt' matches the intl file pattern, so it can only + // be excluded by checking what it actually is on disk. + vol.fromNestedJSON({ 'close_nb.txt': { 'inner_nb.txt': 'Lukk' } }, '/app'); + + expect(getAllFiles('/app')).toEqual(['/app/close_nb.txt/inner_nb.txt']); + }); + + it('should return nothing for an empty folder tree', () => { + vol.mkdirSync('/app/empty', { recursive: true }); + + expect(getAllFiles('/app')).toEqual([]); + }); }); From 3943328a1a4af17d512c0784142b9dc1b7807923 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:18:00 +0200 Subject: [PATCH 15/19] fix(build): explain why --ast cannot be combined with -f script The script format writes javascript, which the AST compiler then tried to JSON.parse, failing with "Unexpected token 'c', "const text"... is not valid JSON". --ast still works with json, jsonlut and formatjs, which the tests pin so the guard does not grow too wide. Co-Authored-By: Claude Opus 5 (1M context) --- src/commands/build.ts | 6 ++++++ test/cli.test.ts | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/commands/build.ts b/src/commands/build.ts index edde978..28b6594 100644 --- a/src/commands/build.ts +++ b/src/commands/build.ts @@ -22,6 +22,12 @@ export const buildCommand: Command = addBuildOptions( .action(runBuildCommand); export async function runBuildCommand(srcDir: string, outDir: string, config: BuildOptions) { + if (config.ast && config.format === 'script') { + throw new Error( + "--ast is not available with '-f script', because the generated bundle is javascript rather than json. Use -f formatjs, json or jsonlut.", + ); + } + const files = getIntlFiles(srcDir); const fs = getFilesystem(); if (config.strict) { diff --git a/test/cli.test.ts b/test/cli.test.ts index f4aec01..8465a30 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -120,6 +120,40 @@ describe('cli argument parsing', () => { await expect(runCli('build', [srcDir, outDir, '--strict'])).rejects.toThrowError(); }); + + it('should explain why --ast cannot be combined with -f script', async () => { + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk' }, srcDir); + + // Without the guard this fails inside JSON.parse with + // "Unexpected token 'c', "const text"... is not valid JSON". + await expect(runCli('build', [srcDir, outDir, '-f', 'script', '--ast'])).rejects.toThrowError( + /--ast is not available with '-f script'/, + ); + }); + + it('should still allow --ast with the json formats', async () => { + for (const format of ['json', 'jsonlut', 'formatjs']) { + vol.reset(); + vol.fromNestedJSON({ 'close_nb.txt': 'Lukk' }, srcDir); + + await runCli('build', [srcDir, outDir, '-f', format, '--ast']); + + expect(Object.keys(vol.toJSON(outDir)), format).toContain(`${outDir}/bundle_nb.compiled.json`); + } + }); + + it('should expose exactly the documented options', async () => { + const build = await freshCommand('build'); + + expect(build.options.map((option) => option.flags)).toEqual([ + '-f, --format ', + '--typescript', + '--strict', + '--ast', + '--lut', + '-t, --timeZone ', + ]); + }); }); describe('watch', () => { @@ -127,13 +161,12 @@ describe('cli argument parsing', () => { const build = await freshCommand('build'); const watch = await freshCommand('watch'); - const flags = (command: Command) => + const describeOptions = (command: Command) => command.options - .map((option) => option.flags) - .sort() + .map((option) => `${option.flags} | ${option.description} | ${option.defaultValue}`) .join('\n'); - expect(flags(watch)).toEqual(flags(build)); + expect(describeOptions(watch)).toEqual(describeOptions(build)); }); }); From 80fb36edcc2bbedde95b35b9f7935489ed5121ae Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:18:01 +0200 Subject: [PATCH 16/19] fix(logger): open the WARN colour with an escape character The colour started with \x0b, a vertical tab, rather than \x1b. Terminals printed a literal "[33m" and left WARN uncoloured. The other four levels were already correct. Co-Authored-By: Claude Opus 5 (1M context) --- src/utils/logger.ts | 2 +- test/utils/logger.test.ts | 72 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 test/utils/logger.test.ts diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 90d4aa7..f624be5 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,7 +1,7 @@ const red = (msg: string) => `\x1b[31m${msg}\x1b[0m`; const green = (msg: string) => `\x1b[32m${msg}\x1b[0m`; const cyan = (msg: string) => `\x1b[36m${msg}\x1b[0m`; -const orange = (msg: string) => `\x0b[33m${msg}\x1b[0m`; +const orange = (msg: string) => `\x1b[33m${msg}\x1b[0m`; const log = (...msg: string[]) => process.stderr.write(msg.map((it) => it.toString()).join(' ') + '\n'); function success(msg: string) { diff --git a/test/utils/logger.test.ts b/test/utils/logger.test.ts new file mode 100644 index 0000000..8a6f317 --- /dev/null +++ b/test/utils/logger.test.ts @@ -0,0 +1,72 @@ +import { describe, it, expect, afterEach, beforeEach, vi } from 'vitest'; +import logger from '../../src/utils/logger'; + +const ESC = '\x1b'; + +describe('logger', () => { + let written: string[] = []; + + beforeEach(() => { + written = []; + vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => { + written.push(chunk.toString()); + return true; + }); + vi.spyOn(process.stdout, 'write').mockImplementation(() => true); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should prefix each level with its own colour', () => { + logger.success('bygget'); + logger.info('bygger'); + logger.warn('advarsel'); + logger.error('feil'); + logger.fatal('fatalt'); + + expect(written).toEqual([ + `${ESC}[32mSUCCESS${ESC}[0m bygget\n`, + `${ESC}[36mINFO${ESC}[0m bygger\n`, + `${ESC}[33mWARN${ESC}[0m advarsel\n`, + `${ESC}[31mERROR${ESC}[0m feil\n`, + `${ESC}[31mFATAL${ESC}[0m fatalt\n`, + ]); + }); + + it('should open every colour with a real escape character', () => { + // warn used to start with \x0b (vertical tab) rather than \x1b (escape), which + // made terminals print a literal '[33m' and leave WARN uncoloured. + logger.success('a'); + logger.info('b'); + logger.warn('c'); + logger.error('d'); + logger.fatal('e'); + + for (const line of written) { + expect(line.startsWith(ESC), line.replace(/\x1b/g, '')).toBe(true); + expect(line).not.toContain('\x0b'); + } + }); + + it('should reset the colour after the level, not after the message', () => { + logger.warn('advarsel'); + + expect(written[0]).toBe(`${ESC}[33mWARN${ESC}[0m advarsel\n`); + expect(written[0].endsWith('advarsel\n')).toBe(true); + }); + + it('should write to stderr so piped bundles stay clean', () => { + logger.info('bygger'); + + expect(process.stderr.write).toHaveBeenCalledTimes(1); + expect(process.stdout.write).not.toHaveBeenCalled(); + }); + + it('should end each line with exactly one newline', () => { + logger.info('bygger'); + + expect(written[0]).toMatch(/[^\n]\n$/); + }); +}); From 1cdb124930ff1543e5d98b20a454c049977bcc57 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:18:13 +0200 Subject: [PATCH 17/19] docs: document the message file convention and the look-up-table The format examples still used the pre-4.0.0 "/" id separator, and the option descriptions repeated the "only availble with formatjs" claim. Neither the naming convention for message files nor how to consume the generated output was written down anywhere, so the README alone was not enough to use the package. Adds the file naming rules, what each generated file is for, how to wire createIntlLUT up to createIntl, and how ICU constructs map to argument types. Drops the stale "Breaking Changes" section, which described a previous release and belongs in the changelog. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 562ac12..79b8226 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,37 @@ Utility for building and compiling I18N bundles. The project uses tools from [FormatJS](https://formatjs.io/), if your project uses other tools it may not work for you. +Requires Node 22.12 or newer. + **Install globally:** `npm install @code-obos/i18n-tools -g` **Install in project:** `npm install @code-obos/i18n-tools --save-dev` -## Breaking Changes (Dependency Modernization) +The generated look-up-table imports from `@formatjs/intl`, so add that too if you use `--lut`: +`npm install @formatjs/intl` + +See [CHANGELOG.md](./CHANGELOG.md) for changes between versions. + +## Writing messages + +One message per file. The filename decides both the message id and the locale: -The latest dependency upgrade introduces breaking changes that must be treated as a major release: +``` +messages/ + close_nb.txt -> id "close", locale nb + close_sv.txt -> id "close", locale sv + camel-cased-name_en.txt -> id "camel-cased-name", locale en + group-by-page/title_en.txt -> id "group-by-page.title", locale en +``` -1. The package now runs as ESM (`"type": "module"`). -2. Node.js must be modern enough for the upgraded dependency set (recommended: active LTS). -3. `@formatjs/intl` peer dependency is upgraded from `^2.8.0` to `^4.1.12`. +- The name must end in `_` before the extension. Files without a locale suffix, such as `README.md`, are ignored. +- `.txt`, `.html` and `.md` are all picked up. Use `.html` when the message contains tags. +- Folders are preserved in the id, separated by `.`, and become nested objects in the look-up-table. +- The file content is an [ICU message](https://formatjs.io/docs/core-concepts/icu-syntax/). Plurals, selects, tags and date/time skeletons all work. -These changes do not alter the expected CLI output behavior in this repository (verified by tests), but they can affect downstream integrations that depend on CommonJS behavior or older FormatJS versions. +Ids are always emitted in sorted order, so the generated files do not change just because a different filesystem hands out directory entries in a different order. ## Usage @@ -53,8 +69,8 @@ Options: -f, --format Output format (choices: "script", "json", "jsonlut", "formatjs", default: "formatjs") --typescript Output script files with typescript (default: false) --strict Run validation before bundling (default: false) - --ast Compile generated bundles (only availble with formatjs) (default: false) - --lut Generate look-up-table (only availble with formatjs) (default: false) + --ast Compile generated bundles into AST (not available with -f script) (default: false) + --lut Generate look-up-table (intended for the formatjs format) (default: false) -t, --timeZone Inject timezone into date/time skeletons -h, --help display help for command @@ -64,13 +80,38 @@ Examples: i18n-tool build example/messages example/compiled --ast --lut --typescript ``` +`watch` takes the same arguments and options as `build`, rebuilds on every change, and lets you press `f` to run the fixer without stopping. + +A typical project wires both up as scripts: + +```json +{ + "scripts": { + "intl": "i18n-tool build src/intl/messages src/intl/compiled --strict --ast --lut --typescript --timeZone Europe/Oslo", + "intl:watch": "i18n-tool watch src/intl/messages src/intl/compiled --strict --ast --lut --typescript --timeZone Europe/Oslo" + } +} +``` + +#### What gets written + +With `--ast --lut` and the default `formatjs` format, `outDir` ends up with: + +| File | Written by | Purpose | +| ------------------------------- | ---------- | -------------------------------------------------------------------------- | +| `bundle_.json` | always | the messages, as ICU source strings | +| `bundle_.compiled.json` | `--ast` | the same messages pre-parsed to AST, this is what you hand to `createIntl` | +| `lut.ts` / `lut.js` | `--lut` | typed helper functions, one per message | + +`--ast` skips the runtime ICU parsing and is what you want in production. `-t/--timeZone` writes the timezone into every date/time skeleton while compiling, so formatting does not depend on the timezone of the machine rendering the page. + #### The different formats; **script** generates `bundle_[locale].js` ```javascript const texts = { - 'group-by-page/title': 'The folder structure is preserved in the look-up-table.', + 'group-by-page.title': 'The folder structure is preserved in the look-up-table.', }; export default texts; @@ -82,7 +123,7 @@ Use `--typescript` to change the file extension ```json { - "group-by-page/title": "The folder structure is preserved in the look-up-table." + "group-by-page.title": "The folder structure is preserved in the look-up-table." } ``` @@ -100,12 +141,53 @@ Use `--typescript` to change the file extension ```json { - "group-by-page/title": { + "group-by-page.title": { "defaultMessage": "The folder structure is preserved in the look-up-table." } } ``` +### Using the look-up-table + +`--lut` generates a `createIntlLUT` function. Every message becomes a function whose arguments are derived from the ICU message itself, so a missing or misspelled placeholder is a type error rather than a blank spot on the page: + +```typescript +export function createIntlLUT(intl: IntlShape) { + return { + argument: (args: { me: string; other: string }) => + intl.formatMessage({ id: 'argument' }, { me: args.me, other: args.other }), + camelCasedName: () => intl.formatMessage({ id: 'camel-cased-name' }, {}), + groupByPage: { + title: () => intl.formatMessage({ id: 'group-by-page.title' }, {}), + }, + }; +} +``` + +Note that ids keep the filename as written, while the look-up-table keys are camelCased: `camel-cased-name_en.txt` is reached as `intl.camelCasedName()`. + +Wire it up once with the compiled bundle: + +```typescript +import { createIntl } from '@formatjs/intl'; +import messages from './intl/compiled/bundle_nb.compiled.json'; +import { createIntlLUT } from './intl/compiled/lut'; + +const intl = createIntlLUT( + createIntl({ + locale: 'nb', + defaultLocale: 'nb', + messages, + timeZone: 'Europe/Oslo', + }), +); + +intl.groupByPage.title(); +intl.argument({ me: 'Alice', other: 'Bob' }); +``` + +Argument types follow the ICU message: `{count, plural, ...}` becomes `number`, `{when, date, ::ddMMM}` becomes `Date`, `{kind, select, A {..} B {..}}` becomes `'A' | 'B' | 'other' | string`, and a tag such as `

` becomes a `FormatXMLElementFn` you can pass a renderer for. + ### Validate: check if all files are present for all locales ```shell @@ -120,6 +202,8 @@ Options: -h, --help display help for command ``` +Exits with an error and lists the missing ids per locale. `build --strict` and `watch --strict` run the same check before bundling. + ### Fix: create missing files ```shell @@ -133,3 +217,5 @@ Arguments: Options: -h, --help display help for command ``` + +Creates the missing files with the placeholder content `[] TODO`, ready to be translated. From da084caffafe53ac9fceb17a4431fc55bab13851 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:18:13 +0200 Subject: [PATCH 18/19] chore(changeset): release as major The package now requires node >= 22.12 and stops supporting node 20, which commander 15 forces and the engines field enforces. That is what makes this a major; the reordering of generated files is invisible to a consumer that gitignores them. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/quiet-lions-listen.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.changeset/quiet-lions-listen.md b/.changeset/quiet-lions-listen.md index a2a770c..d90f430 100644 --- a/.changeset/quiet-lions-listen.md +++ b/.changeset/quiet-lions-listen.md @@ -1,11 +1,11 @@ --- -'@code-obos/i18n-tools': minor +'@code-obos/i18n-tools': major --- -Oppdaterer alle avhengigheter til siste major. +Oppdaterer alle avhengigheter til siste major, og gjør generert output deterministisk. -WHAT: chokidar 4 -> 5, commander 14 -> 15, @formatjs/cli-lib 8 -> 9, vitest 4 -> 5, typescript 5 -> 7, husky 8 -> 9, lint-staged 13 -> 17, @changesets/cli 2 -> 3, samt patch-bump av resten. Legger i tillegg til tester for CLI-parsing, watch-kommandoen og chokidar sitt API. +WHAT: chokidar 4 -> 5, commander 14 -> 15, @formatjs/cli-lib 8 -> 9, vitest 4 -> 5, typescript 5 -> 7, husky 8 -> 9, lint-staged 13 -> 17, @changesets/cli 2 -> 3, samt patch-bump av resten. `@formatjs/cli-lib` er flyttet til devDependencies siden den bare brukes som type, og `json-stable-stringify` er deklarert eksplisitt fordi den faktisk brukes i runtime. Meldinger sorteres nå etter id før bundling, `--ast` kombinert med `-f script` gir en forklarende feilmelding i stedet for en JSON-parsefeil, build og watch deler opsjonsdefinisjonene sine, og WARN-logglinjen er faktisk gul (fargekoden startet med \x0b i stedet for \x1b, så terminaler skrev ut `[33m` som tekst). I tillegg tester for CLI-parsing, watch-kommandoen, chokidar sitt API og sorteringen. -WHY: Utdaterte pakker, og ingen tester dekket CLI-laget der commander og chokidar faktisk brukes. +WHY: Utdaterte pakker. Major fordi pakken nå krever node >= 22.12 og dermed slutter å støtte node 20: commander 15 krever det, og `engines` håndhever det. Rekkefølgen i `bundle_.json` og `lut.ts` fulgte tidligere rekkefølgen filsystemet ga ut katalogoppføringer i, som er sortert på macOS men vilkårlig på ext4. Samme meldinger kunne dermed gi ulike filer på en utviklermaskin og i CI. -HOW: Ingen endring i generert output - snapshottestene for lut.ts og de kompilerte bundlene er uendret. Merk at commander 15 krever node >= 22.12. +HOW: Sorteringen endrer rekkefølgen, ikke innholdet - verifisert mot 1268 meldingsfiler i nybolig-nettsider: identisk nøkkelsett, identiske verdier, og `bundle_.compiled.json` er bit-identisk. Konsumenter som gitignorerer generert output og regenererer den i et predev-steg, slik nybolig-nettsider gjør, merker ingen forskjell. Konsumenter som committer den, får en engangsomstokking til sortert rekkefølge. README er skrevet om: separatoren i eksemplene var fortsatt `/` fra før 4.0.0, og navnekonvensjonen for meldingsfiler og bruken av `createIntlLUT` var udokumentert. From af3810957e838814cc58ad79fa2bdde840827820 Mon Sep 17 00:00:00 2001 From: Mortefal Date: Mon, 7 Sep 2026 19:23:35 +0200 Subject: [PATCH 19/19] updaet codeowners --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 50bc6be..296d1ce 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @code-obos/boligjakt +* @code-obos/team-boligdrom