diff --git a/.changeset/eighty-parrots-grab.md b/.changeset/eighty-parrots-grab.md new file mode 100644 index 000000000..029a4f2d0 --- /dev/null +++ b/.changeset/eighty-parrots-grab.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +Updates the Paraglide JS addon to setup v2 of Paraglide JS. \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 78e64e810..2044f9638 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm lint @@ -33,7 +33,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm build @@ -48,7 +48,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm exec playwright install chromium diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5600b34a8..d55093018 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20 cache: pnpm - name: Install diff --git a/.github/workflows/update-template-repo.yml b/.github/workflows/update-template-repo.yml index 2ff5d33ec..d6877bf61 100644 --- a/.github/workflows/update-template-repo.yml +++ b/.github/workflows/update-template-repo.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20 cache: pnpm - name: Install diff --git a/package.json b/package.json index b10313746..433fd18c7 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@sveltejs/eslint-config": "^8.1.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@types/node": "^22.10.2", - "@vitest/ui": "^3.0.3", + "@vitest/ui": "^3.0.5", "eslint": "^9.17.0", "magic-string": "^0.30.15", "prettier": "^3.4.2", diff --git a/packages/addons/paraglide/index.ts b/packages/addons/paraglide/index.ts index ad9e7d601..822b30a7e 100644 --- a/packages/addons/paraglide/index.ts +++ b/packages/addons/paraglide/index.ts @@ -1,5 +1,5 @@ import MagicString from 'magic-string'; -import { colors, dedent, defineAddon, defineAddonOptions, log, utils } from '@sveltejs/cli-core'; +import { colors, defineAddon, defineAddonOptions, log } from '@sveltejs/cli-core'; import { array, common, @@ -17,16 +17,11 @@ import { addToDemoPage } from '../common.ts'; const DEFAULT_INLANG_PROJECT = { $schema: 'https://inlang.com/schema/project-settings', modules: [ - 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@1/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-identical-pattern@1/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@1/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@1/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-valid-js-identifier@1/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@2/dist/index.js', - 'https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@0/dist/index.js' + 'https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js' ], 'plugin.inlang.messageFormat': { - pathPattern: './messages/{languageTag}.json' + pathPattern: './messages/{locale}.json' } }; @@ -34,7 +29,7 @@ const options = defineAddonOptions({ availableLanguageTags: { question: `Which languages would you like to support? ${colors.gray('(e.g. en,de-ch)')}`, type: 'string', - default: 'en', + default: 'en, es', validate(input) { const { invalidLanguageTags, validLanguageTags } = parseLanguageTagInput(input); @@ -62,18 +57,18 @@ const options = defineAddonOptions({ export default defineAddon({ id: 'paraglide', shortDescription: 'i18n', - homepage: 'https://inlang.com', + homepage: 'https://inlang.com/m/gerre34r/library-inlang-paraglideJs', options, setup: ({ kit, unsupported }) => { if (!kit) unsupported('Requires SvelteKit'); }, - run: ({ sv, options, typescript, kit, dependencyVersion }) => { + run: ({ sv, options, typescript, kit }) => { const ext = typescript ? 'ts' : 'js'; if (!kit) throw new Error('SvelteKit is required'); const paraglideOutDir = 'src/lib/paraglide'; - sv.dependency('@inlang/paraglide-sveltekit', '^0.15.5'); + sv.dependency('@inlang/paraglide-js', '^2.0.0'); sv.file('project.inlang/settings.json', (content) => { if (content) return content; @@ -84,10 +79,10 @@ export default defineAddon({ data[key] = DEFAULT_INLANG_PROJECT[key as keyof typeof DEFAULT_INLANG_PROJECT]; } const { validLanguageTags } = parseLanguageTagInput(options.availableLanguageTags); - const sourceLanguageTag = validLanguageTags[0]; + const baseLocale = validLanguageTags[0]; - data.sourceLanguageTag = sourceLanguageTag; - data.languageTags = validLanguageTags; + data.baseLocale = baseLocale; + data.locales = validLanguageTags; return generateCode(); }); @@ -96,8 +91,8 @@ export default defineAddon({ sv.file(`vite.config.${ext}`, (content) => { const { ast, generateCode } = parseScript(content); - const vitePluginName = 'paraglide'; - imports.addNamed(ast, '@inlang/paraglide-sveltekit/vite', { paraglide: vitePluginName }); + const vitePluginName = 'paraglideVitePlugin'; + imports.addNamed(ast, '@inlang/paraglide-js', { paraglideVitePlugin: vitePluginName }); const { value: rootObject } = exports.defaultExport(ast, functions.call('defineConfig', [])); const param1 = functions.argumentByIndex(rootObject, 0, object.createEmpty()); @@ -114,31 +109,17 @@ export default defineAddon({ return generateCode(); }); - // src/lib/i18n file - sv.file(`src/lib/i18n.${ext}`, (content) => { - const { ast, generateCode } = parseScript(content); - - imports.addNamed(ast, '@inlang/paraglide-sveltekit', { createI18n: 'createI18n' }); - imports.addDefault(ast, '$lib/paraglide/runtime', '* as runtime'); - - const createI18nExpression = common.expressionFromString('createI18n(runtime)'); - const i18n = variables.declaration(ast, 'const', 'i18n', createI18nExpression); - - const existingExport = exports.namedExport(ast, 'i18n', i18n); - if (existingExport.declaration !== i18n) { - log.warn('Setting up $lib/i18n failed because it already exports an i18n function'); - } - - return generateCode(); - }); - // reroute hook sv.file(`src/hooks.${ext}`, (content) => { const { ast, generateCode } = parseScript(content); - imports.addNamed(ast, '$lib/i18n', { i18n: 'i18n' }); + imports.addNamed(ast, '$lib/paraglide/runtime', { + deLocalizeUrl: 'deLocalizeUrl' + }); - const expression = common.expressionFromString('i18n.reroute()'); + const expression = common.expressionFromString( + '(request) => deLocalizeUrl(request.url).pathname' + ); const rerouteIdentifier = variables.declaration(ast, 'const', 'reroute', expression); const existingExport = exports.namedExport(ast, 'reroute', rerouteIdentifier); @@ -153,41 +134,21 @@ export default defineAddon({ sv.file(`src/hooks.server.${ext}`, (content) => { const { ast, generateCode } = parseScript(content); - imports.addNamed(ast, '$lib/i18n', { i18n: 'i18n' }); + imports.addNamed(ast, '$lib/paraglide/server', { + paraglideMiddleware: 'paraglideMiddleware' + }); - const hookHandleContent = 'i18n.handle()'; + const hookHandleContent = `({ event, resolve }) => paraglideMiddleware(event.request, ({ request, locale }) => { + event.request = request; + return resolve(event, { + transformPageChunk: ({ html }) => html.replace('%paraglide.lang%', locale) + }); + });`; kitJs.addHooksHandle(ast, typescript, 'handleParaglide', hookHandleContent); return generateCode(); }); - // add the component to the layout - sv.file(`${kit.routesDirectory}/+layout.svelte`, (content) => { - const { script, template, generateCode } = parseSvelte(content, { typescript }); - - const paraglideComponentName = 'ParaglideJS'; - imports.addNamed(script.ast, '@inlang/paraglide-sveltekit', { - [paraglideComponentName]: paraglideComponentName - }); - imports.addNamed(script.ast, '$lib/i18n', { i18n: 'i18n' }); - - if (template.source.length === 0) { - const svelteVersion = dependencyVersion('svelte'); - if (!svelteVersion) throw new Error('Failed to determine svelte version'); - - html.addSlot(script.ast, template.ast, svelteVersion); - } - - const templateCode = new MagicString(template.generateCode()); - if (!templateCode.original.includes('\n'); - templateCode.append('\n'); - } - - return generateCode({ script: script.generateCode(), template: templateCode.toString() }); - }); - // add the text-direction and lang attribute placeholders to app.html sv.file('src/app.html', (content) => { const { ast, generateCode } = parseHtml(content); @@ -204,8 +165,7 @@ export default defineAddon({ } htmlNode.attribs = { ...htmlNode.attribs, - lang: '%paraglide.lang%', - dir: '%paraglide.textDirection%' + lang: '%paraglide.lang%' }; return generateCode(); @@ -229,36 +189,14 @@ export default defineAddon({ sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => { const { script, template, generateCode } = parseSvelte(content, { typescript }); - imports.addDefault(script.ast, '$lib/paraglide/messages.js', '* as m'); + imports.addNamed(script.ast, '$lib/paraglide/messages.js', { m: 'm' }); imports.addNamed(script.ast, '$app/navigation', { goto: 'goto' }); imports.addNamed(script.ast, '$app/state', { page: 'page' }); - imports.addNamed(script.ast, '$lib/i18n', { i18n: 'i18n' }); - if (typescript) { - imports.addNamed( - script.ast, - '$lib/paraglide/runtime', - { AvailableLanguageTag: 'AvailableLanguageTag' }, - true - ); - } - - const [ts] = utils.createPrinter(typescript); + imports.addNamed(script.ast, '$lib/paraglide/runtime', { + setLocale: 'setLocale' + }); const scriptCode = new MagicString(script.generateCode()); - if (!scriptCode.original.includes('function switchToLanguage')) { - scriptCode.trim(); - scriptCode.append('\n\n'); - scriptCode.append(dedent` - ${ts('', '/**')} - ${ts('', '* @param {import("$lib/paraglide/runtime").AvailableLanguageTag} newLanguage')} - ${ts('', '*/')} - function switchToLanguage(newLanguage${ts(': AvailableLanguageTag')}) { - const canonicalPath = i18n.route(page.url.pathname); - const localisedPath = i18n.resolveRoute(canonicalPath, newLanguage); - goto(localisedPath); - } - `); - } const templateCode = new MagicString(template.source); @@ -271,11 +209,15 @@ export default defineAddon({ const links = validLanguageTags .map( (x) => - `${templateCode.getIndentString()}` + `${templateCode.getIndentString()}` ) .join('\n'); templateCode.append(`
\n${links}\n
`); + templateCode.append( + '

\nIf you use VSCode, install the Sherlock i18n extension for a better i18n experience.\n

' + ); + return generateCode({ script: scriptCode.toString(), template: templateCode.toString() }); }); } @@ -286,17 +228,13 @@ export default defineAddon({ const { data, generateCode } = parseJson(content); data['$schema'] = 'https://inlang.com/schema/inlang-message-format'; data.hello_world = `Hello, {name} from ${languageTag}!`; - return generateCode(); }); } }, nextSteps: ({ highlighter }) => { - const steps = [ - `Edit your messages in ${highlighter.path('messages/en.json')}`, - 'Consider installing the Sherlock IDE Extension' - ]; + const steps = [`Edit your messages in ${highlighter.path('messages/en.json')}`]; if (options.demo) { steps.push(`Visit ${highlighter.route('/demo/paraglide')} route to view the demo`); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8fab2796a..d0c4da2f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: ^22.10.2 version: 22.10.2 '@vitest/ui': - specifier: ^3.0.3 - version: 3.0.3(vitest@3.0.5) + specifier: ^3.0.5 + version: 3.0.9(vitest@3.0.5) eslint: specifier: ^9.17.0 version: 9.17.0 @@ -64,7 +64,7 @@ importers: version: 0.8.3(rollup@4.34.5)(typescript@5.7.2) vitest: specifier: ^3.0.5 - version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5)) + version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.9) community-addon-template: dependencies: @@ -80,7 +80,7 @@ importers: version: link:../packages/cli vitest: specifier: ^3.0.5 - version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5)) + version: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.9) packages/addons: dependencies: @@ -973,12 +973,12 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.3': - resolution: {integrity: sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==} - '@vitest/pretty-format@3.0.5': resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + '@vitest/pretty-format@3.0.9': + resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} + '@vitest/runner@3.0.5': resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} @@ -988,17 +988,17 @@ packages: '@vitest/spy@3.0.5': resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} - '@vitest/ui@3.0.3': - resolution: {integrity: sha512-kGavHxFA3dETa61mgzdvxc3u/JSCiHR2o/0Z99IE8EAwtFxSLZeb2MofPKNVCPY3IAIcTx4blH57BJ1GuiRAUA==} + '@vitest/ui@3.0.9': + resolution: {integrity: sha512-FpZD4aIv/qNpwkV3XbLV6xldWFHMgoNWAJEgg5GmpObmAOLAErpYjew9dDwXdYdKOS3iZRKdwI+P3JOJcYeUBg==} peerDependencies: - vitest: 3.0.3 - - '@vitest/utils@3.0.3': - resolution: {integrity: sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==} + vitest: 3.0.9 '@vitest/utils@3.0.5': resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@vitest/utils@3.0.9': + resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1445,6 +1445,9 @@ packages: flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -1648,9 +1651,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -1797,6 +1797,9 @@ packages: pathe@2.0.2: resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -1988,8 +1991,8 @@ packages: silver-fleece@1.2.1: resolution: {integrity: sha512-GwiBh7LzX4aKWb3LH1tPu8et2zZqe1cwXn+/uwIUK+H1Y2k119qpvPelVdRKG/6+RQvtUdRep4mBOOVf80VYDA==} - sirv@3.0.0: - resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} sisteransi@1.0.5: @@ -2132,6 +2135,10 @@ packages: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3047,11 +3054,11 @@ snapshots: optionalDependencies: vite: 6.1.0(@types/node@22.10.2) - '@vitest/pretty-format@3.0.3': + '@vitest/pretty-format@3.0.5': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.0.5': + '@vitest/pretty-format@3.0.9': dependencies: tinyrainbow: 2.0.0 @@ -3070,26 +3077,26 @@ snapshots: dependencies: tinyspy: 3.0.2 - '@vitest/ui@3.0.3(vitest@3.0.5)': + '@vitest/ui@3.0.9(vitest@3.0.5)': dependencies: - '@vitest/utils': 3.0.3 + '@vitest/utils': 3.0.9 fflate: 0.8.2 - flatted: 3.3.2 - pathe: 2.0.2 - sirv: 3.0.0 - tinyglobby: 0.2.10 + flatted: 3.3.3 + pathe: 2.0.3 + sirv: 3.0.1 + tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5)) + vitest: 3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.9) - '@vitest/utils@3.0.3': + '@vitest/utils@3.0.5': dependencies: - '@vitest/pretty-format': 3.0.3 - loupe: 3.1.2 + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 tinyrainbow: 2.0.0 - '@vitest/utils@3.0.5': + '@vitest/utils@3.0.9': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.0.9 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -3558,6 +3565,8 @@ snapshots: flatted@3.3.2: {} + flatted@3.3.3: {} + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -3739,8 +3748,6 @@ snapshots: lodash.startcase@4.4.0: {} - loupe@3.1.2: {} - loupe@3.1.3: {} lru-cache@10.4.3: {} @@ -3869,6 +3876,8 @@ snapshots: pathe@2.0.2: {} + pathe@2.0.3: {} + pathval@2.0.0: {} pause-stream@0.0.11: @@ -4048,7 +4057,7 @@ snapshots: silver-fleece@1.2.1: {} - sirv@3.0.0: + sirv@3.0.1: dependencies: '@polka/url': 1.0.0-next.28 mrmime: 2.0.0 @@ -4236,6 +4245,11 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -4347,7 +4361,7 @@ snapshots: '@types/node': 22.10.2 fsevents: 2.3.3 - vitest@3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.3(vitest@3.0.5)): + vitest@3.0.5(@types/node@22.10.2)(@vitest/ui@3.0.9): dependencies: '@vitest/expect': 3.0.5 '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.10.2)) @@ -4371,7 +4385,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.2 - '@vitest/ui': 3.0.3(vitest@3.0.5) + '@vitest/ui': 3.0.9(vitest@3.0.5) transitivePeerDependencies: - jiti - less