diff --git a/.changeset/nasty-towns-crash.md b/.changeset/nasty-towns-crash.md new file mode 100644 index 000000000..9e9f474d2 --- /dev/null +++ b/.changeset/nasty-towns-crash.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix(tailwindcss): add `@tailwindcss/oxide` to approve-builds in `pnpm` diff --git a/.changeset/solid-dragons-trade.md b/.changeset/solid-dragons-trade.md new file mode 100644 index 000000000..481b024ed --- /dev/null +++ b/.changeset/solid-dragons-trade.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat(cli): pnpm config will now be stored in `pnpm-workspace.yaml` (e.g. `onlyBuiltDependencies`) diff --git a/community-addon-template/tests/custom-addon.test.ts b/community-addon-template/tests/custom-addon.test.ts index 6fa77191b..8cc944167 100644 --- a/community-addon-template/tests/custom-addon.test.ts +++ b/community-addon-template/tests/custom-addon.test.ts @@ -4,25 +4,31 @@ import { fixture, setupTest } from './setup/suite.js'; import addon from '../src/index.js'; const id = addon.id; -const { test, variants, prepareServer } = setupTest({ [id]: addon }); +const { test, addonTestCases, prepareServer } = setupTest( + { [id]: addon }, + { kinds: [{ type: 'default', options: { [id]: { demo: true } } }] } +); -test.concurrent.for(variants)('demo - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { [id]: { demo: true } }); +test.concurrent.for(addonTestCases)( + 'community-addon $variant', + async (addonTestCase, { page, ...ctx }) => { + const cwd = ctx.cwd(addonTestCase); - // ...add files - if (variant.startsWith('kit')) { - const target = path.resolve(cwd, 'src', 'routes', '+page.svelte'); - fixture({ name: '+page.svelte', target }); - } else { - const target = path.resolve(cwd, 'src', 'App.svelte'); - fixture({ name: 'App.svelte', target }); - } + // ...add files + if (addonTestCase.variant.startsWith('kit')) { + const target = path.resolve(cwd, 'src', 'routes', '+page.svelte'); + fixture({ name: '+page.svelte', target }); + } else { + const target = path.resolve(cwd, 'src', 'App.svelte'); + fixture({ name: 'App.svelte', target }); + } - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(async () => await close()); - // expectations - const textContent = await page.getByTestId('demo').textContent(); - expect(textContent).toContain('This is a text file made by the Community Addon Template demo!'); -}); + // expectations + const textContent = await page.getByTestId('demo').textContent(); + expect(textContent).toContain('This is a text file made by the Community Addon Template demo!'); + } +); diff --git a/community-addon-template/tests/setup/global.ts b/community-addon-template/tests/setup/global.ts index 31b2ed100..a9cbb495c 100644 --- a/community-addon-template/tests/setup/global.ts +++ b/community-addon-template/tests/setup/global.ts @@ -2,8 +2,8 @@ import { fileURLToPath } from 'node:url'; import { setup, type ProjectVariant } from 'sv/testing'; import type { TestProject } from 'vitest/node'; -const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; const TEST_DIR = fileURLToPath(new URL('../../.test-output/', import.meta.url)); +const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; export default async function ({ provide }: TestProject) { // global setup (e.g. spin up docker containers) diff --git a/community-addon-template/tests/setup/suite.ts b/community-addon-template/tests/setup/suite.ts index 3b7c04138..962f3d776 100644 --- a/community-addon-template/tests/setup/suite.ts +++ b/community-addon-template/tests/setup/suite.ts @@ -4,13 +4,13 @@ import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; import { - addPnpmBuildDependencies, createProject, startPreview, + addPnpmBuildDependencies, type CreateProject, type ProjectVariant } from 'sv/testing'; -import { chromium, type Browser, type Page } from '@playwright/test'; +import { chromium, type Browser, type BrowserContext, type Page } from '@playwright/test'; import { fileURLToPath } from 'node:url'; const cwd = vitest.inject('testDir'); @@ -19,26 +19,52 @@ const variants = vitest.inject('variants'); const SETUP_DIR = fileURLToPath(new URL('.', import.meta.url)); -type Fixtures = { +type Fixtures = { page: Page; - run(variant: ProjectVariant, options: OptionMap): Promise; + cwd(addonTestCase: AddonTestCase): string; +}; + +type AddonTestCase = { + variant: ProjectVariant; + kind: { type: string; options: OptionMap }; }; -export function setupTest(addons: Addons) { +export function setupTest( + addons: Addons, + options?: { + kinds: Array['kind']>; + filter?: (addonTestCase: AddonTestCase) => boolean; + browser?: boolean; + } +) { + const test = vitest.test.extend({} as any); + + const withBrowser = options?.browser ?? true; + let create: CreateProject; let browser: Browser; - const test = vitest.test.extend>({} as any); - - vitest.beforeAll(async () => { - browser = await chromium.launch(); - return async () => { - await browser.close(); - }; - }); + if (withBrowser) { + vitest.beforeAll(async () => { + browser = await chromium.launch(); + return async () => { + await browser.close(); + }; + }); + } - vitest.beforeAll(({ name }) => { - const testName = path.parse(name).name.replace('.test', ''); + const addonTestCases: Array> = []; + for (const kind of options?.kinds ?? []) { + for (const variant of variants) { + const addonTestCase = { variant, kind }; + if (!options?.filter || options?.filter?.(addonTestCase)) { + addonTestCases.push(addonTestCase); + } + } + } + let testName: string; + vitest.beforeAll(async ({ name }) => { + testName = path.dirname(name).split('/').at(-1)!; // constructs a builder for create test projects create = createProject({ cwd, templatesDir, testName }); @@ -58,61 +84,79 @@ export function setupTest(addons: Addons) { private: true }) ); - }); - // runs before each test case - vitest.beforeEach>(async (ctx) => { - const browserCtx = await browser.newContext(); - ctx.page = await browserCtx.newPage(); - ctx.run = async (variant, options) => { - const cwd = create({ testId: ctx.task.id, variant }); + for (const { variant, kind } of addonTestCases) { + const cwd = create({ testId: `${kind.type}-${variant}`, variant }); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); - fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); + fs.writeFileSync(metaPath, JSON.stringify({ variant, kind }, null, '\t'), 'utf8'); - // run addon const { pnpmBuildDependencies } = await installAddon({ cwd, addons, - options, + options: kind.options, packageManager: 'pnpm' }); - addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + } + + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); + }); - return cwd; + // runs before each test case + vitest.beforeEach(async (ctx) => { + let browserCtx: BrowserContext; + if (withBrowser) { + browserCtx = await browser.newContext(); + ctx.page = await browserCtx.newPage(); + } + + ctx.cwd = (addonTestCase) => { + return path.join(cwd, testName, `${addonTestCase.kind.type}-${addonTestCase.variant}`); }; return async () => { - await browserCtx.close(); + if (withBrowser) { + await browserCtx.close(); + } // ...other tear downs }; }); - return { - test, - variants, - prepareServer - }; + return { test, addonTestCases, prepareServer }; } -/** - * Installs dependencies, builds the project, and spins up the preview server - */ -async function prepareServer({ cwd, page }: { cwd: string; page: Page }) { - // install deps - execSync('pnpm install --no-frozen-lockfile', { cwd, stdio: 'pipe' }); - - // ...do commands and any other extra stuff - +type PrepareServerOptions = { + cwd: string; + page: Page; + buildCommand?: string; + previewCommand?: string; +}; +// installs dependencies, builds the project, and spins up the preview server +async function prepareServer({ + cwd, + page, + buildCommand = 'pnpm build', + previewCommand = 'pnpm preview' +}: PrepareServerOptions) { // build project - execSync('npm run build', { cwd, stdio: 'pipe' }); + if (buildCommand) execSync(buildCommand, { cwd, stdio: 'pipe' }); + + // start preview server + const { url, close } = await startPreview({ cwd, command: previewCommand }); - // start preview server `vite preview` - const { url, close } = await startPreview({ cwd }); + // increases timeout as 30s is not always enough when running the full suite + page.setDefaultNavigationTimeout(60_000); - // navigate to the page - await page.goto(url); + try { + // navigate to the page + await page.goto(url); + } catch (e) { + // cleanup in the instance of a timeout + await close(); + throw e; + } return { url, close }; } diff --git a/package.json b/package.json index 9c62769fe..b8200df2c 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,5 @@ "typescript-eslint": "^8.34.1", "vitest": "4.0.0-beta.6" }, - "packageManager": "pnpm@10.4.1", - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild" - ] - } + "packageManager": "pnpm@10.17.0" } diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index d8d951488..cac333089 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -19,16 +19,25 @@ const variants = vitest.inject('variants'); export const execAsync = promisify(exec); -type Fixtures = { +type Fixtures = { page: Page; - run(variant: ProjectVariant, options: OptionMap): Promise; + cwd(addonTestCase: AddonTestCase): string; +}; + +type AddonTestCase = { + variant: ProjectVariant; + kind: { type: string; options: OptionMap }; }; export function setupTest( addons: Addons, - options?: { browser?: boolean } + options?: { + kinds: Array['kind']>; + filter?: (addonTestCase: AddonTestCase) => boolean; + browser?: boolean; + } ) { - const test = vitest.test.extend>({} as any); + const test = vitest.test.extend({} as any); const withBrowser = options?.browser ?? true; @@ -44,10 +53,20 @@ export function setupTest( }); } - vitest.beforeAll(({ name }) => { - const testName = path.dirname(name).split('/').at(-1)!; + const testCases: Array> = []; + for (const kind of options?.kinds ?? []) { + for (const variant of variants) { + const addonTestCase = { variant, kind }; + if (options?.filter === undefined || options.filter(addonTestCase)) { + testCases.push(addonTestCase); + } + } + } + let testName: string; + vitest.beforeAll(async ({ name }) => { + testName = path.dirname(name).split('/').at(-1)!; - // constructs a builder for create test projects + // constructs a builder to create test projects create = createProject({ cwd, templatesDir, testName }); // creates a pnpm workspace in each addon dir @@ -65,32 +84,36 @@ export function setupTest( private: true }) ); - }); - // runs before each test case - vitest.beforeEach>(async (ctx) => { - let browserCtx: BrowserContext; - if (withBrowser) { - browserCtx = await browser.newContext(); - ctx.page = await browserCtx.newPage(); - } - ctx.run = async (variant, options) => { - const cwd = create({ testId: ctx.task.id, variant }); + for (const { variant, kind } of testCases) { + const cwd = create({ testId: `${kind.type}-${variant}`, variant }); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); - fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); + fs.writeFileSync(metaPath, JSON.stringify({ variant, kind }, null, '\t'), 'utf8'); - // run addon const { pnpmBuildDependencies } = await installAddon({ cwd, addons, - options, + options: kind.options, packageManager: 'pnpm' }); - addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + } - return cwd; + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); + }); + + // runs before each test case + vitest.beforeEach(async (ctx) => { + let browserCtx: BrowserContext; + if (withBrowser) { + browserCtx = await browser.newContext(); + ctx.page = await browserCtx.newPage(); + } + + ctx.cwd = (addonTestCase) => { + return path.join(cwd, testName, `${addonTestCase.kind.type}-${addonTestCase.variant}`); }; return async () => { @@ -101,33 +124,22 @@ export function setupTest( }; }); - return { test, variants, prepareServer }; + return { test, testCases, prepareServer }; } type PrepareServerOptions = { cwd: string; page: Page; - previewCommand?: string; buildCommand?: string; - installCommand?: string; + previewCommand?: string; }; // installs dependencies, builds the project, and spins up the preview server -async function prepareServer( - { - cwd, - page, - previewCommand = 'npm run preview', - buildCommand = 'npm run build', - installCommand = 'pnpm install --no-frozen-lockfile' - }: PrepareServerOptions, - afterInstall?: () => Promise | any -) { - // install deps - if (installCommand) execSync(installCommand, { cwd, stdio: 'pipe' }); - - // ...do commands and any other extra stuff - await afterInstall?.(); - +async function prepareServer({ + cwd, + page, + buildCommand = 'pnpm build', + previewCommand = 'pnpm preview' +}: PrepareServerOptions) { // build project if (buildCommand) execSync(buildCommand, { cwd, stdio: 'pipe' }); diff --git a/packages/addons/_tests/all-addons/test.ts b/packages/addons/_tests/all-addons/test.ts index 2665a3cbc..20669b452 100644 --- a/packages/addons/_tests/all-addons/test.ts +++ b/packages/addons/_tests/all-addons/test.ts @@ -19,11 +19,13 @@ const defaultOptions = Object.values(officialAddons).reduce addonTestCase.variant.startsWith('kit') +}); -const kitOnly = variants.filter((v) => v.startsWith('kit')); -test.concurrent.for(kitOnly)('run all addons - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, defaultOptions); +test.concurrent.for(testCases)('run all addons - $variant', async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); const { close } = await prepareServer({ cwd, page }); // kill server process when we're done diff --git a/packages/addons/_tests/devtools-json/test.ts b/packages/addons/_tests/devtools-json/test.ts index 26bacca3a..10f8e3795 100644 --- a/packages/addons/_tests/devtools-json/test.ts +++ b/packages/addons/_tests/devtools-json/test.ts @@ -4,12 +4,15 @@ import devtoolsJson from '../../devtools-json/index.ts'; import fs from 'node:fs'; import path from 'node:path'; -const { test, variants } = setupTest({ devtoolsJson }, { browser: false }); +const { test, testCases } = setupTest( + { devtoolsJson }, + { kinds: [{ type: 'default', options: { devtoolsJson: {} } }], browser: false } +); -test.concurrent.for(variants)('default - %s', async (variant, ctx) => { - const cwd = await ctx.run(variant, { devtoolsJson: {} }); +test.concurrent.for(testCases)('devtools-json $variant', (testCase, ctx) => { + const cwd = ctx.cwd(testCase); - const ext = variant.includes('ts') ? 'ts' : 'js'; + const ext = testCase.variant.includes('ts') ? 'ts' : 'js'; const viteFile = path.resolve(cwd, `vite.config.${ext}`); const viteContent = fs.readFileSync(viteFile, 'utf8'); diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index f88f283bc..d4afdd0c0 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -9,11 +9,34 @@ import { setupTest } from '../_setup/suite.ts'; import drizzle from '../../drizzle/index.ts'; import { pageServer, pageComp } from './fixtures.ts'; -const { test, variants, prepareServer } = setupTest({ drizzle }); - // only linux is supported for running docker containers in github runners const noDocker = process.env.CI && process.platform !== 'linux'; +const { test, testCases, prepareServer } = setupTest( + { drizzle }, + { + kinds: [ + { + type: 'better-sqlite3', + options: { drizzle: { database: 'sqlite', sqlite: 'better-sqlite3' } } + }, + { + type: 'libsql', + options: { drizzle: { database: 'sqlite', sqlite: 'libsql' } } + }, + { + type: 'mysql2', + options: { drizzle: { database: 'mysql', mysql: 'mysql2', docker: true } } + }, + { + type: 'postgres.js', + options: { drizzle: { database: 'postgresql', postgresql: 'postgres.js', docker: true } } + } + ], + filter: (testCase) => testCase.variant.includes('kit') + } +); + beforeAll(() => { if (noDocker) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); @@ -29,24 +52,13 @@ beforeAll(() => { }; }); -const kitOnly = variants.filter((v) => v.includes('kit')); -const testCases = [ - { name: 'better-sqlite3', options: { database: 'sqlite', sqlite: 'better-sqlite3' } }, - { name: 'libsql', options: { database: 'sqlite', sqlite: 'libsql' } }, - { name: 'mysql2', options: { database: 'mysql', mysql: 'mysql2', docker: true } }, - { - name: 'postgres.js', - options: { database: 'postgresql', postgresql: 'postgres.js', docker: true } - } -].flatMap((opts) => kitOnly.map((variant) => ({ ...opts, variant }))); - test.concurrent.for(testCases)( - 'queries database - $name - $variant', - async ({ options, variant }, { page, ...ctx }) => { - if (options.docker && noDocker) ctx.skip(); - const cwd = await ctx.run(variant, { drizzle: options as any }); + 'drizzle $kind.type $variant', + async (testCase, { page, ...ctx }) => { + if (testCase.kind.options.drizzle.docker && noDocker) ctx.skip(); + const cwd = ctx.cwd(testCase); - const ts = variant === 'kit-ts'; + const ts = testCase.variant === 'kit-ts'; const drizzleConfig = path.resolve(cwd, `drizzle.config.${ts ? 'ts' : 'js'}`); const content = fs.readFileSync(drizzleConfig, 'utf8').replace(/strict: true[,\s]/, ''); fs.writeFileSync(drizzleConfig, content, 'utf8'); @@ -58,9 +70,9 @@ test.concurrent.for(testCases)( const pageServerPath = path.resolve(routes, `+page.server.${ts ? 'ts' : 'js'}`); fs.writeFileSync(pageServerPath, pageServer, 'utf8'); - const { close } = await prepareServer({ cwd, page }, () => { - execSync('npm run db:push', { cwd, stdio: 'pipe' }); - }); + execSync('npm run db:push', { cwd, stdio: 'pipe' }); + + const { close } = await prepareServer({ cwd, page }); // kill server process when we're done ctx.onTestFinished(async () => await close()); diff --git a/packages/addons/_tests/eslint/test.ts b/packages/addons/_tests/eslint/test.ts index aa0ad8c88..19cf69133 100644 --- a/packages/addons/_tests/eslint/test.ts +++ b/packages/addons/_tests/eslint/test.ts @@ -4,16 +4,17 @@ import { execSync } from 'node:child_process'; import { setupTest } from '../_setup/suite.ts'; import eslint from '../../eslint/index.ts'; -const { test, variants } = setupTest({ eslint }, { browser: false }); +const { test, testCases } = setupTest( + { eslint }, + { kinds: [{ type: 'default', options: { eslint: {} } }], browser: false } +); -test.concurrent.for(variants)('core - %s', async (variant, { expect, ...ctx }) => { - const cwd = await ctx.run(variant, { eslint: {} }); +test.concurrent.for(testCases)('eslint $variant', (testCase, { expect, ...ctx }) => { + const cwd = ctx.cwd(testCase); const unlintedFile = 'let foo = "";\nif (Boolean(foo)) {\n//\n}'; fs.writeFileSync(path.resolve(cwd, 'src/lib/foo.js'), unlintedFile, 'utf8'); - expect(() => execSync('pnpm install', { cwd, stdio: 'pipe' })).not.toThrow(); - expect(() => execSync('pnpm lint', { cwd, stdio: 'pipe' })).toThrow(); expect(() => execSync('pnpm eslint --fix .', { cwd, stdio: 'pipe' })).not.toThrow(); diff --git a/packages/addons/_tests/lucia/test.ts b/packages/addons/_tests/lucia/test.ts index c95ac959f..eff0e1b04 100644 --- a/packages/addons/_tests/lucia/test.ts +++ b/packages/addons/_tests/lucia/test.ts @@ -2,19 +2,31 @@ import { expect } from '@playwright/test'; import { setupTest } from '../_setup/suite.ts'; import lucia from '../../lucia/index.ts'; import drizzle from '../../drizzle/index.ts'; +import path from 'node:path'; +import fs from 'node:fs'; -const { test, variants, prepareServer } = setupTest({ drizzle, lucia }); +const { test, testCases, prepareServer } = setupTest( + { drizzle, lucia }, + { + kinds: [ + { + type: 'default', + options: { drizzle: { database: 'sqlite', sqlite: 'libsql' }, lucia: { demo: true } } + } + ], + filter: (addonTestCase) => addonTestCase.variant.includes('kit') + } +); -const kitOnly = variants.filter((v) => v.includes('kit')); -test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { - drizzle: { database: 'sqlite', sqlite: 'libsql' }, - lucia: { demo: true } - }); +test.concurrent.for(testCases)('lucia $variant', async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); const { close } = await prepareServer({ cwd, page }); // kill server process when we're done ctx.onTestFinished(async () => await close()); - expect(true).toBe(true); + const ext = testCase.variant.includes('ts') ? 'ts' : 'js'; + const filePath = path.resolve(cwd, `src/routes/demo/lucia/+page.server.${ext}`); + const fileContent = fs.readFileSync(filePath, 'utf8'); + expect(fileContent).toContain(`export const actions`); }); diff --git a/packages/addons/_tests/mdsvex/test.ts b/packages/addons/_tests/mdsvex/test.ts index 630fb6d97..07c7a0ecd 100644 --- a/packages/addons/_tests/mdsvex/test.ts +++ b/packages/addons/_tests/mdsvex/test.ts @@ -8,13 +8,16 @@ import { setupTest } from '../_setup/suite.ts'; import { svxFile } from './fixtures.ts'; import mdsvex from '../../mdsvex/index.ts'; -const { test, variants, prepareServer } = setupTest({ mdsvex }); +const { test, testCases, prepareServer } = setupTest( + { mdsvex }, + { kinds: [{ type: 'default', options: { mdsvex: {} } }] } +); -test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { mdsvex: {} }); +test.concurrent.for(testCases)('mdsvex $variant', async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); // ...add test files - addFixture(cwd, variant); + addFixture(cwd, testCase.variant); const { close } = await prepareServer({ cwd, page }); // kill server process when we're done diff --git a/packages/addons/_tests/paraglide/test.ts b/packages/addons/_tests/paraglide/test.ts index 67c68eff9..37eb5c07a 100644 --- a/packages/addons/_tests/paraglide/test.ts +++ b/packages/addons/_tests/paraglide/test.ts @@ -1,16 +1,31 @@ import { expect } from '@playwright/test'; import { setupTest } from '../_setup/suite.ts'; import paraglide from '../../paraglide/index.ts'; +import fs from 'node:fs'; +import path from 'node:path'; -const { test, variants, prepareServer } = setupTest({ paraglide }); +const langs = ['en', 'fr', 'hu']; -const kitOnly = variants.filter((v) => v.includes('kit')); -test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { paraglide: { demo: true, languageTags: 'en' } }); +const { test, testCases, prepareServer } = setupTest( + { paraglide }, + { + kinds: [ + { type: 'default', options: { paraglide: { demo: true, languageTags: langs.join(',') } } } + ], + filter: (addonTestCase) => addonTestCase.variant.includes('kit') + } +); + +test.concurrent.for(testCases)('paraglide $variant', async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); const { close } = await prepareServer({ cwd, page }); // kill server process when we're done ctx.onTestFinished(async () => await close()); - expect(true).toBe(true); + for (const lang of langs) { + const filePath = path.resolve(cwd, `src/lib/paraglide/messages/${lang}.js`); + const fileContent = fs.readFileSync(filePath, 'utf8'); + expect(fileContent).toContain(`hello_world`); + } }); diff --git a/packages/addons/_tests/playwright/test.ts b/packages/addons/_tests/playwright/test.ts index f47720023..a9a8ad0bf 100644 --- a/packages/addons/_tests/playwright/test.ts +++ b/packages/addons/_tests/playwright/test.ts @@ -3,12 +3,15 @@ import path from 'node:path'; import { setupTest } from '../_setup/suite.ts'; import playwright from '../../playwright/index.ts'; -const { test, variants } = setupTest({ playwright }, { browser: false }); +const { test, testCases } = setupTest( + { playwright }, + { kinds: [{ type: 'default', options: { playwright: {} } }], browser: false } +); -test.concurrent.for(variants)('core - %s', async (variant, { expect, ...ctx }) => { - const cwd = await ctx.run(variant, { playwright: {} }); +test.concurrent.for(testCases)('playwright $variant', (testCase, { expect, ...ctx }) => { + const cwd = ctx.cwd(testCase); - const ext = variant.includes('ts') ? 'ts' : 'js'; + const ext = testCase.variant.includes('ts') ? 'ts' : 'js'; const playwrightConfig = path.resolve(cwd, `playwright.config.${ext}`); const configContent = fs.readFileSync(playwrightConfig, 'utf8'); diff --git a/packages/addons/_tests/prettier/test.ts b/packages/addons/_tests/prettier/test.ts index 26435367f..fe83d5d66 100644 --- a/packages/addons/_tests/prettier/test.ts +++ b/packages/addons/_tests/prettier/test.ts @@ -4,16 +4,17 @@ import { execSync } from 'node:child_process'; import { setupTest } from '../_setup/suite.ts'; import prettier from '../../prettier/index.ts'; -const { test, variants } = setupTest({ prettier }, { browser: false }); +const { test, testCases } = setupTest( + { prettier }, + { kinds: [{ type: 'default', options: { prettier: {} } }], browser: false } +); -test.concurrent.for(variants)('core - %s', async (variant, { expect, ...ctx }) => { - const cwd = await ctx.run(variant, { prettier: {} }); +test.concurrent.for(testCases)('prettier $variant', (testCase, { expect, ...ctx }) => { + const cwd = ctx.cwd(testCase); const unformattedFile = 'const foo = "bar"'; fs.writeFileSync(path.resolve(cwd, 'src/lib/foo.js'), unformattedFile, 'utf8'); - expect(() => execSync('pnpm install', { cwd, stdio: 'pipe' })).not.toThrow(); - expect(() => execSync('pnpm lint', { cwd, stdio: 'pipe' })).toThrow(); expect(() => execSync('pnpm format', { cwd, stdio: 'pipe' })).not.toThrow(); diff --git a/packages/addons/_tests/storybook/test.ts b/packages/addons/_tests/storybook/test.ts index 2c5878b5f..01b14ad46 100644 --- a/packages/addons/_tests/storybook/test.ts +++ b/packages/addons/_tests/storybook/test.ts @@ -7,7 +7,10 @@ import storybook from '../../storybook/index.ts'; import eslint from '../../eslint/index.ts'; // we're including the `eslint` add-on to prevent `storybook` from modifying this repo's `eslint.config.js` -const { test, variants, prepareServer } = setupTest({ storybook, eslint }); +const { test, testCases, prepareServer } = setupTest( + { storybook, eslint }, + { kinds: [{ type: 'default', options: { storybook: {}, eslint: {} } }] } +); let port = 6006; const CI = Boolean(process.env.CI); @@ -19,11 +22,11 @@ beforeAll(() => { } }); -test.for(variants)( - 'storybook loaded - %s', +test.for(testCases)( + 'storybook $variant', { concurrent: !CI }, - async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { storybook: {}, eslint: {} }); + async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); const { close } = await prepareServer({ cwd, diff --git a/packages/addons/_tests/sveltekit-adapter/test.ts b/packages/addons/_tests/sveltekit-adapter/test.ts index 9534e65a6..b11a8fd76 100644 --- a/packages/addons/_tests/sveltekit-adapter/test.ts +++ b/packages/addons/_tests/sveltekit-adapter/test.ts @@ -5,31 +5,36 @@ import sveltekitAdapter from '../../sveltekit-adapter/index.ts'; import { setupTest } from '../_setup/suite.ts'; const addonId = sveltekitAdapter.id; -const { test, variants, prepareServer } = setupTest({ [addonId]: sveltekitAdapter }); +const { test, testCases, prepareServer } = setupTest( + { [addonId]: sveltekitAdapter }, + { + kinds: [ + { type: 'node', options: { [addonId]: { adapter: 'node' } } }, + { type: 'auto', options: { [addonId]: { adapter: 'auto' } } } + ], + filter: (addonTestCase) => addonTestCase.variant.includes('kit') + } +); -const kitOnly = variants.filter((v) => v.includes('kit')); -test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { [addonId]: { adapter: 'node' } }); +test.concurrent.for(testCases)( + 'adapter $kind.type $variant', + async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(async () => await close()); - expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch('adapter-auto'); - expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch( - 'adapter-auto only supports some environments' - ); -}); - -test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { [addonId]: { adapter: 'auto' } }); - - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); - - expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch('adapter-auto'); - expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch( - 'adapter-auto only supports some environments' - ); -}); + if (testCase.kind.type === 'node') { + expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch('adapter-auto'); + expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch( + 'adapter-auto only supports some environments' + ); + } else if (testCase.kind.type === 'auto') { + expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch('adapter-auto'); + expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch( + 'adapter-auto only supports some environments' + ); + } + } +); diff --git a/packages/addons/_tests/tailwindcss/test.ts b/packages/addons/_tests/tailwindcss/test.ts index 9025e297f..3d49e19af 100644 --- a/packages/addons/_tests/tailwindcss/test.ts +++ b/packages/addons/_tests/tailwindcss/test.ts @@ -3,38 +3,40 @@ import { setupTest } from '../_setup/suite.ts'; import { addFixture } from './fixtures.ts'; import tailwindcss from '../../tailwindcss/index.ts'; -const { test, variants, prepareServer } = setupTest({ tailwindcss }); - -test.concurrent.for(variants)('none - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { tailwindcss: { plugins: [] } }); - - // ...add test files - addFixture(cwd, variant); - - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); - - const el = page.getByTestId('base'); - await expect(el).toHaveCSS('background-color', 'oklch(0.446 0.043 257.281)'); - await expect(el).toHaveCSS('border-color', 'oklch(0.985 0.002 247.839)'); - await expect(el).toHaveCSS('border-width', '4px'); - await expect(el).toHaveCSS('margin-top', '4px'); -}); - -test.concurrent.for(variants)('typography - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { tailwindcss: { plugins: ['typography'] } }); - - // ...add files - addFixture(cwd, variant); - - const { close } = await prepareServer({ cwd, page }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); - - const el = page.getByTestId('typography'); - await expect(el).toHaveCSS('font-size', '18px'); - await expect(el).toHaveCSS('line-height', '28px'); - await expect(el).toHaveCSS('text-align', 'right'); - await expect(el).toHaveCSS('text-decoration-line', 'line-through'); -}); +const { test, prepareServer, testCases } = setupTest( + { tailwindcss }, + { + kinds: [ + { type: 'none', options: { tailwindcss: { plugins: [] } } }, + { type: 'typography', options: { tailwindcss: { plugins: ['typography'] } } } + ] + } +); + +test.concurrent.for(testCases)( + 'tailwindcss $kind.type $variant', + async (testCase, { page, ...ctx }) => { + const cwd = ctx.cwd(testCase); + + // ...add test files + addFixture(cwd, testCase.variant); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(async () => await close()); + + if (testCase.kind.type === 'none') { + const el = page.getByTestId('base'); + await expect(el).toHaveCSS('background-color', 'oklch(0.446 0.043 257.281)'); + await expect(el).toHaveCSS('border-color', 'oklch(0.985 0.002 247.839)'); + await expect(el).toHaveCSS('border-width', '4px'); + await expect(el).toHaveCSS('margin-top', '4px'); + } else if (testCase.kind.type === 'typography') { + const el = page.getByTestId('typography'); + await expect(el).toHaveCSS('font-size', '18px'); + await expect(el).toHaveCSS('line-height', '28px'); + await expect(el).toHaveCSS('text-align', 'right'); + await expect(el).toHaveCSS('text-decoration-line', 'line-through'); + } + } +); diff --git a/packages/addons/_tests/vitest/test.ts b/packages/addons/_tests/vitest/test.ts index f90208f66..9db2f0fbf 100644 --- a/packages/addons/_tests/vitest/test.ts +++ b/packages/addons/_tests/vitest/test.ts @@ -4,10 +4,13 @@ import vitest from '../../vitest-addon/index.ts'; import path from 'node:path'; import fs from 'node:fs'; -const { test, variants } = setupTest({ vitest }, { browser: false }); +const { test, testCases } = setupTest( + { vitest }, + { kinds: [{ type: 'default', options: { vitest: {} } }], browser: false } +); -test.concurrent.for(variants)('core - %s', async (variant, { expect, ...ctx }) => { - const cwd = await ctx.run(variant, { vitest: {} }); +test.concurrent.for(testCases)('vitest $variant', (testCase, { expect, ...ctx }) => { + const cwd = ctx.cwd(testCase); expect(() => execSync('pnpm install', { cwd, stdio: 'pipe' })).not.toThrow(); @@ -15,7 +18,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { expect, ...ctx }) = expect(() => execSync('pnpm test', { cwd, stdio: 'pipe' })).not.toThrow(); - const ext = variant.includes('ts') ? 'ts' : 'js'; + const ext = testCase.variant.includes('ts') ? 'ts' : 'js'; const viteFile = path.resolve(cwd, `vite.config.${ext}`); const viteContent = fs.readFileSync(viteFile, 'utf8'); diff --git a/packages/addons/tailwindcss/index.ts b/packages/addons/tailwindcss/index.ts index 1b3c621f7..f6e04d5c3 100644 --- a/packages/addons/tailwindcss/index.ts +++ b/packages/addons/tailwindcss/index.ts @@ -37,6 +37,7 @@ export default defineAddon({ sv.devDependency('tailwindcss', '^4.1.13'); sv.devDependency('@tailwindcss/vite', '^4.1.13'); + sv.pnpmBuildDependency('@tailwindcss/oxide'); if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.14'); diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 21fa3c547..89d336098 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -560,7 +560,7 @@ export async function runAddCommand( if (packageManager) { workspace.packageManager = packageManager; - addPnpmBuildDependencies(workspace.cwd, packageManager, [ + await addPnpmBuildDependencies(workspace.cwd, packageManager, [ 'esbuild', ...addonPnpmBuildDependencies ]); diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts index cf39b4ff0..06533b46f 100644 --- a/packages/cli/commands/create.ts +++ b/packages/cli/commands/create.ts @@ -204,7 +204,7 @@ async function createProject(cwd: ProjectPath, options: Options) { const installDeps = async (install: true | AgentName) => { packageManager = install === true ? await packageManagerPrompt(projectPath) : install; - addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']); + await addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']); if (packageManager) await installDependencies(packageManager, projectPath); }; diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index dc6173f15..a63ccbfec 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -12,7 +12,8 @@ import { detect, type AgentName } from 'package-manager-detector'; -import { parseJson } from '@sveltejs/cli-core/parsers'; +import { parseJson, parseYaml } from '@sveltejs/cli-core/parsers'; +import { isVersionUnsupportedBelow } from '@sveltejs/cli-core'; export const AGENT_NAMES: AgentName[] = AGENTS.filter( (agent): agent is AgentName => !agent.includes('@') @@ -57,19 +58,16 @@ export async function installDependencies(agent: AgentName, cwd: string): Promis try { const { command, args } = constructCommand(COMMANDS[agent].install, [])!; + const proc = exec(command, args, { nodeOptions: { cwd, stdio: 'pipe' }, throwOnError: true }); - proc.process?.stdout?.on('data', (data) => { - task.message(data.toString(), { raw: true }); - }); - proc.process?.stderr?.on('data', (data) => { - task.message(data.toString(), { raw: true }); - }); - - await proc; + for await (const line of proc) { + // line will be from stderr/stdout in the order you'd see it in a term + task.message(line, { raw: true }); + } task.success('Successfully installed dependencies'); } catch { @@ -89,35 +87,68 @@ export function getUserAgent(): AgentName | undefined { return AGENTS.includes(name) ? name : undefined; } -export function addPnpmBuildDependencies( +export async function addPnpmBuildDependencies( cwd: string, packageManager: AgentName | null | undefined, allowedPackages: string[] -): void { +): Promise { // other package managers are currently not affected by this change - if (!packageManager || packageManager !== 'pnpm') return; + if (!packageManager || packageManager !== 'pnpm' || allowedPackages.length === 0) return; + + let confIn: 'package.json' | 'pnpm-workspace.yaml' = 'package.json'; + const pnpmVersion = await getPnpmVersion(); + if (pnpmVersion) { + confIn = isVersionUnsupportedBelow(pnpmVersion, '10.5') + ? 'package.json' + : 'pnpm-workspace.yaml'; + } // find the workspace root (if present) - const pnpmWorkspacePath = find.up('pnpm-workspace.yaml', { cwd }); - let packageDirectory; - - if (pnpmWorkspacePath) packageDirectory = path.dirname(pnpmWorkspacePath); - else packageDirectory = cwd; - - // load the package.json - const pkgPath = path.join(packageDirectory, 'package.json'); - const content = fs.readFileSync(pkgPath, 'utf-8'); - const { data, generateCode } = parseJson(content); - - // add the packages where we install scripts should be executed - data.pnpm ??= {}; - data.pnpm.onlyBuiltDependencies ??= []; - for (const allowedPackage of allowedPackages) { - if (data.pnpm.onlyBuiltDependencies.includes(allowedPackage)) continue; - data.pnpm.onlyBuiltDependencies.push(allowedPackage); + const found = find.up('pnpm-workspace.yaml', { cwd }); + + if (confIn === 'pnpm-workspace.yaml') { + const content = found ? fs.readFileSync(found, 'utf-8') : ''; + const { data, generateCode } = parseYaml(content); + + const onlyBuiltDependencies = data.get('onlyBuiltDependencies'); + const items: Array<{ value: string } | string> = onlyBuiltDependencies?.items ?? []; + + for (const item of allowedPackages) { + if (items.includes(item)) continue; + if (items.some((y) => typeof y === 'object' && y.value === item)) continue; + items.push(item); + } + data.set('onlyBuiltDependencies', items); + + const newContent = generateCode(); + const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); + if (newContent !== content) fs.writeFileSync(pnpmWorkspacePath, newContent, 'utf-8'); + } else { + // else is package.json (fallback) + const rootDir = found ? path.dirname(found) : cwd; + const pkgPath = path.join(rootDir, 'package.json'); + const content = fs.readFileSync(pkgPath, 'utf-8'); + const { data, generateCode } = parseJson(content); + + // add the packages where we install scripts should be executed + data.pnpm ??= {}; + data.pnpm.onlyBuiltDependencies ??= []; + for (const allowedPackage of allowedPackages) { + if (data.pnpm.onlyBuiltDependencies.includes(allowedPackage)) continue; + data.pnpm.onlyBuiltDependencies.push(allowedPackage); + } + + // save the updated package.json + const newContent = generateCode(); + if (newContent !== content) fs.writeFileSync(pkgPath, newContent, 'utf-8'); } +} - // save the updated package.json - const newContent = generateCode(); - fs.writeFileSync(pkgPath, newContent); +async function getPnpmVersion(): Promise { + let v: string | undefined = undefined; + try { + const proc = await exec('pnpm', ['--version'], { throwOnError: true }); + v = proc.stdout.trim(); + } catch {} + return v; } diff --git a/packages/core/package.json b/packages/core/package.json index 50ae14381..1138f0314 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -40,6 +40,7 @@ "picocolors": "^1.1.1", "postcss": "^8.5.6", "silver-fleece": "^1.2.1", + "yaml": "^2.8.1", "zimmerframe": "^1.1.2" }, "keywords": [ diff --git a/packages/core/tests/utils.ts b/packages/core/tests/utils.ts index 37979d0be..01139fbc4 100644 --- a/packages/core/tests/utils.ts +++ b/packages/core/tests/utils.ts @@ -1,11 +1,13 @@ -import { expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import dedent from 'dedent'; import { parseScript, serializeScript, guessIndentString, guessQuoteStyle, - type AstTypes + type AstTypes, + serializeYaml, + parseYaml } from '../tooling/index.ts'; test('guessIndentString - one tab', () => { @@ -183,3 +185,87 @@ test('integration - preserves comments', () => { let foo = 'bar';" `); }); + +describe('yaml', () => { + test('read and write', () => { + const input = dedent`foo: + - bar + - baz`; + const output = serializeYaml(parseYaml(input)); + expect(output).toMatchInlineSnapshot(` + "foo: + - bar + - baz + " + `); + }); + + test('edit object', () => { + const input = dedent`foo: + # nice comment + - bar + - baz`; + const doc = parseYaml(input); + const foo = doc.get('foo'); + if (foo) foo.add('yop'); + else doc.set('foo', ['yop']); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "foo: + # nice comment + - bar + - baz + - yop + " + `); + }); + + test('add to array (keeping comments)', () => { + const input = dedent`foo: + - bar + # com + - baz`; + const doc = parseYaml(input); + const toAdd = ['bar', 'yop1', 'yop2', 'yop1']; + const foo = doc.get('foo'); + const items: Array<{ value: string } | string> = foo?.items ?? []; + for (const item of toAdd) { + if (items.includes(item)) continue; + if (items.some((y) => typeof y === 'object' && y.value === item)) continue; + items.push(item); + } + doc.set('foo', new Set(items)); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "foo: + - bar + # com + - baz + - yop1 + - yop2 + " + `); + }); + + test('create object', () => { + const input = dedent`# this is my file`; + const doc = parseYaml(input); + const foo = doc.get('foo'); + if (foo) foo.add('yop'); + else doc.set('foo', ['yop']); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "# this is my file + + foo: + - yop + " + `); + }); + + test('array of foo', () => { + const input = dedent`foo: # nice comment - bar - baz`; + const output = serializeYaml(parseYaml(input)); + expect(output).toMatchInlineSnapshot(` + "foo: # nice comment - bar - baz + " + `); + }); +}); diff --git a/packages/core/tooling/index.ts b/packages/core/tooling/index.ts index ac42aa48f..68f3dc0b4 100644 --- a/packages/core/tooling/index.ts +++ b/packages/core/tooling/index.ts @@ -16,6 +16,7 @@ import * as fleece from 'silver-fleece'; import { print as esrapPrint } from 'esrap'; import * as acorn from 'acorn'; import { tsPlugin } from '@sveltejs/acorn-typescript'; +import * as yaml from 'yaml'; export { // html @@ -238,3 +239,11 @@ export function guessQuoteStyle(ast: TsEstree.Node): 'single' | 'double' | undef return singleCount > doubleCount ? 'single' : 'double'; } + +export function parseYaml(content: string): ReturnType { + return yaml.parseDocument(content); +} + +export function serializeYaml(data: ReturnType): string { + return yaml.stringify(data, { singleQuote: true }); +} diff --git a/packages/core/tooling/parsers.ts b/packages/core/tooling/parsers.ts index f7764d34f..21b6b0993 100644 --- a/packages/core/tooling/parsers.ts +++ b/packages/core/tooling/parsers.ts @@ -35,6 +35,16 @@ export function parseJson(source: string): { data: any } & ParseBase { return { data, source, generateCode }; } +export function parseYaml( + source: string +): { data: ReturnType } & ParseBase { + if (!source) source = ''; + const data = utils.parseYaml(source); + const generateCode = () => utils.serializeYaml(data); + + return { data, source, generateCode }; +} + type SvelteGenerator = (code: { script?: string; module?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 658c56257..9bc730637 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: link:packages/create '@sveltejs/eslint-config': specifier: ^8.2.0 - version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.5.1)))(eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.5.1)))(eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.5.1)))(eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.5.1))(svelte@5.34.7))(eslint@9.29.0(jiti@2.5.1))(typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3))(typescript@5.8.3) + version: 8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.6.0)))(eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.6.0)))(eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.6.0)))(eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.6.0))(svelte@5.34.7))(eslint@9.29.0(jiti@2.6.0))(typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3))(typescript@5.8.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 @@ -31,10 +31,10 @@ importers: version: 4.0.0-beta.6(vitest@4.0.0-beta.6) eslint: specifier: ^9.29.0 - version: 9.29.0(jiti@2.5.1) + version: 9.29.0(jiti@2.6.0) eslint-plugin-svelte: specifier: ^3.9.2 - version: 3.9.2(eslint@9.29.0(jiti@2.5.1))(svelte@5.34.7) + version: 3.9.2(eslint@9.29.0(jiti@2.6.0))(svelte@5.34.7) magic-string: specifier: ^0.30.17 version: 0.30.19 @@ -55,16 +55,16 @@ importers: version: 5.34.7 tsdown: specifier: ^0.15.2 - version: 0.15.2(typescript@5.8.3) + version: 0.15.5(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: specifier: ^8.34.1 - version: 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) vitest: specifier: 4.0.0-beta.6 - version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.5.1) + version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.6.0)(yaml@2.8.1) community-addon-template: dependencies: @@ -80,7 +80,7 @@ importers: version: link:../packages/cli vitest: specifier: 4.0.0-beta.6 - version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.5.1) + version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.6.0)(yaml@2.8.1) packages/addons: dependencies: @@ -184,6 +184,9 @@ importers: silver-fleece: specifier: ^1.2.1 version: 1.2.1 + yaml: + specifier: ^2.8.1 + version: 2.8.1 zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -612,8 +615,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.92.0': - resolution: {integrity: sha512-PDLfCbwgXjGdTBxzcuDOUxJYNBl6P8dOp3eDKWw54dYvqONan9rwGDRQU0zrkdEMiItfXQQUOI17uOcMX5Zm7A==} + '@oxc-project/types@0.93.0': + resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -634,91 +637,91 @@ packages: '@quansync/fs@0.1.5': resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} - '@rolldown/binding-android-arm64@1.0.0-beta.40': - resolution: {integrity: sha512-9Ii9phC7QU6Lb+ncMfG1Xlosq0NBB1N/4sw+EGZ3y0BBWGy02TOb5ghWZalphAKv9rn1goqo5WkBjyd2YvsLmA==} + '@rolldown/binding-android-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.40': - resolution: {integrity: sha512-5O6d0y2tBQTL+ecQY3qXIwSnF1/Zik8q7LZMKeyF+VJ9l194d0IdMhl2zUF0cqWbYHuF4Pnxplk4OhurPQ/Z9Q==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.40': - resolution: {integrity: sha512-izB9jygt3miPQbOTZfSu5K51isUplqa8ysByOKQqcJHgrBWmbTU8TM9eouv6tRmBR0kjcEcID9xhmA1CeZ1VIg==} + '@rolldown/binding-darwin-x64@1.0.0-beta.41': + resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.40': - resolution: {integrity: sha512-2fdpEpKT+wwP0vig9dqxu+toTeWmVSjo3psJQVDeLJ51rO+GXcCJ1IkCXjhMKVEevNtZS7B8T8Z2vvmRV9MAdA==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': - resolution: {integrity: sha512-HP2lo78OWULN+8TewpLbS9PS00jh0CaF04tA2u8z2I+6QgVgrYOYKvX+T0hlO5smgso4+qb3YchzumWJl3yCPQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': - resolution: {integrity: sha512-ng00gfr9BhA2NPAOU5RWAlTiL+JcwAD+L+4yUD1sbBy6tgHdLiNBOvKtHISIF9RM9/eQeS0tAiWOYZGIH9JMew==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': - resolution: {integrity: sha512-mF0R1l9kLcaag/9cLEiYYdNZ4v1uuX4jklSDZ1s6vJE4RB3LirUney0FavdVRwCJ5sDvfvsPgXgtBXWYr2M2tQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': - resolution: {integrity: sha512-+wi08S7wT5iLPHRZb0USrS6n+T6m+yY++dePYedE5uvKIpWCJJioFTaRtWjpm0V6dVNLcq2OukrvfdlGtH9Wgg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': - resolution: {integrity: sha512-W5qBGAemUocIBKCcOsDjlV9GUt28qhl/+M6etWBeLS5gQK0J6XDg0YVzfOQdvq57ZGjYNP0NvhYzqhOOnEx+4g==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': - resolution: {integrity: sha512-vJwoDehtt+yqj2zacq1AqNc2uE/oh7mnRGqAUbuldV6pgvU01OSQUJ7Zu+35hTopnjFoDNN6mIezkYlGAv5RFA==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': - resolution: {integrity: sha512-Oj3YyqVUPurr1FlMpEE/bJmMC+VWAWPM/SGUfklO5KUX97bk5Q/733nPg4RykK8q8/TluJoQYvRc05vL/B74dw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': - resolution: {integrity: sha512-0ZtO6yN8XjVoFfN4HDWQj4nDu3ndMybr7jIM00DJqOmc+yFhly7rdOy7fNR9Sky3leCpBtsXfepVqRmVpYKPVA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': - resolution: {integrity: sha512-BPl1inoJXPpIe38Ja46E4y11vXlJyuleo+9Rmu//pYL5fIDYJkXUj/oAXqjSuwLcssrcwnuPgzvzvlz9++cr3w==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': - resolution: {integrity: sha512-UguA4ltbAk+nbwHRxqaUP/etpTbR0HjyNlsu4Zjbh/ytNbFsbw8CA4tEBkwDyjgI5NIPea6xY11zpl7R2/ddVA==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.40': - resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-beta.41': + resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} '@rollup/rollup-android-arm-eabi@4.46.2': resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} @@ -1014,8 +1017,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} any-promise@1.3.0: @@ -1054,8 +1057,8 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - birpc@2.5.0: - resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1565,8 +1568,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.0: + resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} hasBin: true js-tokens@9.0.1: @@ -1906,8 +1909,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown-plugin-dts@0.16.5: - resolution: {integrity: sha512-bOAfJ7Tc11xK/Uou7KWYha25/Sy80G0DZkhX8WMYx6l8PUalR+bvVzQNuEqXafpKEisZfUHQrkhS2gZG76Xntw==} + rolldown-plugin-dts@0.16.9: + resolution: {integrity: sha512-65fAQjQAAXW7j2V5/872r++jjjR2/Pur18/PQO/JgfJl3vKxapXO2KU1l5bUdRoFuuryF+23+Hfu0Cw3bhM97g==} engines: {node: '>=20.18.0'} peerDependencies: '@ts-macro/tsc': ^0.3.6 @@ -1925,8 +1928,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.40: - resolution: {integrity: sha512-VqEHbKpOgTPmQrZ4fVn4eshDQS/6g/fRpNE7cFSJY+eQLDZn4B9X61J6L+hnlt1u2uRI+pF7r1USs6S5fuWCvw==} + rolldown@1.0.0-beta.41: + resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2130,8 +2133,8 @@ packages: ts-morph@24.0.0: resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} - tsdown@0.15.2: - resolution: {integrity: sha512-qPbWcVnI7Ekq5p4xPiLwuS9siczCGPAyZYsAzcS1xTcFvkkZIsDbh3ejlmUoe/ypLJl5+oQ4Rbwp63Zf+eWiMw==} + tsdown@0.15.5: + resolution: {integrity: sha512-2UP5hDBVYGHnnQSIYtDxMDjePmut7EDpvW5E2kVnjpZ17JgiPvRJPHwk5Dm045bC75+q8yxAlw/CMIELymTWaw==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -2298,6 +2301,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2589,9 +2597,9 @@ snapshots: '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.6.0))': dependencies: - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2708,7 +2716,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@oxc-project/types@0.92.0': {} + '@oxc-project/types@0.93.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -2725,51 +2733,51 @@ snapshots: dependencies: quansync: 0.2.11 - '@rolldown/binding-android-arm64@1.0.0-beta.40': + '@rolldown/binding-android-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.40': + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.40': + '@rolldown/binding-darwin-x64@1.0.0-beta.41': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.40': + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': dependencies: '@napi-rs/wasm-runtime': 1.0.5 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': optional: true - '@rolldown/pluginutils@1.0.0-beta.40': {} + '@rolldown/pluginutils@1.0.0-beta.41': {} '@rollup/rollup-android-arm-eabi@4.46.2': optional: true @@ -2831,9 +2839,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true - '@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.5.1))': + '@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.6.0))': dependencies: - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -2841,16 +2849,16 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.5.1)))(eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.5.1)))(eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.5.1)))(eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.5.1))(svelte@5.34.7))(eslint@9.29.0(jiti@2.5.1))(typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3))(typescript@5.8.3)': + '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.29.0(jiti@2.6.0)))(eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.6.0)))(eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.6.0)))(eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.6.0))(svelte@5.34.7))(eslint@9.29.0(jiti@2.6.0))(typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.10.1(eslint@9.29.0(jiti@2.5.1)) - eslint: 9.29.0(jiti@2.5.1) - eslint-config-prettier: 9.1.0(eslint@9.29.0(jiti@2.5.1)) - eslint-plugin-n: 17.13.1(eslint@9.29.0(jiti@2.5.1)) - eslint-plugin-svelte: 3.9.2(eslint@9.29.0(jiti@2.5.1))(svelte@5.34.7) + '@stylistic/eslint-plugin-js': 2.10.1(eslint@9.29.0(jiti@2.6.0)) + eslint: 9.29.0(jiti@2.6.0) + eslint-config-prettier: 9.1.0(eslint@9.29.0(jiti@2.6.0)) + eslint-plugin-n: 17.13.1(eslint@9.29.0(jiti@2.6.0)) + eslint-plugin-svelte: 3.9.2(eslint@9.29.0(jiti@2.6.0))(svelte@5.34.7) globals: 15.15.0 typescript: 5.8.3 - typescript-eslint: 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) + typescript-eslint: 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: @@ -2903,15 +2911,15 @@ snapshots: '@types/semver@7.7.0': {} - '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3))(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.1 - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -2920,14 +2928,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.34.1 '@typescript-eslint/types': 8.34.1 '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.1 debug: 4.4.3 - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2950,12 +2958,12 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) debug: 4.4.3 - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -2979,13 +2987,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.6.0)) '@typescript-eslint/scope-manager': 8.34.1 '@typescript-eslint/types': 8.34.1 '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3003,13 +3011,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(jiti@2.5.1))': + '@vitest/mocker@4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(jiti@2.6.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.0-beta.6 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.0.6(@types/node@22.15.32)(jiti@2.5.1) + vite: 7.0.6(@types/node@22.15.32)(jiti@2.6.0)(yaml@2.8.1) '@vitest/pretty-format@4.0.0-beta.6': dependencies: @@ -3038,7 +3046,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.5.1) + vitest: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.6.0)(yaml@2.8.1) '@vitest/utils@4.0.0-beta.6': dependencies: @@ -3071,7 +3079,7 @@ snapshots: ansi-styles@6.2.1: {} - ansis@4.1.0: {} + ansis@4.2.0: {} any-promise@1.3.0: {} @@ -3100,7 +3108,7 @@ snapshots: dependencies: is-windows: 1.0.2 - birpc@2.5.0: {} + birpc@2.6.1: {} brace-expansion@1.1.12: dependencies: @@ -3275,39 +3283,39 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.29.0(jiti@2.5.1)): + eslint-compat-utils@0.5.1(eslint@9.29.0(jiti@2.6.0)): dependencies: - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) semver: 7.7.2 - eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.5.1)): + eslint-config-prettier@9.1.0(eslint@9.29.0(jiti@2.6.0)): dependencies: - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) - eslint-plugin-es-x@7.8.0(eslint@9.29.0(jiti@2.5.1)): + eslint-plugin-es-x@7.8.0(eslint@9.29.0(jiti@2.6.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.29.0(jiti@2.5.1) - eslint-compat-utils: 0.5.1(eslint@9.29.0(jiti@2.5.1)) + eslint: 9.29.0(jiti@2.6.0) + eslint-compat-utils: 0.5.1(eslint@9.29.0(jiti@2.6.0)) - eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.5.1)): + eslint-plugin-n@17.13.1(eslint@9.29.0(jiti@2.6.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.6.0)) enhanced-resolve: 5.18.3 - eslint: 9.29.0(jiti@2.5.1) - eslint-plugin-es-x: 7.8.0(eslint@9.29.0(jiti@2.5.1)) + eslint: 9.29.0(jiti@2.6.0) + eslint-plugin-es-x: 7.8.0(eslint@9.29.0(jiti@2.6.0)) get-tsconfig: 4.10.1 globals: 15.15.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.7.2 - eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.5.1))(svelte@5.34.7): + eslint-plugin-svelte@3.9.2(eslint@9.29.0(jiti@2.6.0))(svelte@5.34.7): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.6.0)) '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 9.29.0(jiti@2.5.1) + eslint: 9.29.0(jiti@2.6.0) esutils: 2.0.3 globals: 16.2.0 known-css-properties: 0.36.0 @@ -3330,9 +3338,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.29.0(jiti@2.5.1): + eslint@9.29.0(jiti@2.6.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 @@ -3368,7 +3376,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.0 transitivePeerDependencies: - supports-color @@ -3604,7 +3612,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.5.1: {} + jiti@2.6.0: {} js-tokens@9.0.1: {} @@ -3866,44 +3874,44 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.16.5(rolldown@1.0.0-beta.40)(typescript@5.8.3): + rolldown-plugin-dts@0.16.9(rolldown@1.0.0-beta.41)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 '@babel/types': 7.28.4 ast-kit: 2.1.2 - birpc: 2.5.0 + birpc: 2.6.1 debug: 4.4.3 dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.40 + rolldown: 1.0.0-beta.41 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.40: + rolldown@1.0.0-beta.41: dependencies: - '@oxc-project/types': 0.92.0 - '@rolldown/pluginutils': 1.0.0-beta.40 - ansis: 4.1.0 + '@oxc-project/types': 0.93.0 + '@rolldown/pluginutils': 1.0.0-beta.41 + ansis: 4.2.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.40 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.40 - '@rolldown/binding-darwin-x64': 1.0.0-beta.40 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.40 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.40 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.40 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.40 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.40 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.40 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.40 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.40 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.40 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.40 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.40 + '@rolldown/binding-android-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-x64': 1.0.0-beta.41 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 rollup@4.46.2: dependencies: @@ -4127,17 +4135,17 @@ snapshots: '@ts-morph/common': 0.25.0 code-block-writer: 13.0.3 - tsdown@0.15.2(typescript@5.8.3): + tsdown@0.15.5(typescript@5.8.3): dependencies: - ansis: 4.1.0 + ansis: 4.2.0 cac: 6.7.14 chokidar: 4.0.3 debug: 4.4.3 diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.40 - rolldown-plugin-dts: 0.16.5(rolldown@1.0.0-beta.40)(typescript@5.8.3) + rolldown: 1.0.0-beta.41 + rolldown-plugin-dts: 0.16.9(rolldown@1.0.0-beta.41)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -4159,12 +4167,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3): + typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.5.1))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.5.1) + '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3))(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.6.0))(typescript@5.8.3) + eslint: 9.29.0(jiti@2.6.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -4175,7 +4183,7 @@ snapshots: dependencies: '@quansync/fs': 0.1.5 defu: 6.1.4 - jiti: 2.5.1 + jiti: 2.6.0 quansync: 0.2.11 undici-types@5.26.5: {} @@ -4194,7 +4202,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 - vite@7.0.6(@types/node@22.15.32)(jiti@2.5.1): + vite@7.0.6(@types/node@22.15.32)(jiti@2.6.0)(yaml@2.8.1): dependencies: esbuild: 0.25.8 fdir: 6.5.0(picomatch@4.0.3) @@ -4205,13 +4213,14 @@ snapshots: optionalDependencies: '@types/node': 22.15.32 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.0 + yaml: 2.8.1 - vitest@4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.5.1): + vitest@4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(jiti@2.6.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 4.0.0-beta.6 - '@vitest/mocker': 4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(jiti@2.5.1)) + '@vitest/mocker': 4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(jiti@2.6.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.0-beta.6 '@vitest/runner': 4.0.0-beta.6 '@vitest/snapshot': 4.0.0-beta.6 @@ -4230,7 +4239,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.6(@types/node@22.15.32)(jiti@2.5.1) + vite: 7.0.6(@types/node@22.15.32)(jiti@2.6.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.32 @@ -4281,6 +4290,8 @@ snapshots: yaml@1.10.2: {} + yaml@2.8.1: {} + yocto-queue@0.1.0: {} zimmerframe@1.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 86c4b35e7..6e0eb8cb7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,6 @@ packages: - 'packages/*' - 'community-addon-template' - '!.test-tmp/**' + +onlyBuiltDependencies: + - esbuild