From 5e22384b8ca325521ec12b81c1b273655cfa1127 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:15:07 -0500 Subject: [PATCH 01/70] skip writing empty files --- packages/cli/commands/add/processor.ts | 4 +++- packages/cli/commands/add/utils.ts | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/add/processor.ts b/packages/cli/commands/add/processor.ts index 8f635243..46c3e7c8 100644 --- a/packages/cli/commands/add/processor.ts +++ b/packages/cli/commands/add/processor.ts @@ -21,12 +21,14 @@ export function createOrUpdateFiles( let content = exists ? readFile(workspace.cwd, fileDetails.name(workspace)) : ''; // process file content = fileDetails.content({ content, ...workspace }); + if (!content) continue; writeFile(workspace, fileDetails.name(workspace), content); changedFiles.push(fileDetails.name(workspace)); } catch (e) { - if (e instanceof Error) + if (e instanceof Error) { throw new Error(`Unable to process '${fileDetails.name(workspace)}'. Reason: ${e.message}`); + } throw e; } } diff --git a/packages/cli/commands/add/utils.ts b/packages/cli/commands/add/utils.ts index 0651fadf..d9a12bdd 100644 --- a/packages/cli/commands/add/utils.ts +++ b/packages/cli/commands/add/utils.ts @@ -15,7 +15,11 @@ export type Package = { workspaces?: string[]; }; -export function getPackageJson(cwd: string) { +export function getPackageJson(cwd: string): { + source: string; + data: Package; + generateCode: () => string; +} { const packageText = readFile(cwd, commonFilePaths.packageJson); if (!packageText) { const pkgPath = path.join(cwd, commonFilePaths.packageJson); From 95ff3862d539a1eedd44a642b377cfe845d3a163 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:49:56 -0500 Subject: [PATCH 02/70] rename dir because vitest hates us --- packages/adders/{vitest => vitest-addon}/index.ts | 0 packages/adders/{vitest => vitest-addon}/logo.svg | 0 packages/adders/vitest/tests.ts | 8 -------- 3 files changed, 8 deletions(-) rename packages/adders/{vitest => vitest-addon}/index.ts (100%) rename packages/adders/{vitest => vitest-addon}/logo.svg (100%) delete mode 100644 packages/adders/vitest/tests.ts diff --git a/packages/adders/vitest/index.ts b/packages/adders/vitest-addon/index.ts similarity index 100% rename from packages/adders/vitest/index.ts rename to packages/adders/vitest-addon/index.ts diff --git a/packages/adders/vitest/logo.svg b/packages/adders/vitest-addon/logo.svg similarity index 100% rename from packages/adders/vitest/logo.svg rename to packages/adders/vitest-addon/logo.svg diff --git a/packages/adders/vitest/tests.ts b/packages/adders/vitest/tests.ts deleted file mode 100644 index 764975ed..00000000 --- a/packages/adders/vitest/tests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; - -export const tests = defineAdderTests({ - files: [], - options: {}, - optionValues: [], - tests: [] -}); From 71e47f273fa5d6120eba0af24d53023b4c710530 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:50:55 -0500 Subject: [PATCH 03/70] dont expose `options` --- packages/adders/drizzle/index.ts | 2 +- packages/adders/lucia/index.ts | 2 +- packages/adders/paraglide/index.ts | 2 +- packages/adders/tailwindcss/index.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/adders/drizzle/index.ts b/packages/adders/drizzle/index.ts index f3174054..31794408 100644 --- a/packages/adders/drizzle/index.ts +++ b/packages/adders/drizzle/index.ts @@ -8,7 +8,7 @@ const PORTS = { sqlite: '' } as const; -export const options = defineAdderOptions({ +const options = defineAdderOptions({ database: { question: 'Which database would you like to use?', type: 'select', diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index 35b905bd..7a73e53a 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -25,7 +25,7 @@ type Dialect = 'mysql' | 'postgresql' | 'sqlite'; let drizzleDialect: Dialect; let schemaPath: string; -export const options = defineAdderOptions({ +const options = defineAdderOptions({ demo: { type: 'boolean', default: true, diff --git a/packages/adders/paraglide/index.ts b/packages/adders/paraglide/index.ts index 459f0295..b2f1b49d 100644 --- a/packages/adders/paraglide/index.ts +++ b/packages/adders/paraglide/index.ts @@ -32,7 +32,7 @@ const DEFAULT_INLANG_PROJECT = { } }; -export const options = defineAdderOptions({ +const options = defineAdderOptions({ availableLanguageTags: { question: `Which languages would you like to support? ${colors.gray('(e.g. en,de-ch)')}`, type: 'string', diff --git a/packages/adders/tailwindcss/index.ts b/packages/adders/tailwindcss/index.ts index 4993f9fb..b0f30d33 100644 --- a/packages/adders/tailwindcss/index.ts +++ b/packages/adders/tailwindcss/index.ts @@ -45,7 +45,7 @@ const pluginPackages: Array> = plugins.map((x) condition: ({ options }) => options.plugins.includes(x.id) })); -export const options = defineAdderOptions({ +const options = defineAdderOptions({ plugins: { type: 'multiselect', question: 'Which plugins would you like to add?', From 7e0f15271a20d915073e21d8255e163f2b00ae49 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:51:16 -0500 Subject: [PATCH 04/70] simplify --- packages/adders/package.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/adders/package.json b/packages/adders/package.json index c580c405..39023993 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -6,14 +6,10 @@ "scripts": { "check": "tsc", "format": "pnpm lint --write", - "lint": "prettier --check . --config ../../prettier.config.js --ignore-path ../../.gitignore --ignore-path .gitignore --ignore-path ../../.prettierignore" - }, - "exports": { - ".": { - "types": "./index.ts", - "default": "./index.ts" - } + "lint": "prettier --check . --config ../../prettier.config.js --ignore-path ../../.gitignore --ignore-path .gitignore --ignore-path ../../.prettierignore", + "test": "vitest" }, + "exports": "./index.ts", "dependencies": { "@sveltejs/cli-core": "workspace:*" } From 974e5ade1e7e071c72f26e848b113902e75a467a Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:53:25 -0500 Subject: [PATCH 05/70] pm --- packages/core/adder/workspace.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/adder/workspace.ts b/packages/core/adder/workspace.ts index a03f2877..85bb4fcd 100644 --- a/packages/core/adder/workspace.ts +++ b/packages/core/adder/workspace.ts @@ -14,5 +14,7 @@ export type Workspace = { dependencyVersion: (pkg: string) => string | undefined; typescript: boolean; kit: { libDirectory: string; routesDirectory: string } | undefined; - packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun'; + packageManager: PackageManager; }; + +export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'; From 857094054f6ecb07e3de9ebc8fe300a9317047cd Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:56:05 -0500 Subject: [PATCH 06/70] remove old tests --- packages/adders/_config/official.ts | 2 +- packages/adders/eslint/tests.ts | 8 ---- packages/adders/lucia/tests.ts | 9 ---- packages/adders/mdsvex/tests.ts | 70 ---------------------------- packages/adders/paraglide/tests.ts | 10 ---- packages/adders/playwright/tests.ts | 8 ---- packages/adders/prettier/tests.ts | 8 ---- packages/adders/tailwindcss/tests.ts | 63 ------------------------- 8 files changed, 1 insertion(+), 177 deletions(-) delete mode 100644 packages/adders/eslint/tests.ts delete mode 100644 packages/adders/lucia/tests.ts delete mode 100644 packages/adders/mdsvex/tests.ts delete mode 100644 packages/adders/paraglide/tests.ts delete mode 100644 packages/adders/playwright/tests.ts delete mode 100644 packages/adders/prettier/tests.ts delete mode 100644 packages/adders/tailwindcss/tests.ts diff --git a/packages/adders/_config/official.ts b/packages/adders/_config/official.ts index 2afb5764..6beba501 100644 --- a/packages/adders/_config/official.ts +++ b/packages/adders/_config/official.ts @@ -9,7 +9,7 @@ import playwright from '../playwright/index.ts'; import prettier from '../prettier/index.ts'; import storybook from '../storybook/index.ts'; import tailwindcss from '../tailwindcss/index.ts'; -import vitest from '../vitest/index.ts'; +import vitest from '../vitest-addon/index.ts'; // The order of adders here determines the order they are displayed inside the CLI // We generally try to order them by perceived popularity diff --git a/packages/adders/eslint/tests.ts b/packages/adders/eslint/tests.ts deleted file mode 100644 index 764975ed..00000000 --- a/packages/adders/eslint/tests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; - -export const tests = defineAdderTests({ - files: [], - options: {}, - optionValues: [], - tests: [] -}); diff --git a/packages/adders/lucia/tests.ts b/packages/adders/lucia/tests.ts deleted file mode 100644 index cf23fa33..00000000 --- a/packages/adders/lucia/tests.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; -import { options } from './index.ts'; - -export const tests = defineAdderTests({ - files: [], - options, - optionValues: [], - tests: [] -}); diff --git a/packages/adders/mdsvex/tests.ts b/packages/adders/mdsvex/tests.ts deleted file mode 100644 index 503d2a1b..00000000 --- a/packages/adders/mdsvex/tests.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { defineAdderTests, type OptionDefinition, type FileEditor } from '@sveltejs/cli-core'; -import { imports } from '@sveltejs/cli-core/js'; -import * as html from '@sveltejs/cli-core/html'; -import { parseSvelte } from '@sveltejs/cli-core/parsers'; - -export const tests = defineAdderTests({ - files: [ - { - name: ({ kit }) => `${kit?.routesDirectory}/+page.svelte`, - content: useMarkdownFile, - condition: ({ kit }) => Boolean(kit) - }, - { - name: () => 'src/App.svelte', - content: useMarkdownFile, - condition: ({ kit }) => !kit - }, - { - name: ({ kit }) => `${kit?.routesDirectory}/Demo.svx`, - content: addMarkdownFile, - condition: ({ kit }) => Boolean(kit) - }, - { - name: () => 'src/Demo.svx', - content: addMarkdownFile, - condition: ({ kit }) => !kit - } - ], - options: {}, - optionValues: [], - tests: [ - { - name: 'elements exist', - run: async ({ elementExists }) => { - await elementExists('.mdsvex h1'); - await elementExists('.mdsvex h2'); - await elementExists('.mdsvex p'); - } - } - ] -}); - -function addMarkdownFile({ content }: FileEditor) { - // example taken from website: https://mdsvex.pngwn.io - return ( - content + - ` ---- -title: Svex up your markdown ---- - -# { title } - -## Good stuff in your markdown - -Markdown is pretty good but sometimes you just need more. -` - ); -} - -function useMarkdownFile({ content }: FileEditor) { - const { script, template, generateCode } = parseSvelte(content); - imports.addDefault(script.ast, './Demo.svx', 'Demo'); - - const div = html.div({ class: 'mdsvex' }); - html.appendElement(template.ast.childNodes, div); - const mdsvexNode = html.element('Demo'); - html.appendElement(div.childNodes, mdsvexNode); - return generateCode({ script: script.generateCode(), template: template.generateCode() }); -} diff --git a/packages/adders/paraglide/tests.ts b/packages/adders/paraglide/tests.ts deleted file mode 100644 index 8941a20b..00000000 --- a/packages/adders/paraglide/tests.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; -import { options } from './index.ts'; -// e2e tests make no sense in this context - -export const tests = defineAdderTests({ - files: [], - options, - optionValues: [], - tests: [] -}); diff --git a/packages/adders/playwright/tests.ts b/packages/adders/playwright/tests.ts deleted file mode 100644 index 764975ed..00000000 --- a/packages/adders/playwright/tests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; - -export const tests = defineAdderTests({ - files: [], - options: {}, - optionValues: [], - tests: [] -}); diff --git a/packages/adders/prettier/tests.ts b/packages/adders/prettier/tests.ts deleted file mode 100644 index 764975ed..00000000 --- a/packages/adders/prettier/tests.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; - -export const tests = defineAdderTests({ - files: [], - options: {}, - optionValues: [], - tests: [] -}); diff --git a/packages/adders/tailwindcss/tests.ts b/packages/adders/tailwindcss/tests.ts deleted file mode 100644 index ea28b2af..00000000 --- a/packages/adders/tailwindcss/tests.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; -import { options } from './index.ts'; - -const divId = 'myDiv'; -const typographyDivId = 'myTypographyDiv'; - -export const tests = defineAdderTests({ - files: [ - { - name: ({ kit }) => `${kit?.routesDirectory}/+page.svelte`, - content: ({ content, options }) => { - content = prepareCoreTest(content); - if (options.plugins.includes('typography')) content = prepareTypographyTest(content); - return content; - }, - condition: ({ kit }) => Boolean(kit) - }, - { - name: () => 'src/App.svelte', - content: ({ content, options }) => { - content = prepareCoreTest(content); - if (options.plugins.includes('typography')) content = prepareTypographyTest(content); - return content; - }, - condition: ({ kit }) => !kit - } - ], - options, - optionValues: [{ plugins: [] }, { plugins: ['typography'] }], - tests: [ - { - name: 'core properties', - run: async ({ expectProperty }) => { - const selector = '#' + divId; - await expectProperty(selector, 'background-color', 'rgb(71, 85, 105)'); - await expectProperty(selector, 'border-color', 'rgb(249, 250, 251)'); - await expectProperty(selector, 'border-width', '4px'); - await expectProperty(selector, 'margin-top', '4px'); - } - }, - { - name: 'typography properties', - condition: ({ plugins }) => plugins.includes('typography'), - run: async ({ expectProperty }) => { - const selector = '#' + typographyDivId; - await expectProperty(selector, 'font-size', '18px'); - await expectProperty(selector, 'line-height', '28px'); - await expectProperty(selector, 'text-align', 'right'); - await expectProperty(selector, 'text-decoration-line', 'line-through'); - } - } - ] -}); - -function prepareCoreTest(content: string) { - const div = `
`; - return content + div; -} - -function prepareTypographyTest(content: string) { - const p = `

`; - return content + p; -} From 809a72f5a261299d3fb150f1894b693a34075a56 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:41:07 -0500 Subject: [PATCH 07/70] initial install helper impl --- packages/cli/env.ts | 2 +- packages/cli/index.ts | 6 +- packages/cli/lib/install.ts | 88 +++++++++++++++++++++++++++++ packages/cli/package.json | 7 +++ packages/cli/testing.ts | 110 ++++++++++++++++++++++++++++++++++++ packages/cli/tsconfig.json | 2 +- 6 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 packages/cli/lib/install.ts create mode 100644 packages/cli/testing.ts diff --git a/packages/cli/env.ts b/packages/cli/env.ts index d482918b..4ab46826 100644 --- a/packages/cli/env.ts +++ b/packages/cli/env.ts @@ -1,3 +1,3 @@ import process from 'node:process'; -export const TESTING: boolean = process.env.CI?.toLowerCase() === 'true'; +export const TESTING: boolean = process.env.NODE_ENV?.toLowerCase() === 'test'; diff --git a/packages/cli/index.ts b/packages/cli/index.ts index 50f83ec1..31079a3c 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -1,3 +1,3 @@ -import { create } from '@sveltejs/create'; - -export { create }; +export { create } from '@sveltejs/create'; +export { installAddon } from './lib/install.ts'; +export type { AddonMap, InstallOptions, OptionMap } from './lib/install.ts'; diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts new file mode 100644 index 00000000..f1bd2a43 --- /dev/null +++ b/packages/cli/lib/install.ts @@ -0,0 +1,88 @@ +import { exec } from 'tinyexec'; +import { resolveCommand } from 'package-manager-detector'; +import type { Adder, Workspace, PackageManager, OptionValues, Question } from '@sveltejs/cli-core'; +import { createWorkspace } from '../commands/add/workspace.ts'; +import { createOrUpdateFiles } from '../commands/add/processor.ts'; +import { installPackages } from '../commands/add/utils.ts'; + +type Addon = Adder; +export type InstallOptions = { + cwd: string; + addons: Addons; + options: OptionMap; + packageManager: PackageManager; +}; + +export type AddonMap = Record; +export type OptionMap = { + [K in keyof Addons]: Partial>; +}; + +export async function installAddon({ + addons, + cwd, + options, + packageManager = 'npm' +}: InstallOptions): Promise { + const filesToFormat = new Set(); + + const mapped = Object.entries(addons).map(([, addon]) => addon); + const ordered = orderAddons(mapped); + + for (const addon of ordered) { + const workspace = createWorkspace({ cwd, packageManager }); + workspace.options = options[addon.id]; + + const files = await runAddon(workspace, addon); + files.forEach((f) => filesToFormat.add(f)); + } + + return Array.from(filesToFormat); +} + +async function runAddon(workspace: Workspace, addon: Addon): Promise { + const files = new Set(); + + // TODO: figure out why this is wrongly typed + // apply default adder options + for (const [, question] of Object.entries(addon.options as Record)) { + // we'll only apply defaults to options that don't explicitly fail their conditions + if (question.condition?.(workspace.options) !== false) { + workspace.options ??= question.default; + } + } + + const pkgPath = installPackages(addon, workspace); + files.add(pkgPath); + const changedFiles = createOrUpdateFiles(addon.files, workspace); + changedFiles.forEach((file) => files.add(file)); + + for (const script of addon.scripts ?? []) { + if (script.condition?.(workspace) === false) continue; + + try { + const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; + if (workspace.packageManager === 'npm') args.unshift('--yes'); + await exec(command, script.args, { nodeOptions: { cwd: workspace.cwd, stdio: 'pipe' } }); + } catch (error) { + const typedError = error as Error; + throw new Error(`Failed to execute scripts '${script.description}': ` + typedError.message); + } + } + + return Array.from(files); +} + +// sorts them to their execution order +function orderAddons(addons: Addon[]) { + return Array.from(addons).sort((a, b) => { + if (!a.dependsOn && !b.dependsOn) return 0; + if (!a.dependsOn) return -1; + if (!b.dependsOn) return 1; + + if (a.dependsOn.includes(b.id)) return 1; + if (b.dependsOn.includes(a.id)) return -1; + + return 0; + }); +} diff --git a/packages/cli/package.json b/packages/cli/package.json index e5df83f8..2ec028e5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -23,6 +23,10 @@ ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./test": { + "types": "./dist/testing.d.ts", + "default": "./dist/testing.js" } }, "devDependencies": { @@ -30,12 +34,15 @@ "@sveltejs/clack-prompts": "workspace:*", "@sveltejs/cli-core": "workspace:*", "@sveltejs/create": "workspace:*", + "@types/degit": "^2.8.6", "@types/tar-fs": "^2.0.4", "commander": "^12.1.0", + "degit": "^2.8.4", "empathic": "^1.0.0", "package-manager-detector": "^0.2.2", "picocolors": "^1.1.0", "tar-fs": "^3.0.6", + "terminate": "^2.8.0", "tinyexec": "^0.3.0", "valibot": "^0.41.0" }, diff --git a/packages/cli/testing.ts b/packages/cli/testing.ts new file mode 100644 index 00000000..764a9a1d --- /dev/null +++ b/packages/cli/testing.ts @@ -0,0 +1,110 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'; +import degit from 'degit'; +import terminate from 'terminate'; +import { create } from '@sveltejs/create'; +import { resolveCommand } from 'package-manager-detector'; +import type { PackageManager } from '@sveltejs/cli-core'; + +export type ProjectVariant = (typeof variants)[number]; +export const variants = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts'] as const; + +const TEMPLATES_DIR = '.templates'; + +export type CreateProject = (options: { + testId: string; + variant: ProjectVariant; + /** @default true */ + clean?: boolean; +}) => string; + +type SetupOptions = { + cwd: string; + variants: readonly ProjectVariant[]; + /** @default false */ + clean?: boolean; +}; +export async function setup({ + cwd, + clean = false, + variants +}: SetupOptions): Promise<{ templatesDir: string }> { + const workingDir = path.resolve(cwd); + if (clean && fs.existsSync(workingDir)) { + fs.rmSync(workingDir, { force: true, recursive: true }); + } + + // fetch the project types + const templatesDir = path.resolve(workingDir, TEMPLATES_DIR); + fs.mkdirSync(templatesDir, { recursive: true }); + for (const variant of variants) { + const templatePath = path.resolve(templatesDir, variant); + if (fs.existsSync(templatePath)) continue; + + if (variant === 'kit-js') { + create(templatePath, { name: variant, template: 'minimal', types: 'checkjs' }); + } else if (variant === 'kit-ts') { + create(templatePath, { name: variant, template: 'minimal', types: 'typescript' }); + } else if (variant === 'vite-js' || variant === 'vite-ts') { + const name = `template-svelte${variant === 'vite-ts' ? '-ts' : ''}`; + // TODO: should probably point this to a specific commit hash (ex: `#1234abcd`) + const template = degit(`vitejs/vite/packages/create-vite/${name}`, { force: true }); + await template.clone(templatePath); + } else throw new Error(`Unknown project variant: ${variant}`); + } + + return { templatesDir }; +} + +type CreateOptions = { cwd: string; testName: string; templatesDir: string }; +export function createProject({ cwd, testName, templatesDir }: CreateOptions): CreateProject { + // create the reference dir + const testDir = path.resolve(cwd, testName); + fs.mkdirSync(testDir, { recursive: true }); + return ({ testId, variant, clean = true }) => { + const targetDir = path.resolve(testDir, testId); + if (clean && fs.existsSync(targetDir)) { + fs.rmSync(targetDir, { force: true, recursive: true }); + } + const templatePath = path.resolve(templatesDir, variant); + fs.cpSync(templatePath, targetDir, { recursive: true, force: true }); + return targetDir; + }; +} + +type PreviewOptions = { cwd: string; packageManager?: PackageManager }; +export async function startPreview({ cwd, packageManager = 'npm' }: PreviewOptions): Promise<{ + url: string; + server: ChildProcessWithoutNullStreams; + close: () => void; +}> { + const { command, args } = resolveCommand(packageManager, 'run', ['preview'])!; + + const process = spawn(command, args, { stdio: 'pipe', shell: true, cwd, timeout: 120_000 }); + const close = () => { + if (!process.pid) return; + terminate(process.pid); + }; + + return await new Promise((resolve) => { + process.stdout.on('data', (data: Buffer) => { + const value = data.toString(); + + // extract dev server url from console output + const regexUnicode = /[^\x20-\xaf]+/g; + const withoutUnicode = value.replace(regexUnicode, ''); + + const regexUnicodeDigits = /\[[0-9]{1,2}m/g; + const withoutColors = withoutUnicode.replace(regexUnicodeDigits, ''); + + const regexUrl = /http:\/\/[^:\s]+:[0-9]+\//g; + const urls = withoutColors.match(regexUrl); + + if (urls && urls.length > 0) { + const url = urls[0]; + resolve({ url, server: process, close }); + } + }); + }); +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 6f800349..9249a2e6 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -6,5 +6,5 @@ "declaration": true }, // we'll only want to enforce `isolatedDeclarations` on the library portion of the CLI - "include": ["index.ts"] + "include": ["index.ts", "testing.ts"] } From 3e6f6bdc4ab531c5f82ffb34b0b4c467a50871dc Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:41:26 -0500 Subject: [PATCH 08/70] ignores --- .gitignore | 1 + community-adder-template/.gitignore | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 486eb366..193b6ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ yarn.lock vite.config.js.timestamp-* /packages/create-svelte/template/CHANGELOG.md .test-tmp +.test-output diff --git a/community-adder-template/.gitignore b/community-adder-template/.gitignore index 33738ed9..4404a552 100644 --- a/community-adder-template/.gitignore +++ b/community-adder-template/.gitignore @@ -1,3 +1,4 @@ node_modules temp .outputs +.test-output \ No newline at end of file From 0c86f370fbb00a6c8ef05b449122eebfdc470b68 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:44:47 -0500 Subject: [PATCH 09/70] add initial tests --- packages/adders/_tests/_setup/global.ts | 29 ++++++ packages/adders/_tests/_setup/setup.ts | 92 +++++++++++++++++++ .../adders/_tests/drizzle/docker-compose.yml | 20 ++++ packages/adders/_tests/drizzle/fixtures.ts | 26 ++++++ packages/adders/_tests/drizzle/test.ts | 62 +++++++++++++ packages/adders/_tests/eslint/test.ts | 16 ++++ packages/adders/_tests/lucia/test.ts | 20 ++++ packages/adders/_tests/mdsvex/test.ts | 66 +++++++++++++ packages/adders/_tests/paraglide/test.ts | 17 ++++ packages/adders/_tests/playwright/test.ts | 15 +++ packages/adders/_tests/prettier/test.ts | 15 +++ packages/adders/_tests/tailwindcss/test.ts | 57 ++++++++++++ packages/adders/_tests/vitest/test.ts | 15 +++ packages/adders/package.json | 3 + packages/adders/vitest.config.ts | 16 ++++ 15 files changed, 469 insertions(+) create mode 100644 packages/adders/_tests/_setup/global.ts create mode 100644 packages/adders/_tests/_setup/setup.ts create mode 100644 packages/adders/_tests/drizzle/docker-compose.yml create mode 100644 packages/adders/_tests/drizzle/fixtures.ts create mode 100644 packages/adders/_tests/drizzle/test.ts create mode 100644 packages/adders/_tests/eslint/test.ts create mode 100644 packages/adders/_tests/lucia/test.ts create mode 100644 packages/adders/_tests/mdsvex/test.ts create mode 100644 packages/adders/_tests/paraglide/test.ts create mode 100644 packages/adders/_tests/playwright/test.ts create mode 100644 packages/adders/_tests/prettier/test.ts create mode 100644 packages/adders/_tests/tailwindcss/test.ts create mode 100644 packages/adders/_tests/vitest/test.ts create mode 100644 packages/adders/vitest.config.ts diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts new file mode 100644 index 00000000..5387fb66 --- /dev/null +++ b/packages/adders/_tests/_setup/global.ts @@ -0,0 +1,29 @@ +import path from 'node:path'; +import { setup, type ProjectVariant } from 'sv/test'; +import type { GlobalSetupContext } from 'vitest/node'; + +const TEST_DIR = path.resolve('.test-output'); +const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; + +export default async function ({ provide }: GlobalSetupContext) { + // global setup (e.g. spin up docker containers) + + // downloads different project configurations (sveltekit, js/ts, vite-only, etc) + const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); + + provide('testDir', TEST_DIR); + provide('templatesDir', templatesDir); + provide('variants', variants); + + return async () => { + // tear down... (e.g. cleanup docker containers) + }; +} + +declare module 'vitest' { + export interface ProvidedContext { + testDir: string; + templatesDir: string; + variants: ProjectVariant[]; + } +} diff --git a/packages/adders/_tests/_setup/setup.ts b/packages/adders/_tests/_setup/setup.ts new file mode 100644 index 00000000..f39ee8af --- /dev/null +++ b/packages/adders/_tests/_setup/setup.ts @@ -0,0 +1,92 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import * as vi from 'vitest'; +import { exec } from 'tinyexec'; +import { installAddon, type AddonMap, type OptionMap } from 'sv'; +import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; +import { chromium, type Browser, type Page } from '@playwright/test'; + +const cwd = vi.inject('testDir'); +const templatesDir = vi.inject('templatesDir'); +const variants = vi.inject('variants'); + +type Fixtures = { + page: Page; + run(variant: ProjectVariant, options: OptionMap): Promise; +}; + +export function setupTest(addons: Addons) { + const test = vi.test.extend>({} as any); + + let create: CreateProject; + let browser: Browser; + + vi.beforeAll(async () => { + browser = await chromium.launch(); + return async () => { + await browser.close(); + }; + }); + + vi.beforeAll(({ name }) => { + const testName = path.dirname(name).split(path.sep).at(-1)!; + + // constructs a builder for create test projects + create = createProject({ cwd, templatesDir, testName }); + + // creates a pnpm workspace in each addon dir + fs.writeFileSync( + path.resolve(cwd, testName, 'pnpm-workspace.yaml'), + `packages:\n - '**/*'`, + 'utf8' + ); + }); + + // runs before each test case + vi.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 }); + + // test metadata + const metaPath = path.resolve(cwd, 'meta.json'); + fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); + + // run adder + await installAddon({ cwd, addons, options, packageManager: 'pnpm' }); + + return cwd; + }; + + return async () => { + await browserCtx.close(); + // ...other tear downs + }; + }); + + return { test, variants, prepareServer }; +} + +// installs dependencies, builds the project, and spins up the preview server +async function prepareServer( + { cwd, page }: { cwd: string; page: Page }, + afterInstall?: () => Promise | any +) { + // install deps + await exec('pnpm', ['i'], { nodeOptions: { cwd } }); + + // ...do commands and any other extra stuff + await afterInstall?.(); + + // build project + await exec('npm', ['run', 'build'], { nodeOptions: { cwd } }); + + // start preview server `vite preview` + const { url, close } = await startPreview({ cwd }); + + // navigate to the page + await page.goto(url); + + return { url, close }; +} diff --git a/packages/adders/_tests/drizzle/docker-compose.yml b/packages/adders/_tests/drizzle/docker-compose.yml new file mode 100644 index 00000000..f6f5e0a7 --- /dev/null +++ b/packages/adders/_tests/drizzle/docker-compose.yml @@ -0,0 +1,20 @@ +services: + db-postgres: + image: postgres + restart: always + shm_size: 128mb + ports: + - 5432:5432 + environment: + POSTGRES_USER: root + POSTGRES_PASSWORD: mysecretpassword + POSTGRES_DB: local + db-mysql: + image: mysql + restart: always + shm_size: 128mb + ports: + - 3306:3306 + environment: + MYSQL_ROOT_PASSWORD: mysecretpassword + MYSQL_DATABASE: local diff --git a/packages/adders/_tests/drizzle/fixtures.ts b/packages/adders/_tests/drizzle/fixtures.ts new file mode 100644 index 00000000..a6e2f803 --- /dev/null +++ b/packages/adders/_tests/drizzle/fixtures.ts @@ -0,0 +1,26 @@ +export const pageServer = ` +import { db } from '$lib/server/db'; +import { user } from '$lib/server/db/schema.js'; + +export const load = async () => { + await insertUser({ name: 'Foobar', id: 0, age: 20 }).catch((err) => console.error(err)); + + const users = await db.select().from(user); + + return { users }; +}; + +function insertUser(value) { + return db.insert(user).values(value); +} +`; + +export const pageComp = ` + + +{#each data.users as user} + {user.id} {user.name} +{/each} +`; diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts new file mode 100644 index 00000000..928116d0 --- /dev/null +++ b/packages/adders/_tests/drizzle/test.ts @@ -0,0 +1,62 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import * as vi from 'vitest'; +import { expect } from '@playwright/test'; +import { exec } from 'tinyexec'; +import { setupTest } from '../_setup/setup.ts'; +import drizzle from '../../drizzle/index.ts'; +import { pageServer, pageComp } from './fixtures.ts'; + +const { test, variants, prepareServer } = setupTest({ drizzle }); + +vi.beforeAll(async () => { + const cwd = path.dirname(fileURLToPath(import.meta.url)); + await exec('docker', ['compose', 'up', '--detach'], { + nodeOptions: { cwd, stdio: 'pipe' } + }); + + return async () => { + await exec('docker', ['compose', 'down', '--volumes'], { + nodeOptions: { cwd, stdio: 'pipe' } + }); + }; +}); + +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 }) => { + const cwd = await ctx.run(variant, { drizzle: options as any }); + + const ts = variant === 'kit-ts'; + const drizzleConfig = path.resolve(cwd, `drizzle.config.${ts ? 'ts' : 'js'}`); + const content = fs.readFileSync(drizzleConfig, 'utf8').replace('strict: true,', ''); + fs.writeFileSync(drizzleConfig, content, 'utf8'); + + const routes = path.resolve(cwd, 'src', 'routes'); + const pagePath = path.resolve(routes, '+page.svelte'); + fs.writeFileSync(pagePath, pageComp, 'utf8'); + + const pageServerPath = path.resolve(routes, `+page.server.${ts ? 'ts' : 'js'}`); + fs.writeFileSync(pageServerPath, pageServer, 'utf8'); + + const { close } = await prepareServer({ cwd, page }, async () => { + await exec('npm', ['run', 'db:push'], { nodeOptions: { cwd, stdio: 'pipe' } }); + }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(await page.$('[data-testid]')).toBeTruthy(); + } +); diff --git a/packages/adders/_tests/eslint/test.ts b/packages/adders/_tests/eslint/test.ts new file mode 100644 index 00000000..a24a7f96 --- /dev/null +++ b/packages/adders/_tests/eslint/test.ts @@ -0,0 +1,16 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import eslint from '../../eslint/index.ts'; + +const { test, variants, prepareServer } = setupTest({ eslint }); + +const kitOnly = variants.filter((v) => v.includes('kit')); +test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { eslint: {} }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/_tests/lucia/test.ts b/packages/adders/_tests/lucia/test.ts new file mode 100644 index 00000000..1dc81acc --- /dev/null +++ b/packages/adders/_tests/lucia/test.ts @@ -0,0 +1,20 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import lucia from '../../lucia/index.ts'; +import drizzle from '../../drizzle/index.ts'; + +const { test, variants, prepareServer } = setupTest({ drizzle, lucia }); + +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 } + }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/_tests/mdsvex/test.ts b/packages/adders/_tests/mdsvex/test.ts new file mode 100644 index 00000000..e2d599f8 --- /dev/null +++ b/packages/adders/_tests/mdsvex/test.ts @@ -0,0 +1,66 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { expect } from '@playwright/test'; +import { parseSvelte } from '@sveltejs/cli-core/parsers'; +import { imports } from '@sveltejs/cli-core/js'; +import * as html from '@sveltejs/cli-core/html'; +import { setupTest } from '../_setup/setup.ts'; +import mdsvex from '../../mdsvex/index.ts'; + +const { test, variants, prepareServer } = setupTest({ mdsvex }); + +test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { mdsvex: {} }); + + // ...add test files + addFixture(cwd, variant); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(await page.$('.mdsvex h1')).toBeTruthy(); + expect(await page.$('.mdsvex h2')).toBeTruthy(); + expect(await page.$('.mdsvex p')).toBeTruthy(); +}); + +const fixture = ` +--- +title: Svex up your markdown +--- + +# { title } + +## Good stuff in your markdown + +Markdown is pretty good but sometimes you just need more. +`; + +function addFixture(cwd: string, variant: string) { + let page; + let svx; + if (variant.startsWith('kit')) { + page = path.resolve(cwd, 'src', 'routes', '+page.svelte'); + svx = path.resolve(cwd, 'src', 'routes', 'Demo.svx'); + } else { + page = path.resolve(cwd, 'src', 'App.svelte'); + svx = path.resolve(cwd, 'src', 'Demo.svx'); + } + + const src = fs.readFileSync(page, 'utf8'); + const { script, template, generateCode } = parseSvelte(src); + imports.addDefault(script.ast, './Demo.svx', 'Demo'); + + const div = html.div({ class: 'mdsvex' }); + html.appendElement(template.ast.childNodes, div); + const mdsvexNode = html.element('Demo'); + html.appendElement(div.childNodes, mdsvexNode); + + const content = generateCode({ + script: script.generateCode(), + template: template.generateCode() + }); + + fs.writeFileSync(page, content, 'utf8'); + fs.writeFileSync(svx, fixture, 'utf8'); +} diff --git a/packages/adders/_tests/paraglide/test.ts b/packages/adders/_tests/paraglide/test.ts new file mode 100644 index 00000000..99c84d16 --- /dev/null +++ b/packages/adders/_tests/paraglide/test.ts @@ -0,0 +1,17 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import paraglide from '../../paraglide/index.ts'; + +const { test, variants, prepareServer } = setupTest({ paraglide }); + +const kitOnly = variants.filter((v) => v.includes('kit')); +// TODO: figure out why this is failing +test.todo.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { paraglide: { demo: true, availableLanguageTags: 'en' } }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/_tests/playwright/test.ts b/packages/adders/_tests/playwright/test.ts new file mode 100644 index 00000000..e0cde822 --- /dev/null +++ b/packages/adders/_tests/playwright/test.ts @@ -0,0 +1,15 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import playwright from '../../playwright/index.ts'; + +const { test, variants, prepareServer } = setupTest({ playwright }); + +test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { playwright: {} }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/_tests/prettier/test.ts b/packages/adders/_tests/prettier/test.ts new file mode 100644 index 00000000..e33ce87d --- /dev/null +++ b/packages/adders/_tests/prettier/test.ts @@ -0,0 +1,15 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import prettier from '../../prettier/index.ts'; + +const { test, variants, prepareServer } = setupTest({ prettier }); + +test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { prettier: {} }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/_tests/tailwindcss/test.ts b/packages/adders/_tests/tailwindcss/test.ts new file mode 100644 index 00000000..a0f9e730 --- /dev/null +++ b/packages/adders/_tests/tailwindcss/test.ts @@ -0,0 +1,57 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import tailwindcss from '../../tailwindcss/index.ts'; + +const { test, variants, prepareServer } = setupTest({ tailwindcss }); + +const fixture = ` +
+

+
`; + +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(() => close()); + + const el = page.getByTestId('base'); + await expect(el).toHaveCSS('background-color', 'rgb(71, 85, 105)'); + await expect(el).toHaveCSS('border-color', 'rgb(249, 250, 251)'); + 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(() => 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'); +}); + +function addFixture(cwd: string, variant: string) { + let page; + if (variant.startsWith('kit')) { + page = path.resolve(cwd, 'src', 'routes', '+page.svelte'); + } else { + page = path.resolve(cwd, 'src', 'App.svelte'); + } + const content = fs.readFileSync(page, 'utf8') + fixture; + fs.writeFileSync(page, content, 'utf8'); +} diff --git a/packages/adders/_tests/vitest/test.ts b/packages/adders/_tests/vitest/test.ts new file mode 100644 index 00000000..d0b1ed56 --- /dev/null +++ b/packages/adders/_tests/vitest/test.ts @@ -0,0 +1,15 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import vitest from '../../vitest-addon/index.ts'; + +const { test, variants, prepareServer } = setupTest({ vitest }); + +test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { vitest: {} }); + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + expect(true).toBe(true); +}); diff --git a/packages/adders/package.json b/packages/adders/package.json index 39023993..d366fd1e 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -12,5 +12,8 @@ "exports": "./index.ts", "dependencies": { "@sveltejs/cli-core": "workspace:*" + }, + "devDependencies": { + "tinyexec": "^0.3.0" } } diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts new file mode 100644 index 00000000..63ac177c --- /dev/null +++ b/packages/adders/vitest.config.ts @@ -0,0 +1,16 @@ +import { cpus } from 'node:os'; +import { defineConfig } from 'vitest/config'; + +const ONE_MINUTE = 1000 * 60; + +export default defineConfig({ + test: { + include: ['_tests/**/test.{js,ts}'], + exclude: ['_tests/{_setups,_fixtures}/**/*'], + testTimeout: ONE_MINUTE * 2, + hookTimeout: ONE_MINUTE * 3, + maxConcurrency: cpus().length, + pool: 'forks', + globalSetup: ['_tests/_setup/global.ts'] + } +}); From 665ead0b6e39e255f98c85d16c68c659af51821a Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:13:06 -0500 Subject: [PATCH 10/70] ..pin storybook --- packages/adders/storybook/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 9a76cbef..65de68a2 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -9,7 +9,7 @@ export default defineAdder({ scripts: [ { description: 'applies storybook', - args: ['storybook@latest', 'init', '--skip-install', '--no-dev'], + args: ['storybook@8.3', 'init', '--skip-install', '--no-dev'], stdio: 'inherit' } ], From 6446e597b6fccb501f76095038ba8da117e1d396 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:17:35 -0500 Subject: [PATCH 11/70] fix scripts --- packages/adders/_tests/_setup/global.ts | 2 +- packages/adders/_tests/_setup/setup.ts | 23 +++++++++++++++++++---- packages/cli/lib/install.ts | 2 +- packages/cli/testing.ts | 11 ++++------- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index 5387fb66..42b646d7 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -9,7 +9,7 @@ export default async function ({ provide }: GlobalSetupContext) { // global setup (e.g. spin up docker containers) // downloads different project configurations (sveltekit, js/ts, vite-only, etc) - const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); + const { templatesDir } = await setup({ cwd: TEST_DIR, variants }); provide('testDir', TEST_DIR); provide('templatesDir', templatesDir); diff --git a/packages/adders/_tests/_setup/setup.ts b/packages/adders/_tests/_setup/setup.ts index f39ee8af..29017363 100644 --- a/packages/adders/_tests/_setup/setup.ts +++ b/packages/adders/_tests/_setup/setup.ts @@ -68,22 +68,37 @@ export function setupTest(addons: Addons) { return { test, variants, prepareServer }; } +type PrepareServerOptions = { + cwd: string; + page: Page; + previewCommand?: string; + buildCommand?: string; + installCommand?: string; +}; // installs dependencies, builds the project, and spins up the preview server async function prepareServer( - { cwd, page }: { cwd: string; page: Page }, + { + cwd, + page, + previewCommand = 'npm run preview', + buildCommand = 'npm run build', + installCommand = 'pnpm install' + }: PrepareServerOptions, afterInstall?: () => Promise | any ) { // install deps - await exec('pnpm', ['i'], { nodeOptions: { cwd } }); + const [installCmd, ...installArgs] = installCommand.split(' '); + await exec(installCmd, installArgs, { nodeOptions: { cwd } }); // ...do commands and any other extra stuff await afterInstall?.(); // build project - await exec('npm', ['run', 'build'], { nodeOptions: { cwd } }); + const [buildCmd, ...buildArgs] = buildCommand.split(' '); + await exec(buildCmd, buildArgs, { nodeOptions: { cwd } }); // start preview server `vite preview` - const { url, close } = await startPreview({ cwd }); + const { url, close } = await startPreview({ cwd, command: previewCommand }); // navigate to the page await page.goto(url); diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index f1bd2a43..7c6e14b8 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -63,7 +63,7 @@ async function runAddon(workspace: Workspace, addon: Addon): Promise void; }> { - const { command, args } = resolveCommand(packageManager, 'run', ['preview'])!; - - const process = spawn(command, args, { stdio: 'pipe', shell: true, cwd, timeout: 120_000 }); + const [cmd, ...args] = command.split(' '); + const process = spawn(cmd, args, { stdio: 'pipe', shell: true, cwd, timeout: 120_000 }); const close = () => { if (!process.pid) return; terminate(process.pid); From 53934db71b18dd159e3f1cbfdfc473d46baf8805 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:18:18 -0500 Subject: [PATCH 12/70] add storybook test --- packages/adders/_tests/storybook/test.ts | 25 +++++++ packages/adders/drizzle/tests.ts | 86 ------------------------ packages/adders/storybook/tests.ts | 21 ------ 3 files changed, 25 insertions(+), 107 deletions(-) create mode 100644 packages/adders/_tests/storybook/test.ts delete mode 100644 packages/adders/drizzle/tests.ts delete mode 100644 packages/adders/storybook/tests.ts diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts new file mode 100644 index 00000000..5fcc6b30 --- /dev/null +++ b/packages/adders/_tests/storybook/test.ts @@ -0,0 +1,25 @@ +import { expect } from '@playwright/test'; +import { setupTest } from '../_setup/setup.ts'; +import storybook from '../../storybook/index.ts'; + +const { test, variants, prepareServer } = setupTest({ storybook }); + +let port = 6006; +test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { storybook: {} }); + + const p = port++; + const { close } = await prepareServer({ + cwd, + page, + previewCommand: `pnpm storybook -p ${p} --ci`, + buildCommand: 'echo' + }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + await page.goto(`http://localhost:${p}`); + + expect(await page.$('main .sb-bar')).toBeTruthy(); + expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); +}); diff --git a/packages/adders/drizzle/tests.ts b/packages/adders/drizzle/tests.ts deleted file mode 100644 index 3257b575..00000000 --- a/packages/adders/drizzle/tests.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { options } from './index.ts'; -import { defineAdderTests } from '@sveltejs/cli-core'; -import { parseSvelte, parseJson } from '@sveltejs/cli-core/parsers'; - -const defaultOptionValues = { - sqlite: options.sqlite.default, - mysql: options.mysql.default, - postgresql: options.postgresql.default, - docker: options.docker.default -}; - -export const tests = defineAdderTests({ - options, - optionValues: [ - { ...defaultOptionValues, database: 'sqlite', sqlite: 'better-sqlite3' }, - { ...defaultOptionValues, database: 'sqlite', sqlite: 'libsql' }, - { ...defaultOptionValues, database: 'mysql', mysql: 'mysql2', docker: true }, - { ...defaultOptionValues, database: 'postgresql', postgresql: 'postgres.js', docker: true } - ], - files: [ - { - name: ({ kit }) => `${kit?.routesDirectory}/+page.svelte`, - condition: ({ kit }) => Boolean(kit), - content: ({ content }) => { - const { script, template, generateCode } = parseSvelte(content); - const dataProp = '\nexport let data;'; - const eachBlock = ` - {#each data.users as user} - {user.id} {user.name} - {/each}`; - return generateCode({ - script: script.source + dataProp, - template: template.source + eachBlock - }); - } - }, - { - name: ({ kit, typescript }) => - `${kit?.routesDirectory}/+page.server.${typescript ? 'ts' : 'js'}`, - condition: ({ kit }) => Boolean(kit), - content: ({ typescript }) => { - return ` - import { db } from '$lib/server/db'; - import { user } from '$lib/server/db/schema.js'; - - export const load = async () => { - await insertUser({ name: 'Foobar', id: 0, age: 20 }).catch((err) => console.error(err)); - - const users = await db.select().from(user); - - return { users }; - }; - - function insertUser(${typescript ? 'value: typeof user.$inferInsert' : 'value'}) { - return db.insert(user).values(value); - } - `; - } - }, - { - // override the config so we can remove strict mode - name: ({ typescript }) => `drizzle.config.${typescript ? 'ts' : 'js'}`, - condition: ({ kit }) => Boolean(kit), - content: ({ content }) => { - return content.replace('strict: true,', ''); - } - }, - { - name: () => 'package.json', - content: ({ content }) => { - const { data, generateCode } = parseJson(content); - // executes after pnpm install - data.scripts['postinstall'] ??= 'pnpm run db:push'; - return generateCode(); - } - } - ], - tests: [ - { - name: 'queries database', - run: async ({ elementExists }) => { - await elementExists('[data-test-id]'); - } - } - ] -}); diff --git a/packages/adders/storybook/tests.ts b/packages/adders/storybook/tests.ts deleted file mode 100644 index 5fb56a32..00000000 --- a/packages/adders/storybook/tests.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; - -let port = 6006; - -export const tests = defineAdderTests({ - options: {}, - optionValues: [], - get command() { - return `storybook -p ${port++} --ci`; - }, - files: [], - tests: [ - { - name: 'storybook loaded', - run: async ({ elementExists }) => { - await elementExists('main .sb-bar'); - await elementExists('#storybook-preview-wrapper'); - } - } - ] -}); From d3ef73776911d567d18ea452a34e2b255e439d02 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:19:16 -0500 Subject: [PATCH 13/70] simplify --- packages/adders/_tests/storybook/test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index 5fcc6b30..819956af 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -8,17 +8,16 @@ let port = 6006; test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { storybook: {} }); - const p = port++; const { close } = await prepareServer({ cwd, page, - previewCommand: `pnpm storybook -p ${p} --ci`, + previewCommand: `pnpm storybook -p ${++port} --ci`, buildCommand: 'echo' }); // kill server process when we're done ctx.onTestFinished(() => close()); - await page.goto(`http://localhost:${p}`); + await page.goto(`http://localhost:${port}`); expect(await page.$('main .sb-bar')).toBeTruthy(); expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); From e398dc20d1ed5163737b89d4153507a43bc974cc Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:20:05 -0500 Subject: [PATCH 14/70] deps --- .gitignore | 2 + package.json | 1 + pnpm-lock.yaml | 152 +++++++++++++++++++++++++++++++++++++++++++++-- rollup.config.js | 7 ++- 4 files changed, 154 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 193b6ac1..7d6f6845 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ vite.config.js.timestamp-* /packages/create-svelte/template/CHANGELOG.md .test-tmp .test-output + +*storybook.log \ No newline at end of file diff --git a/package.json b/package.json index 3678c39b..20fec6d2 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "devDependencies": { "@changesets/cli": "^2.27.9", + "@playwright/test": "^1.48.2", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-dynamic-import-vars": "^2.1.2", "@rollup/plugin-json": "^6.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a7619e0..89b9b088 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@changesets/cli': specifier: ^2.27.9 version: 2.27.9 + '@playwright/test': + specifier: ^1.48.2 + version: 1.48.2 '@rollup/plugin-commonjs': specifier: ^26.0.1 version: 26.0.1(rollup@4.21.2) @@ -87,15 +90,25 @@ importers: specifier: workspace:* version: link:../packages/core devDependencies: + '@playwright/test': + specifier: ^1.48.2 + version: 1.48.2 sv: specifier: workspace:* version: link:../packages/cli + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.4)(@vitest/ui@2.0.5) packages/adders: dependencies: '@sveltejs/cli-core': specifier: workspace:* version: link:../core + devDependencies: + tinyexec: + specifier: ^0.3.0 + version: 0.3.0 packages/ast-tooling: devDependencies: @@ -171,12 +184,18 @@ importers: '@sveltejs/create': specifier: workspace:* version: link:../create + '@types/degit': + specifier: ^2.8.6 + version: 2.8.6 '@types/tar-fs': specifier: ^2.0.4 version: 2.0.4 commander: specifier: ^12.1.0 version: 12.1.0 + degit: + specifier: ^2.8.4 + version: 2.8.4 empathic: specifier: ^1.0.0 version: 1.0.0 @@ -189,6 +208,9 @@ importers: tar-fs: specifier: ^3.0.6 version: 3.0.6 + terminate: + specifier: ^2.8.0 + version: 2.8.0 tinyexec: specifier: ^0.3.0 version: 0.3.0 @@ -582,6 +604,11 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.48.2': + resolution: {integrity: sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==} + engines: {node: '>=18'} + hasBin: true + '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -731,6 +758,9 @@ packages: resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} + '@types/degit@2.8.6': + resolution: {integrity: sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -988,7 +1018,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -1037,6 +1067,11 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + degit@2.8.4: + resolution: {integrity: sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==} + engines: {node: '>=8.0.0'} + hasBin: true + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1070,6 +1105,9 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1211,6 +1249,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -1271,6 +1312,9 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1279,6 +1323,11 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1514,6 +1563,9 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1668,6 +1720,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -1683,6 +1738,16 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + playwright-core@1.48.2: + resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.48.2: + resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + engines: {node: '>=18'} + hasBin: true + postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -1743,6 +1808,11 @@ packages: engines: {node: '>=14'} hasBin: true + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -1883,6 +1953,9 @@ packages: spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1892,6 +1965,9 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + streamx@2.20.1: resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} @@ -1967,6 +2043,10 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terminate@2.8.0: + resolution: {integrity: sha512-bcbjJEg0wY5nuJXvGxxHfmoEPkyHLCctUKO6suwtxy7jVSgGcgPeGwpbLDLELFhIaxCGRr3dPvyNg1yuz2V0eg==} + engines: {node: '>=12'} + text-decoder@1.2.0: resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} @@ -1980,6 +2060,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -2103,8 +2186,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.3: - resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2582,6 +2665,10 @@ snapshots: '@pkgr/core@0.1.1': {} + '@playwright/test@1.48.2': + dependencies: + playwright: 1.48.2 + '@polka/url@1.0.0-next.25': {} '@rollup/plugin-commonjs@26.0.1(rollup@4.21.2)': @@ -2702,6 +2789,8 @@ snapshots: transitivePeerDependencies: - encoding + '@types/degit@2.8.6': {} + '@types/estree@1.0.5': {} '@types/gitignore-parser@0.0.3': {} @@ -3013,6 +3102,8 @@ snapshots: deepmerge@4.3.1: {} + degit@2.8.4: {} + detect-indent@6.1.0: {} detect-indent@7.0.1: {} @@ -3043,6 +3134,8 @@ snapshots: dotenv@16.4.5: {} + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} @@ -3236,6 +3329,16 @@ snapshots: esutils@2.0.3: {} + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -3308,6 +3411,8 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + from@0.1.7: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3320,6 +3425,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -3532,6 +3640,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + map-stream@0.1.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -3662,6 +3772,10 @@ snapshots: pathval@2.0.0: {} + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -3670,6 +3784,14 @@ snapshots: pirates@4.0.6: {} + playwright-core@1.48.2: {} + + playwright@1.48.2: + dependencies: + playwright-core: 1.48.2 + optionalDependencies: + fsevents: 2.3.2 + postcss-load-config@3.1.4(postcss@8.4.45): dependencies: lilconfig: 2.1.0 @@ -3714,6 +3836,10 @@ snapshots: prettier@3.3.3: {} + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + pseudomap@1.0.2: {} pump@3.0.2: @@ -3860,12 +3986,20 @@ snapshots: cross-spawn: 5.1.0 signal-exit: 3.0.7 + split@0.3.3: + dependencies: + through: 2.3.8 + sprintf-js@1.0.3: {} stackback@0.0.2: {} std-env@3.7.0: {} + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + streamx@2.20.1: dependencies: fast-fifo: 1.3.2 @@ -3965,6 +4099,10 @@ snapshots: term-size@2.2.1: {} + terminate@2.8.0: + dependencies: + ps-tree: 1.2.0 + text-decoder@1.2.0: dependencies: b4a: 1.6.6 @@ -3979,6 +4117,8 @@ snapshots: dependencies: any-promise: 1.3.0 + through@2.3.8: {} + tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 @@ -4074,7 +4214,7 @@ snapshots: debug: 4.3.7 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.3(@types/node@22.5.4) + vite: 5.4.10(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - less @@ -4086,7 +4226,7 @@ snapshots: - supports-color - terser - vite@5.4.3(@types/node@22.5.4): + vite@5.4.10(@types/node@22.5.4): dependencies: esbuild: 0.21.5 postcss: 8.4.45 @@ -4113,7 +4253,7 @@ snapshots: tinybench: 2.9.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.3(@types/node@22.5.4) + vite: 5.4.10(@types/node@22.5.4) vite-node: 2.0.5(@types/node@22.5.4) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/rollup.config.js b/rollup.config.js index f66a0e6c..74c8158c 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -35,7 +35,7 @@ function getConfig(project) { parsers: `${projectRoot}/tooling/parsers.ts` }; } else if (project === 'cli') { - inputs = [`${projectRoot}/index.ts`, `${projectRoot}/bin.ts`]; + inputs = [`${projectRoot}/index.ts`, `${projectRoot}/testing.ts`, `${projectRoot}/bin.ts`]; } else { inputs = [`${projectRoot}/index.ts`]; } @@ -107,7 +107,10 @@ function getConfig(project) { external, plugins: [ preserveShebangs(), - 'exports' in pkg && dts({ include: project === 'cli' ? [inputs[0]] : undefined }), + 'exports' in pkg && + dts({ + include: project === 'cli' ? [inputs[0], inputs[1], `${projectRoot}/lib/*`] : undefined + }), esbuild(), nodeResolve({ preferBuiltins: true, rootDir: projectRoot }), commonjs(), From 8068dfc922365cca8251daae8124d72cb1afb046 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Wed, 6 Nov 2024 22:19:46 -0500 Subject: [PATCH 15/70] add retries --- packages/adders/_tests/_setup/setup.ts | 8 +++----- packages/adders/vitest.config.ts | 4 +++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/adders/_tests/_setup/setup.ts b/packages/adders/_tests/_setup/setup.ts index 29017363..dc782c5a 100644 --- a/packages/adders/_tests/_setup/setup.ts +++ b/packages/adders/_tests/_setup/setup.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; +import { execSync } from 'node:child_process'; import * as vi from 'vitest'; -import { exec } from 'tinyexec'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; import { chromium, type Browser, type Page } from '@playwright/test'; @@ -87,15 +87,13 @@ async function prepareServer( afterInstall?: () => Promise | any ) { // install deps - const [installCmd, ...installArgs] = installCommand.split(' '); - await exec(installCmd, installArgs, { nodeOptions: { cwd } }); + execSync(installCommand, { cwd, stdio: 'pipe' }); // ...do commands and any other extra stuff await afterInstall?.(); // build project - const [buildCmd, ...buildArgs] = buildCommand.split(' '); - await exec(buildCmd, buildArgs, { nodeOptions: { cwd } }); + execSync(buildCommand, { cwd, stdio: 'pipe' }); // start preview server `vite preview` const { url, close } = await startPreview({ cwd, command: previewCommand }); diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index 63ac177c..05270bc3 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -1,4 +1,5 @@ import { cpus } from 'node:os'; +import { env } from 'node:process'; import { defineConfig } from 'vitest/config'; const ONE_MINUTE = 1000 * 60; @@ -11,6 +12,7 @@ export default defineConfig({ hookTimeout: ONE_MINUTE * 3, maxConcurrency: cpus().length, pool: 'forks', - globalSetup: ['_tests/_setup/global.ts'] + globalSetup: ['_tests/_setup/global.ts'], + retry: env.CI ? 3 : 0 } }); From 4b2f0369bdb0dab7e5ce459a829f8cb214c26bd9 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:10:59 -0500 Subject: [PATCH 16/70] not needed --- packages/adders/_tests/storybook/test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index 819956af..36a733e9 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -17,8 +17,6 @@ test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, . // kill server process when we're done ctx.onTestFinished(() => close()); - await page.goto(`http://localhost:${port}`); - expect(await page.$('main .sb-bar')).toBeTruthy(); expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); }); From 0a0ba1acb6ed6da00672b4b2fb09585269c23481 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:18:35 -0500 Subject: [PATCH 17/70] tweak community template --- community-adder-template/src/index.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/community-adder-template/src/index.js b/community-adder-template/src/index.js index 9e4348aa..c063124b 100644 --- a/community-adder-template/src/index.js +++ b/community-adder-template/src/index.js @@ -1,17 +1,17 @@ import { defineAdder, defineAdderOptions } from '@sveltejs/cli-core'; import { imports } from '@sveltejs/cli-core/js'; -import { parseScript } from '@sveltejs/cli-core/parsers'; +import { parseSvelte } from '@sveltejs/cli-core/parsers'; export const options = defineAdderOptions({ - demo: { - question: 'Do you want to use a demo?', - type: 'boolean', - default: false - } + demo: { + question: 'Do you want to use a demo?', + type: 'boolean', + default: false + } }); -export const adder = defineAdder({ - id: 'community-adder-template', +export default defineAdder({ + id: 'community-addon', environments: { kit: true, svelte: true }, options, packages: [], @@ -27,10 +27,11 @@ export const adder = defineAdder({ }, { name: () => 'src/DemoComponent.svelte', - content: ({ content }) => { - const { ast, generateCode } = parseScript(content); - imports.addDefault(ast, '../adder-template-demo.txt?raw', 'Demo'); - return generateCode(); + content: ({ content, options, typescript }) => { + if (!options.demo) return content; + const { script, generateCode } = parseSvelte(content, { typescript }); + imports.addDefault(script.ast, '../adder-template-demo.txt?raw', 'demo'); + return generateCode({ script: script.generateCode(), template: '{demo}' }); } } ] From cd1a56d81769d361e20d32d83b4d81e55486f5f6 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:18:43 -0500 Subject: [PATCH 18/70] add fixtures --- community-adder-template/tests/fixtures/+page.svelte | 5 +++++ community-adder-template/tests/fixtures/App.svelte | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 community-adder-template/tests/fixtures/+page.svelte create mode 100644 community-adder-template/tests/fixtures/App.svelte diff --git a/community-adder-template/tests/fixtures/+page.svelte b/community-adder-template/tests/fixtures/+page.svelte new file mode 100644 index 00000000..bd5a70ff --- /dev/null +++ b/community-adder-template/tests/fixtures/+page.svelte @@ -0,0 +1,5 @@ + + +{demo} diff --git a/community-adder-template/tests/fixtures/App.svelte b/community-adder-template/tests/fixtures/App.svelte new file mode 100644 index 00000000..8694a285 --- /dev/null +++ b/community-adder-template/tests/fixtures/App.svelte @@ -0,0 +1,5 @@ + + +{demo} From ed32699a8e9f040dec2d21f412aa0e789b5d1827 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:19:30 -0500 Subject: [PATCH 19/70] community template tests --- community-adder-template/package.json | 25 ++-- .../tests/custom-addon.test.ts | 28 +++++ .../tests/setup/global.ts | 29 +++++ community-adder-template/tests/setup/index.ts | 108 ++++++++++++++++++ community-adder-template/tests/tests.js | 16 --- community-adder-template/vitest.config.js | 16 +++ 6 files changed, 195 insertions(+), 27 deletions(-) create mode 100644 community-adder-template/tests/custom-addon.test.ts create mode 100644 community-adder-template/tests/setup/global.ts create mode 100644 community-adder-template/tests/setup/index.ts delete mode 100644 community-adder-template/tests/tests.js create mode 100644 community-adder-template/vitest.config.js diff --git a/community-adder-template/package.json b/community-adder-template/package.json index 557b1e55..f53952ad 100644 --- a/community-adder-template/package.json +++ b/community-adder-template/package.json @@ -2,25 +2,28 @@ "name": "community-adder-template", "private": true, "version": "0.0.0", - "license": "MIT", "type": "module", - "exports": "./src/index.js", - "keywords": [ - "svelte-add-on", - "sv" - ], + "license": "MIT", "scripts": { + "create-temp": "sv create temp --types ts --template minimal --no-add-ons --no-install", "start": "sv add -C temp --community file:../", - "create-temp": "sv create temp --check-types typescript --template skeleton --no-adders --no-install" + "test": "vitest" }, + "files": [ + "src", + "!src/**/*.test.*" + ], + "exports": "./src/index.js", "dependencies": { "@sveltejs/cli-core": "workspace:*" }, "devDependencies": { - "sv": "workspace:*" + "@playwright/test": "^1.48.2", + "sv": "workspace:*", + "vitest": "^2.0.5" }, - "files": [ - "src", - "!src/**/*.test.*" + "keywords": [ + "svelte-add-on", + "sv" ] } diff --git a/community-adder-template/tests/custom-addon.test.ts b/community-adder-template/tests/custom-addon.test.ts new file mode 100644 index 00000000..f18986a6 --- /dev/null +++ b/community-adder-template/tests/custom-addon.test.ts @@ -0,0 +1,28 @@ +import path from 'node:path'; +import { expect } from '@playwright/test'; +import { fixture, setupTest } from './setup/index.js'; +import addon from '../src/index.js'; + +const id = addon.id; +const { test, variants, prepareServer } = setupTest({ [id]: addon }); + +test.concurrent.for(variants)('demo - %s', async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { [id]: { demo: true } }); + + // ...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 }); + } + + const { close } = await prepareServer({ cwd, page }); + // kill server process when we're done + ctx.onTestFinished(() => close()); + + // expectations + const textContent = await page.getByTestId('demo').textContent(); + expect(textContent).toContain('This is a text file made by the Community Adder Template demo!'); +}); diff --git a/community-adder-template/tests/setup/global.ts b/community-adder-template/tests/setup/global.ts new file mode 100644 index 00000000..0dab6571 --- /dev/null +++ b/community-adder-template/tests/setup/global.ts @@ -0,0 +1,29 @@ +import path from 'node:path'; +import { setup, type ProjectVariant } from 'sv/test'; +import type { GlobalSetupContext } from 'vitest/node'; + +const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; +const TEST_DIR = path.resolve('.test-output'); + +export default async function ({ provide }: GlobalSetupContext) { + // global setup (e.g. spin up docker containers) + + // downloads different project configurations (sveltekit, js/ts, vite-only, etc) + const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); + + provide('testDir', TEST_DIR); + provide('templatesDir', templatesDir); + provide('variants', variants); + + return async () => { + // tear down... (e.g. cleanup docker containers) + }; +} + +declare module 'vitest' { + export interface ProvidedContext { + testDir: string; + templatesDir: string; + variants: ProjectVariant[]; + } +} diff --git a/community-adder-template/tests/setup/index.ts b/community-adder-template/tests/setup/index.ts new file mode 100644 index 00000000..ba798198 --- /dev/null +++ b/community-adder-template/tests/setup/index.ts @@ -0,0 +1,108 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { execSync } from 'node:child_process'; +import * as vi from 'vitest'; +import { installAddon, type AddonMap, type OptionMap } from 'sv'; +import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; +import { chromium, type Browser, type Page } from '@playwright/test'; +import { fileURLToPath } from 'node:url'; + +const cwd = vi.inject('testDir'); +const templatesDir = vi.inject('templatesDir'); +const variants = vi.inject('variants'); + +const SETUP_DIR = path.dirname(fileURLToPath(import.meta.url)); + +type Fixtures = { + page: Page; + run(variant: ProjectVariant, options: OptionMap): Promise; +}; + +export function setupTest(addons: Addons) { + let create: CreateProject; + let browser: Browser; + + const test = vi.test.extend>({} as any); + + vi.beforeAll(async () => { + browser = await chromium.launch(); + return async () => { + await browser.close(); + }; + }); + + vi.beforeAll(({ name }) => { + const testName = path.parse(name).name.replace('.test', ''); + + // constructs a builder for create test projects + create = createProject({ cwd, templatesDir, testName }); + + // creates a pnpm workspace in each addon dir + fs.writeFileSync( + path.resolve(cwd, testName, 'pnpm-workspace.yaml'), + `packages:\n - '**/*'`, + 'utf8' + ); + }); + + // runs before each test case + vi.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 }); + + // test metadata + const metaPath = path.resolve(cwd, 'meta.json'); + fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); + + // run addon + await installAddon({ cwd, addons, options, packageManager: 'pnpm' }); + + return cwd; + }; + + return async () => { + await browserCtx.close(); + // ...other tear downs + }; + }); + + return { + test, + variants, + 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', { cwd, stdio: 'pipe' }); + + // ...do commands and any other extra stuff + + // build project + execSync('npm run build', { cwd, stdio: 'pipe' }); + + // start preview server `vite preview` + const { url, close } = await startPreview({ cwd }); + + // navigate to the page + await page.goto(url); + + return { url, close }; +} + +/** + * Applies a fixture to the target path + */ +export function fixture({ name, target }: { name: string; target: string }) { + const fixturePath = path.resolve(SETUP_DIR, '..', 'fixtures', name); + if (!fs.existsSync(fixturePath)) { + throw new Error(`Fixture does not exist at: ${fixturePath}`); + } + fs.copyFileSync(fixturePath, target); +} diff --git a/community-adder-template/tests/tests.js b/community-adder-template/tests/tests.js deleted file mode 100644 index 373c556b..00000000 --- a/community-adder-template/tests/tests.js +++ /dev/null @@ -1,16 +0,0 @@ -import { defineAdderTests } from '@sveltejs/cli-core'; -import { options } from '../src/index.js'; - -export const tests = defineAdderTests({ - files: [], - options, - optionValues: [{ demo: true }], - tests: [ - { - name: 'demo test', - run: async ({ elementExists }) => { - await elementExists('.test'); - } - } - ] -}); diff --git a/community-adder-template/vitest.config.js b/community-adder-template/vitest.config.js new file mode 100644 index 00000000..a117d1ca --- /dev/null +++ b/community-adder-template/vitest.config.js @@ -0,0 +1,16 @@ +import { cpus } from 'node:os'; +import { defineConfig } from 'vitest/config'; + +const ONE_MINUTE = 1000 * 60; + +export default defineConfig({ + test: { + include: ['tests/**/*.test.{js,ts}'], + exclude: ['tests/setup/*'], + testTimeout: ONE_MINUTE * 2, + hookTimeout: ONE_MINUTE * 3, + maxConcurrency: cpus().length, + pool: 'forks', + globalSetup: ['tests/setup/global.ts'] + } +}); From d40929afc510d3857d9dbadd9aea88ef50656131 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:20:59 -0500 Subject: [PATCH 20/70] naming --- community-adder-template/tests/custom-addon.test.ts | 2 +- community-adder-template/tests/setup/{index.ts => suite.ts} | 0 packages/adders/_tests/_setup/{setup.ts => suite.ts} | 0 packages/adders/_tests/drizzle/test.ts | 2 +- packages/adders/_tests/eslint/test.ts | 2 +- packages/adders/_tests/lucia/test.ts | 2 +- packages/adders/_tests/mdsvex/test.ts | 2 +- packages/adders/_tests/paraglide/test.ts | 2 +- packages/adders/_tests/playwright/test.ts | 2 +- packages/adders/_tests/prettier/test.ts | 2 +- packages/adders/_tests/storybook/test.ts | 2 +- packages/adders/_tests/tailwindcss/test.ts | 2 +- packages/adders/_tests/vitest/test.ts | 2 +- 13 files changed, 11 insertions(+), 11 deletions(-) rename community-adder-template/tests/setup/{index.ts => suite.ts} (100%) rename packages/adders/_tests/_setup/{setup.ts => suite.ts} (100%) diff --git a/community-adder-template/tests/custom-addon.test.ts b/community-adder-template/tests/custom-addon.test.ts index f18986a6..f3c01b74 100644 --- a/community-adder-template/tests/custom-addon.test.ts +++ b/community-adder-template/tests/custom-addon.test.ts @@ -1,6 +1,6 @@ import path from 'node:path'; import { expect } from '@playwright/test'; -import { fixture, setupTest } from './setup/index.js'; +import { fixture, setupTest } from './setup/suite.js'; import addon from '../src/index.js'; const id = addon.id; diff --git a/community-adder-template/tests/setup/index.ts b/community-adder-template/tests/setup/suite.ts similarity index 100% rename from community-adder-template/tests/setup/index.ts rename to community-adder-template/tests/setup/suite.ts diff --git a/packages/adders/_tests/_setup/setup.ts b/packages/adders/_tests/_setup/suite.ts similarity index 100% rename from packages/adders/_tests/_setup/setup.ts rename to packages/adders/_tests/_setup/suite.ts diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts index 928116d0..48644f7e 100644 --- a/packages/adders/_tests/drizzle/test.ts +++ b/packages/adders/_tests/drizzle/test.ts @@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'; import * as vi from 'vitest'; import { expect } from '@playwright/test'; import { exec } from 'tinyexec'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import drizzle from '../../drizzle/index.ts'; import { pageServer, pageComp } from './fixtures.ts'; diff --git a/packages/adders/_tests/eslint/test.ts b/packages/adders/_tests/eslint/test.ts index a24a7f96..b4bacd0b 100644 --- a/packages/adders/_tests/eslint/test.ts +++ b/packages/adders/_tests/eslint/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import eslint from '../../eslint/index.ts'; const { test, variants, prepareServer } = setupTest({ eslint }); diff --git a/packages/adders/_tests/lucia/test.ts b/packages/adders/_tests/lucia/test.ts index 1dc81acc..5b16d12d 100644 --- a/packages/adders/_tests/lucia/test.ts +++ b/packages/adders/_tests/lucia/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import lucia from '../../lucia/index.ts'; import drizzle from '../../drizzle/index.ts'; diff --git a/packages/adders/_tests/mdsvex/test.ts b/packages/adders/_tests/mdsvex/test.ts index e2d599f8..b4e42d7b 100644 --- a/packages/adders/_tests/mdsvex/test.ts +++ b/packages/adders/_tests/mdsvex/test.ts @@ -4,7 +4,7 @@ import { expect } from '@playwright/test'; import { parseSvelte } from '@sveltejs/cli-core/parsers'; import { imports } from '@sveltejs/cli-core/js'; import * as html from '@sveltejs/cli-core/html'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import mdsvex from '../../mdsvex/index.ts'; const { test, variants, prepareServer } = setupTest({ mdsvex }); diff --git a/packages/adders/_tests/paraglide/test.ts b/packages/adders/_tests/paraglide/test.ts index 99c84d16..e5053e7c 100644 --- a/packages/adders/_tests/paraglide/test.ts +++ b/packages/adders/_tests/paraglide/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import paraglide from '../../paraglide/index.ts'; const { test, variants, prepareServer } = setupTest({ paraglide }); diff --git a/packages/adders/_tests/playwright/test.ts b/packages/adders/_tests/playwright/test.ts index e0cde822..11a0f340 100644 --- a/packages/adders/_tests/playwright/test.ts +++ b/packages/adders/_tests/playwright/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import playwright from '../../playwright/index.ts'; const { test, variants, prepareServer } = setupTest({ playwright }); diff --git a/packages/adders/_tests/prettier/test.ts b/packages/adders/_tests/prettier/test.ts index e33ce87d..7dde97d2 100644 --- a/packages/adders/_tests/prettier/test.ts +++ b/packages/adders/_tests/prettier/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import prettier from '../../prettier/index.ts'; const { test, variants, prepareServer } = setupTest({ prettier }); diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index 36a733e9..a2c0bb54 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import storybook from '../../storybook/index.ts'; const { test, variants, prepareServer } = setupTest({ storybook }); diff --git a/packages/adders/_tests/tailwindcss/test.ts b/packages/adders/_tests/tailwindcss/test.ts index a0f9e730..da0f7717 100644 --- a/packages/adders/_tests/tailwindcss/test.ts +++ b/packages/adders/_tests/tailwindcss/test.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import tailwindcss from '../../tailwindcss/index.ts'; const { test, variants, prepareServer } = setupTest({ tailwindcss }); diff --git a/packages/adders/_tests/vitest/test.ts b/packages/adders/_tests/vitest/test.ts index d0b1ed56..7707a39d 100644 --- a/packages/adders/_tests/vitest/test.ts +++ b/packages/adders/_tests/vitest/test.ts @@ -1,5 +1,5 @@ import { expect } from '@playwright/test'; -import { setupTest } from '../_setup/setup.ts'; +import { setupTest } from '../_setup/suite.ts'; import vitest from '../../vitest-addon/index.ts'; const { test, variants, prepareServer } = setupTest({ vitest }); From 36939bb385a8d4d3955b63b58c46bc353aaa6706 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:33:13 -0500 Subject: [PATCH 21/70] tweaks --- packages/adders/_tests/mdsvex/fixtures.ts | 11 +++++++++++ packages/adders/_tests/mdsvex/test.ts | 15 ++------------- .../adders/_tests/tailwindcss/fixtures.ts | 19 +++++++++++++++++++ packages/adders/_tests/tailwindcss/test.ts | 19 +------------------ 4 files changed, 33 insertions(+), 31 deletions(-) create mode 100644 packages/adders/_tests/mdsvex/fixtures.ts create mode 100644 packages/adders/_tests/tailwindcss/fixtures.ts diff --git a/packages/adders/_tests/mdsvex/fixtures.ts b/packages/adders/_tests/mdsvex/fixtures.ts new file mode 100644 index 00000000..909f8173 --- /dev/null +++ b/packages/adders/_tests/mdsvex/fixtures.ts @@ -0,0 +1,11 @@ +export const svxFile = ` +--- +title: Svex up your markdown +--- + +# { title } + +## Good stuff in your markdown + +Markdown is pretty good but sometimes you just need more. +`; diff --git a/packages/adders/_tests/mdsvex/test.ts b/packages/adders/_tests/mdsvex/test.ts index b4e42d7b..1d2731f3 100644 --- a/packages/adders/_tests/mdsvex/test.ts +++ b/packages/adders/_tests/mdsvex/test.ts @@ -5,6 +5,7 @@ import { parseSvelte } from '@sveltejs/cli-core/parsers'; import { imports } from '@sveltejs/cli-core/js'; import * as html from '@sveltejs/cli-core/html'; import { setupTest } from '../_setup/suite.ts'; +import { svxFile } from './fixtures.ts'; import mdsvex from '../../mdsvex/index.ts'; const { test, variants, prepareServer } = setupTest({ mdsvex }); @@ -24,18 +25,6 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => expect(await page.$('.mdsvex p')).toBeTruthy(); }); -const fixture = ` ---- -title: Svex up your markdown ---- - -# { title } - -## Good stuff in your markdown - -Markdown is pretty good but sometimes you just need more. -`; - function addFixture(cwd: string, variant: string) { let page; let svx; @@ -62,5 +51,5 @@ function addFixture(cwd: string, variant: string) { }); fs.writeFileSync(page, content, 'utf8'); - fs.writeFileSync(svx, fixture, 'utf8'); + fs.writeFileSync(svx, svxFile, 'utf8'); } diff --git a/packages/adders/_tests/tailwindcss/fixtures.ts b/packages/adders/_tests/tailwindcss/fixtures.ts new file mode 100644 index 00000000..737a10fc --- /dev/null +++ b/packages/adders/_tests/tailwindcss/fixtures.ts @@ -0,0 +1,19 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const markup = ` +
+

+
+`; + +export function addFixture(cwd: string, variant: string) { + let page; + if (variant.startsWith('kit')) { + page = path.resolve(cwd, 'src', 'routes', '+page.svelte'); + } else { + page = path.resolve(cwd, 'src', 'App.svelte'); + } + const content = fs.readFileSync(page, 'utf8') + markup; + fs.writeFileSync(page, content, 'utf8'); +} diff --git a/packages/adders/_tests/tailwindcss/test.ts b/packages/adders/_tests/tailwindcss/test.ts index da0f7717..fd90fa0e 100644 --- a/packages/adders/_tests/tailwindcss/test.ts +++ b/packages/adders/_tests/tailwindcss/test.ts @@ -1,16 +1,10 @@ -import fs from 'node:fs'; -import path from 'node:path'; import { expect } from '@playwright/test'; import { setupTest } from '../_setup/suite.ts'; +import { addFixture } from './fixtures.ts'; import tailwindcss from '../../tailwindcss/index.ts'; const { test, variants, prepareServer } = setupTest({ tailwindcss }); -const fixture = ` -
-

-
`; - test.concurrent.for(variants)('none - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { tailwindcss: { plugins: [] } }); @@ -44,14 +38,3 @@ test.concurrent.for(variants)('typography - %s', async (variant, { page, ...ctx await expect(el).toHaveCSS('text-align', 'right'); await expect(el).toHaveCSS('text-decoration-line', 'line-through'); }); - -function addFixture(cwd: string, variant: string) { - let page; - if (variant.startsWith('kit')) { - page = path.resolve(cwd, 'src', 'routes', '+page.svelte'); - } else { - page = path.resolve(cwd, 'src', 'App.svelte'); - } - const content = fs.readFileSync(page, 'utf8') + fixture; - fs.writeFileSync(page, content, 'utf8'); -} From c1b61be0e8378c42338dcaab3b929e2fc7285f69 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:38:36 -0500 Subject: [PATCH 22/70] unneeded --- packages/adders/vitest.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index 05270bc3..e48762e7 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -7,7 +7,6 @@ const ONE_MINUTE = 1000 * 60; export default defineConfig({ test: { include: ['_tests/**/test.{js,ts}'], - exclude: ['_tests/{_setups,_fixtures}/**/*'], testTimeout: ONE_MINUTE * 2, hookTimeout: ONE_MINUTE * 3, maxConcurrency: cpus().length, From 7ae9ad9020faaa033be6cc1a0be697025d2c7ed6 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:23:09 -0500 Subject: [PATCH 23/70] clean --- packages/adders/_tests/_setup/global.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index 42b646d7..5387fb66 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -9,7 +9,7 @@ export default async function ({ provide }: GlobalSetupContext) { // global setup (e.g. spin up docker containers) // downloads different project configurations (sveltekit, js/ts, vite-only, etc) - const { templatesDir } = await setup({ cwd: TEST_DIR, variants }); + const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); provide('testDir', TEST_DIR); provide('templatesDir', templatesDir); From 6adea4d4cc898f3b2dfbfd1f82947fb8c165ac8f Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:19:52 -0500 Subject: [PATCH 24/70] lockfile trickery --- community-adder-template/tests/setup/suite.ts | 2 +- package.json | 22 +++++++++---------- packages/adders/_tests/_setup/suite.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/community-adder-template/tests/setup/suite.ts b/community-adder-template/tests/setup/suite.ts index ba798198..890ab229 100644 --- a/community-adder-template/tests/setup/suite.ts +++ b/community-adder-template/tests/setup/suite.ts @@ -80,7 +80,7 @@ export function setupTest(addons: Addons) { */ async function prepareServer({ cwd, page }: { cwd: string; page: Page }) { // install deps - execSync('pnpm install', { cwd, stdio: 'pipe' }); + execSync('pnpm install --no-frozen-lockfile', { cwd, stdio: 'pipe' }); // ...do commands and any other extra stuff diff --git a/package.json b/package.json index 20fec6d2..3865e4ee 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,20 @@ { "name": "sv-monorepo", - "version": "0.0.1", - "description": "monorepo for sv and friends", "private": true, + "version": "0.0.1", "type": "module", + "description": "monorepo for sv and friends", + "engines": { + "pnpm": "^9.0.0" + }, "scripts": { + "build": "rollup -c", + "changeset:publish": "changeset publish", "check": "pnpm --parallel check", - "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", - "format": "pnpm --parallel format", "dev": "rollup --config --watch", - "build": "rollup -c", - "test": "pnpm --parallel test", - "changeset:publish": "changeset publish" + "format": "pnpm --parallel format", + "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", + "test": "pnpm --parallel test" }, "devDependencies": { "@changesets/cli": "^2.27.9", @@ -40,8 +43,5 @@ "unplugin-isolated-decl": "^0.6.5", "vitest": "^2.0.5" }, - "packageManager": "pnpm@9.7.0", - "engines": { - "pnpm": "^9.0.0" - } + "packageManager": "pnpm@9.7.0" } diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index dc782c5a..71b2a2a8 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -82,7 +82,7 @@ async function prepareServer( page, previewCommand = 'npm run preview', buildCommand = 'npm run build', - installCommand = 'pnpm install' + installCommand = 'pnpm install --no-frozen-lockfile' }: PrepareServerOptions, afterInstall?: () => Promise | any ) { From 266fea45df31215f0b23c7eef86ffce5f5d5508f Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:25:21 -0500 Subject: [PATCH 25/70] fix eslint test --- packages/adders/_tests/eslint/test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/adders/_tests/eslint/test.ts b/packages/adders/_tests/eslint/test.ts index b4bacd0b..6de35cc6 100644 --- a/packages/adders/_tests/eslint/test.ts +++ b/packages/adders/_tests/eslint/test.ts @@ -4,8 +4,7 @@ import eslint from '../../eslint/index.ts'; const { test, variants, prepareServer } = setupTest({ eslint }); -const kitOnly = variants.filter((v) => v.includes('kit')); -test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { +test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { eslint: {} }); const { close } = await prepareServer({ cwd, page }); From 6a139e257605a6cc8ec68e5bfcde978c122f74d0 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:45:12 -0500 Subject: [PATCH 26/70] fix paraglide --- packages/adders/_tests/paraglide/test.ts | 3 +-- packages/cli/lib/install.ts | 10 +++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/adders/_tests/paraglide/test.ts b/packages/adders/_tests/paraglide/test.ts index e5053e7c..2b72898c 100644 --- a/packages/adders/_tests/paraglide/test.ts +++ b/packages/adders/_tests/paraglide/test.ts @@ -5,8 +5,7 @@ import paraglide from '../../paraglide/index.ts'; const { test, variants, prepareServer } = setupTest({ paraglide }); const kitOnly = variants.filter((v) => v.includes('kit')); -// TODO: figure out why this is failing -test.todo.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { +test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { paraglide: { demo: true, availableLanguageTags: 'en' } }); const { close } = await prepareServer({ cwd, page }); diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 7c6e14b8..d234b364 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -40,22 +40,26 @@ export async function installAddon({ return Array.from(filesToFormat); } -async function runAddon(workspace: Workspace, addon: Addon): Promise { +async function runAddon( + workspace: Workspace, + addon: Adder> +): Promise { const files = new Set(); - // TODO: figure out why this is wrongly typed // apply default adder options - for (const [, question] of Object.entries(addon.options as Record)) { + for (const [, question] of Object.entries(addon.options)) { // we'll only apply defaults to options that don't explicitly fail their conditions if (question.condition?.(workspace.options) !== false) { workspace.options ??= question.default; } } + await addon.preInstall?.(workspace); const pkgPath = installPackages(addon, workspace); files.add(pkgPath); const changedFiles = createOrUpdateFiles(addon.files, workspace); changedFiles.forEach((file) => files.add(file)); + await addon.postInstall?.(workspace); for (const script of addon.scripts ?? []) { if (script.condition?.(workspace) === false) continue; From 0fa007f0e6a51861fe0d6ba425b158c820142676 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:57:30 -0500 Subject: [PATCH 27/70] tweak workflow --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1fe314d..9c78aee5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,5 +48,6 @@ jobs: node-version: 18 cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm exec playwright install chrome - run: pnpm build - run: pnpm test From d417939143ee3f013876faa9032103a4de1caf76 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:01:59 -0500 Subject: [PATCH 28/70] ... --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c78aee5..ec94521b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,6 +48,6 @@ jobs: node-version: 18 cache: pnpm - run: pnpm install --frozen-lockfile - - run: pnpm exec playwright install chrome + - run: pnpm exec playwright install - run: pnpm build - run: pnpm test From 19e80da876481cedaf1d38ccbec09de0e413f0b6 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:11:21 -0500 Subject: [PATCH 29/70] fix lint --- .github/workflows/ci.yml | 2 +- eslint.config.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec94521b..328d0750 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,6 +48,6 @@ jobs: node-version: 18 cache: pnpm - run: pnpm install --frozen-lockfile - - run: pnpm exec playwright install + - run: pnpm exec playwright install chromium - run: pnpm build - run: pnpm test diff --git a/eslint.config.js b/eslint.config.js index c6f1bbf0..b3835abe 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -28,10 +28,12 @@ export default [ 'packages/create/scripts/**/*', 'packages/create/templates/**/*', '**/temp/*', - '.test-tmp/**/*', + '.test-tmp/*', + '**/.test-output/*', '**/dist/*', 'packages/**/tests/**/{output,input}.ts', - 'rollup.config.js' + 'rollup.config.js', + 'community-adder-template/*' ] } ]; From b2af1bb78b3ea00fd25ee384eddbebb193fd21d8 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:14:12 -0500 Subject: [PATCH 30/70] fix check --- packages/cli/common.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/common.ts b/packages/cli/common.ts index de39f0a2..3010961b 100644 --- a/packages/cli/common.ts +++ b/packages/cli/common.ts @@ -69,7 +69,7 @@ function formatDescription(arg: Option | Argument): string { type MaybePromise = () => Promise | void; -export async function runCommand(action: MaybePromise) { +export async function runCommand(action: MaybePromise): Promise { try { p.intro(`Welcome to the Svelte CLI! ${pc.gray(`(v${pkg.version})`)}`); await action(); @@ -114,7 +114,7 @@ export async function packageManagerPrompt(cwd: string): Promise { const spinner = p.spinner(); spinner.start('Installing dependencies...'); try { From fa0a992a9f298554327c1d8a30a80af9288c71c8 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 18:59:50 -0500 Subject: [PATCH 31/70] simplify --- community-adder-template/tests/setup/suite.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community-adder-template/tests/setup/suite.ts b/community-adder-template/tests/setup/suite.ts index 890ab229..d8607ec0 100644 --- a/community-adder-template/tests/setup/suite.ts +++ b/community-adder-template/tests/setup/suite.ts @@ -11,7 +11,7 @@ const cwd = vi.inject('testDir'); const templatesDir = vi.inject('templatesDir'); const variants = vi.inject('variants'); -const SETUP_DIR = path.dirname(fileURLToPath(import.meta.url)); +const SETUP_DIR = fileURLToPath(new URL('.', import.meta.url)); type Fixtures = { page: Page; From a9bbe4fe8a92cef8fbc08851451a82d9d80ecae1 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:16:45 -0500 Subject: [PATCH 32/70] simplify --- community-adder-template/vitest.config.js | 6 ++---- packages/adders/vitest.config.ts | 6 ++---- packages/core/tsconfig.json | 3 ++- packages/core/vitest.config.ts | 9 ++++++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/community-adder-template/vitest.config.js b/community-adder-template/vitest.config.js index a117d1ca..0dee885f 100644 --- a/community-adder-template/vitest.config.js +++ b/community-adder-template/vitest.config.js @@ -1,4 +1,3 @@ -import { cpus } from 'node:os'; import { defineConfig } from 'vitest/config'; const ONE_MINUTE = 1000 * 60; @@ -7,10 +6,9 @@ export default defineConfig({ test: { include: ['tests/**/*.test.{js,ts}'], exclude: ['tests/setup/*'], - testTimeout: ONE_MINUTE * 2, + testTimeout: ONE_MINUTE * 3, hookTimeout: ONE_MINUTE * 3, - maxConcurrency: cpus().length, - pool: 'forks', + maxConcurrency: 10, globalSetup: ['tests/setup/global.ts'] } }); diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index e48762e7..8924a20d 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -1,4 +1,3 @@ -import { cpus } from 'node:os'; import { env } from 'node:process'; import { defineConfig } from 'vitest/config'; @@ -7,10 +6,9 @@ const ONE_MINUTE = 1000 * 60; export default defineConfig({ test: { include: ['_tests/**/test.{js,ts}'], - testTimeout: ONE_MINUTE * 2, + testTimeout: ONE_MINUTE * 3, hookTimeout: ONE_MINUTE * 3, - maxConcurrency: cpus().length, - pool: 'forks', + maxConcurrency: 10, globalSetup: ['_tests/_setup/global.ts'], retry: env.CI ? 3 : 0 } diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index a1fcf6c9..9f06a6bc 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -4,5 +4,6 @@ "checkJs": false, "isolatedDeclarations": true, "declaration": true - } + }, + "include": ["index.ts"] } diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts index 5387a327..669f2a8e 100644 --- a/packages/core/vitest.config.ts +++ b/packages/core/vitest.config.ts @@ -1,5 +1,8 @@ -import { defineConfig, type UserConfig } from 'vitest/config'; +import { defineConfig } from 'vitest/config'; export default defineConfig({ - test: { dir: './tests', include: ['./**/index.ts'] } -}) as UserConfig; + test: { + dir: './tests', + include: ['./**/index.ts'] + } +}); From a76f89b891080c53f6dd18e977d3f3cacc8cf9f7 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:42:37 -0500 Subject: [PATCH 33/70] upgrade vitest --- community-adder-template/package.json | 2 +- package.json | 4 +- packages/adders/package.json | 2 +- packages/cli/package.json | 2 +- packages/migrate/package.json | 3 +- pnpm-lock.yaml | 887 +++++++++++++++----------- 6 files changed, 514 insertions(+), 386 deletions(-) diff --git a/community-adder-template/package.json b/community-adder-template/package.json index f53952ad..428d0913 100644 --- a/community-adder-template/package.json +++ b/community-adder-template/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@playwright/test": "^1.48.2", "sv": "workspace:*", - "vitest": "^2.0.5" + "vitest": "^2.1.4" }, "keywords": [ "svelte-add-on", diff --git a/package.json b/package.json index 3865e4ee..58bd13dd 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@sveltejs/eslint-config": "^8.1.0", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "@types/node": "^22.3.0", - "@vitest/ui": "^2.0.5", + "@vitest/ui": "^2.1.4", "eslint": "^9.10.0", "magic-string": "^0.30.11", "prettier": "^3.3.3", @@ -41,7 +41,7 @@ "typescript": "^5.6.2", "typescript-eslint": "^8.5.0", "unplugin-isolated-decl": "^0.6.5", - "vitest": "^2.0.5" + "vitest": "^2.1.4" }, "packageManager": "pnpm@9.7.0" } diff --git a/packages/adders/package.json b/packages/adders/package.json index d366fd1e..42394993 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -14,6 +14,6 @@ "@sveltejs/cli-core": "workspace:*" }, "devDependencies": { - "tinyexec": "^0.3.0" + "tinyexec": "^0.3.1" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index fbb69af5..32d36dcf 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -43,7 +43,7 @@ "picocolors": "^1.1.0", "tar-fs": "^3.0.6", "terminate": "^2.8.0", - "tinyexec": "^0.3.0", + "tinyexec": "^0.3.1", "valibot": "^0.41.0" }, "keywords": [ diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 83253197..e56d96c9 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -41,8 +41,7 @@ "@types/node": "^18.19.48", "@types/prompts": "^2.4.9", "@types/semver": "^7.5.6", - "svelte": "^4.2.10", - "vitest": "^2.0.1" + "svelte": "^4.2.10" }, "keywords": [ "migration", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62dc5763..f1a43bd9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,16 +31,16 @@ importers: version: link:packages/create '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.8.0(eslint@9.10.0))(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint-plugin-n@17.10.2(eslint@9.10.0))(eslint-plugin-svelte@2.43.0(eslint@9.10.0)(svelte@5.0.0))(eslint@9.10.0)(typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.2))(typescript@5.6.2) + version: 8.1.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.10.0))(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint-plugin-n@17.13.1(eslint@9.10.0))(eslint-plugin-svelte@2.46.0(eslint@9.10.0)(svelte@5.0.0))(eslint@9.10.0)(typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 '@types/node': specifier: ^22.3.0 - version: 22.5.4 + version: 22.9.0 '@vitest/ui': - specifier: ^2.0.5 - version: 2.0.5(vitest@2.0.5) + specifier: ^2.1.4 + version: 2.1.4(vitest@2.1.4) eslint: specifier: ^9.10.0 version: 9.10.0 @@ -61,7 +61,7 @@ importers: version: 4.21.2 rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.21.5)(rollup@4.21.2) + version: 6.1.1(esbuild@0.24.0)(rollup@4.21.2) rollup-plugin-preserve-shebangs: specifier: ^0.2.0 version: 0.2.0(rollup@4.21.2) @@ -73,16 +73,16 @@ importers: version: 5.0.0 typescript: specifier: ^5.6.2 - version: 5.6.2 + version: 5.6.3 typescript-eslint: specifier: ^8.5.0 - version: 8.5.0(eslint@9.10.0)(typescript@5.6.2) + version: 8.5.0(eslint@9.10.0)(typescript@5.6.3) unplugin-isolated-decl: specifier: ^0.6.5 - version: 0.6.5(rollup@4.21.2)(typescript@5.6.2)(webpack-sources@3.2.3) + version: 0.6.5(rollup@4.21.2)(typescript@5.6.3)(webpack-sources@3.2.3) vitest: - specifier: ^2.0.5 - version: 2.0.5(@types/node@22.5.4)(@vitest/ui@2.0.5) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(@vitest/ui@2.1.4) community-adder-template: dependencies: @@ -97,8 +97,8 @@ importers: specifier: workspace:* version: link:../packages/cli vitest: - specifier: ^2.0.5 - version: 2.0.5(@types/node@22.5.4)(@vitest/ui@2.0.5) + specifier: ^2.1.4 + version: 2.1.4(@types/node@22.9.0)(@vitest/ui@2.1.4) packages/adders: dependencies: @@ -107,8 +107,8 @@ importers: version: link:../core devDependencies: tinyexec: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.3.1 + version: 0.3.1 packages/ast-tooling: devDependencies: @@ -132,7 +132,7 @@ importers: version: 9.1.0 postcss: specifier: ^8.4.38 - version: 8.4.45 + version: 8.4.47 recast: specifier: ^0.23.7 version: 0.23.9 @@ -147,7 +147,7 @@ importers: devDependencies: picocolors: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 sisteransi: specifier: ^1.0.5 version: 1.0.5 @@ -165,7 +165,7 @@ importers: version: 1.3.0 picocolors: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 sisteransi: specifier: ^1.0.5 version: 1.0.5 @@ -204,7 +204,7 @@ importers: version: 0.2.2 picocolors: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 tar-fs: specifier: ^3.0.6 version: 3.0.6 @@ -212,11 +212,11 @@ importers: specifier: ^2.8.0 version: 2.8.0 tinyexec: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.3.1 + version: 0.3.1 valibot: specifier: ^0.41.0 - version: 0.41.0(typescript@5.6.2) + version: 0.41.0(typescript@5.6.3) packages/core: dependencies: @@ -238,7 +238,7 @@ importers: version: 0.30.12 picocolors: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 packages/create: devDependencies: @@ -280,7 +280,7 @@ importers: version: 24.0.0 typescript: specifier: ^5.3.3 - version: 5.6.2 + version: 5.6.3 zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -297,9 +297,6 @@ importers: svelte: specifier: ^4.2.10 version: 4.2.19 - vitest: - specifier: ^2.0.1 - version: 2.0.5(@types/node@18.19.64)(@vitest/ui@2.0.5) packages: @@ -392,146 +389,290 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.18.0': @@ -783,8 +924,8 @@ packages: cpu: [x64] os: [win32] - '@stylistic/eslint-plugin-js@2.8.0': - resolution: {integrity: sha512-/e7pSzVMrwBd6yzSDsKHwax3TS96+pd/xSKzELaTkOuYqUhYfj/becWdfDbFSBGQD7BBBCiiE4L8L2cUfu5h+A==} + '@stylistic/eslint-plugin-js@2.10.1': + resolution: {integrity: sha512-IikL/RKy9Sk2UMDUUpqrEcwDeYzUEt6SaL2/UVCFuVQxKACHSgStT0NxXkxZmBOUforaU52FPf2Su07FYH5s5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' @@ -822,8 +963,8 @@ packages: '@types/node@18.19.64': resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} @@ -897,28 +1038,39 @@ packages: resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@2.1.4': + resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} + + '@vitest/mocker@2.1.4': + resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/pretty-format@2.1.4': + resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} - '@vitest/runner@2.0.5': - resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/runner@2.1.4': + resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} - '@vitest/snapshot@2.0.5': - resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/snapshot@2.1.4': + resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@2.1.4': + resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} - '@vitest/ui@2.0.5': - resolution: {integrity: sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==} + '@vitest/ui@2.1.4': + resolution: {integrity: sha512-Zd9e5oU063c+j9N9XzGJagCLNvG71x/2tOme3Js4JEZKX55zsgxhJwUgLI8hkN6NjMLpdJO8d7nVUUuPGAA58Q==} peerDependencies: - vitest: 2.0.5 + vitest: 2.1.4 - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@vitest/utils@2.1.4': + resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -930,8 +1082,8 @@ packages: peerDependencies: acorn: '>=8.9.0' - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -1038,8 +1190,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} chalk@4.1.2: @@ -1212,6 +1364,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1234,18 +1391,18 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-n@17.10.2: - resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==} + eslint-plugin-n@17.13.1: + resolution: {integrity: sha512-97qzhk1z3DdSJNCqT45EslwCu5+LB9GDadSyBItgKUfGsXAmN/aa7LRQ0ZxHffUxUzvgbTPJL27/pE9ZQWHy7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-svelte@2.43.0: - resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==} + eslint-plugin-svelte@2.46.0: + resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -1262,8 +1419,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.10.0: @@ -1279,8 +1436,8 @@ packages: esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -1320,9 +1477,9 @@ packages: event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1412,19 +1569,12 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-tsconfig@4.8.0: - resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} @@ -1449,8 +1599,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -1487,10 +1637,6 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1551,10 +1697,6 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -1604,8 +1746,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -1635,8 +1777,8 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1656,9 +1798,6 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1667,10 +1806,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1713,10 +1848,6 @@ packages: encoding: optional: true - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1724,10 +1855,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1791,10 +1918,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -1819,8 +1942,8 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1876,8 +1999,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2020,9 +2143,9 @@ packages: silver-fleece@1.2.1: resolution: {integrity: sha512-GwiBh7LzX4aKWb3LH1tPu8et2zZqe1cwXn+/uwIUK+H1Y2k119qpvPelVdRKG/6+RQvtUdRep4mBOOVf80VYDA==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2095,10 +2218,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2116,11 +2235,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-eslint-parser@0.41.0: - resolution: {integrity: sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==} + svelte-eslint-parser@0.43.0: + resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -2180,8 +2299,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} @@ -2246,8 +2365,8 @@ packages: typescript: optional: true - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -2299,8 +2418,8 @@ packages: typescript: optional: true - vite-node@2.0.5: - resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + vite-node@2.1.4: + resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -2335,15 +2454,15 @@ packages: terser: optional: true - vitest@2.0.5: - resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + vitest@2.1.4: + resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.5 - '@vitest/ui': 2.0.5 + '@vitest/browser': 2.1.4 + '@vitest/ui': 2.1.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2495,7 +2614,7 @@ snapshots: mri: 1.2.0 p-limit: 2.3.0 package-manager-detector: 0.2.2 - picocolors: 1.1.0 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 spawndamnit: 2.0.0 @@ -2519,7 +2638,7 @@ snapshots: dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 + picocolors: 1.1.1 semver: 7.6.3 '@changesets/get-github-info@0.5.2': @@ -2550,7 +2669,7 @@ snapshots: '@changesets/logger@0.1.1': dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/parse@0.4.0': dependencies: @@ -2572,7 +2691,7 @@ snapshots: '@changesets/types': 6.0.0 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/should-skip-package@0.1.1': dependencies: @@ -2593,78 +2712,150 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.24.0': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.24.0': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.24.0': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.24.0': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.24.0': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.24.0': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.24.0': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.24.0': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.24.0': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.24.0': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.24.0': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.24.0': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.24.0': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.24.0': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)': + '@esbuild/win32-x64@0.24.0': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.10.0)': dependencies: eslint: 9.10.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.18.0': dependencies: @@ -2678,7 +2869,7 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 10.1.0 + espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -2883,22 +3074,22 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true - '@stylistic/eslint-plugin-js@2.8.0(eslint@9.10.0)': + '@stylistic/eslint-plugin-js@2.10.1(eslint@9.10.0)': dependencies: eslint: 9.10.0 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.8.0(eslint@9.10.0))(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint-plugin-n@17.10.2(eslint@9.10.0))(eslint-plugin-svelte@2.43.0(eslint@9.10.0)(svelte@5.0.0))(eslint@9.10.0)(typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.2))(typescript@5.6.2)': + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.10.1(eslint@9.10.0))(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint-plugin-n@17.13.1(eslint@9.10.0))(eslint-plugin-svelte@2.46.0(eslint@9.10.0)(svelte@5.0.0))(eslint@9.10.0)(typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.8.0(eslint@9.10.0) + '@stylistic/eslint-plugin-js': 2.10.1(eslint@9.10.0) eslint: 9.10.0 eslint-config-prettier: 9.1.0(eslint@9.10.0) - eslint-plugin-n: 17.10.2(eslint@9.10.0) - eslint-plugin-svelte: 2.43.0(eslint@9.10.0)(svelte@5.0.0) - globals: 15.9.0 - typescript: 5.6.2 - typescript-eslint: 8.5.0(eslint@9.10.0)(typescript@5.6.2) + eslint-plugin-n: 17.13.1(eslint@9.10.0) + eslint-plugin-svelte: 2.46.0(eslint@9.10.0)(svelte@5.0.0) + globals: 15.12.0 + typescript: 5.6.3 + typescript-eslint: 8.5.0(eslint@9.10.0)(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact@1.1.0': dependencies: @@ -2925,13 +3116,13 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.5.4': + '@types/node@22.9.0': dependencies: undici-types: 6.19.8 '@types/prompts@2.4.9': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.9.0 kleur: 3.0.3 '@types/resolve@1.20.2': {} @@ -2940,41 +3131,41 @@ snapshots: '@types/tar-fs@2.0.4': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.9.0 '@types/tar-stream': 3.1.3 '@types/tar-stream@3.1.3': dependencies: - '@types/node': 22.5.4 + '@types/node': 22.9.0 - '@typescript-eslint/eslint-plugin@8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.3))(eslint@9.10.0)(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.5.0 - '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.5.0 eslint: 9.10.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.5.0 '@typescript-eslint/types': 8.5.0 - '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.5.0 debug: 4.3.7 eslint: 9.10.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -2983,21 +3174,21 @@ snapshots: '@typescript-eslint/types': 8.5.0 '@typescript-eslint/visitor-keys': 8.5.0 - '@typescript-eslint/type-utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.5.0(eslint@9.10.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.3) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color '@typescript-eslint/types@8.5.0': {} - '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.5.0 '@typescript-eslint/visitor-keys': 8.5.0 @@ -3006,18 +3197,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.10.0) '@typescript-eslint/scope-manager': 8.5.0 '@typescript-eslint/types': 8.5.0 - '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.3) eslint: 9.10.0 transitivePeerDependencies: - supports-color @@ -3028,59 +3219,66 @@ snapshots: '@typescript-eslint/types': 8.5.0 eslint-visitor-keys: 3.4.3 - '@vitest/expect@2.0.5': + '@vitest/expect@2.1.4': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.1 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.0.5': + '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.9.0))': + dependencies: + '@vitest/spy': 2.1.4 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.10(@types/node@22.9.0) + + '@vitest/pretty-format@2.1.4': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.0.5': + '@vitest/runner@2.1.4': dependencies: - '@vitest/utils': 2.0.5 + '@vitest/utils': 2.1.4 pathe: 1.1.2 - '@vitest/snapshot@2.0.5': + '@vitest/snapshot@2.1.4': dependencies: - '@vitest/pretty-format': 2.0.5 + '@vitest/pretty-format': 2.1.4 magic-string: 0.30.12 pathe: 1.1.2 - '@vitest/spy@2.0.5': + '@vitest/spy@2.1.4': dependencies: tinyspy: 3.0.2 - '@vitest/ui@2.0.5(vitest@2.0.5)': + '@vitest/ui@2.1.4(vitest@2.1.4)': dependencies: - '@vitest/utils': 2.0.5 - fast-glob: 3.3.2 + '@vitest/utils': 2.1.4 fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 - sirv: 2.0.4 + sirv: 3.0.0 + tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@22.5.4)(@vitest/ui@2.0.5) + vitest: 2.1.4(@types/node@22.9.0)(@vitest/ui@2.1.4) - '@vitest/utils@2.0.5': + '@vitest/utils@2.1.4': dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 - loupe: 3.1.1 + '@vitest/pretty-format': 2.1.4 + loupe: 3.1.2 tinyrainbow: 1.2.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn-typescript@1.4.13(acorn@8.12.1): + acorn-typescript@1.4.13(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn@8.12.1: {} + acorn@8.14.0: {} ajv@6.12.6: dependencies: @@ -3174,12 +3372,12 @@ snapshots: callsites@3.1.0: {} - chai@5.1.1: + chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.1 + loupe: 3.1.2 pathval: 2.0.0 chalk@4.1.2: @@ -3199,7 +3397,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 - acorn: 8.12.1 + acorn: 8.14.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -3338,6 +3536,33 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.10.0): @@ -3351,37 +3576,37 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.10.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.10.0) + '@eslint-community/regexpp': 4.12.1 eslint: 9.10.0 eslint-compat-utils: 0.5.1(eslint@9.10.0) - eslint-plugin-n@17.10.2(eslint@9.10.0): + eslint-plugin-n@17.13.1(eslint@9.10.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.10.0) enhanced-resolve: 5.17.1 eslint: 9.10.0 eslint-plugin-es-x: 7.8.0(eslint@9.10.0) - get-tsconfig: 4.8.0 - globals: 15.9.0 + get-tsconfig: 4.8.1 + globals: 15.12.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-svelte@2.43.0(eslint@9.10.0)(svelte@5.0.0): + eslint-plugin-svelte@2.46.0(eslint@9.10.0)(svelte@5.0.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.10.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.10.0 eslint-compat-utils: 0.5.1(eslint@9.10.0) esutils: 2.0.3 - known-css-properties: 0.34.0 - postcss: 8.4.45 - postcss-load-config: 3.1.4(postcss@8.4.45) - postcss-safe-parser: 6.0.0(postcss@8.4.45) + known-css-properties: 0.35.0 + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47) + postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.41.0(svelte@5.0.0) + svelte-eslint-parser: 0.43.0(svelte@5.0.0) optionalDependencies: svelte: 5.0.0 transitivePeerDependencies: @@ -3399,12 +3624,12 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.2.0: {} eslint@9.10.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.10.0) + '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 '@eslint/eslintrc': 3.1.0 '@eslint/js': 9.10.0 @@ -3418,8 +3643,8 @@ snapshots: debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3442,16 +3667,16 @@ snapshots: esm-env@1.0.0: {} - espree@10.1.0: + espree@10.3.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -3489,17 +3714,7 @@ snapshots: stream-combiner: 0.0.4 through: 2.3.8 - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + expect-type@1.1.0: {} extendable-error@0.1.7: {} @@ -3587,13 +3802,9 @@ snapshots: function-bind@1.1.2: {} - get-func-name@2.0.2: {} - get-stdin@9.0.0: {} - get-stream@8.0.1: {} - - get-tsconfig@4.8.0: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -3620,7 +3831,7 @@ snapshots: globals@14.0.0: {} - globals@15.9.0: {} + globals@15.12.0: {} globalyzer@0.1.0: {} @@ -3662,8 +3873,6 @@ snapshots: human-id@1.0.2: {} - human-signals@5.0.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -3711,8 +3920,6 @@ snapshots: dependencies: '@types/estree': 1.0.5 - is-stream@3.0.0: {} - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -3756,7 +3963,7 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.35.0: {} levn@0.4.1: dependencies: @@ -3781,9 +3988,7 @@ snapshots: lodash.startcase@4.4.0: {} - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.2: {} lru-cache@10.4.3: {} @@ -3804,8 +4009,6 @@ snapshots: mdn-data@2.0.30: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -3813,8 +4016,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-fn@4.0.0: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -3845,20 +4046,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - object-assign@4.1.1: {} once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3921,8 +4114,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -3946,7 +4137,7 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -3964,30 +4155,30 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - postcss-load-config@3.1.4(postcss@8.4.45): + postcss-load-config@3.1.4(postcss@8.4.47): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-safe-parser@6.0.0(postcss@8.4.45): + postcss-safe-parser@6.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-scss@4.0.9(postcss@8.4.45): + postcss-scss@4.0.9(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.45: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -4061,13 +4252,13 @@ snapshots: reusify@1.0.4: {} - rollup-plugin-esbuild@6.1.1(esbuild@0.21.5)(rollup@4.21.2): + rollup-plugin-esbuild@6.1.1(esbuild@0.24.0)(rollup@4.21.2): dependencies: '@rollup/pluginutils': 5.1.2(rollup@4.21.2) debug: 4.3.7 es-module-lexer: 1.5.4 - esbuild: 0.21.5 - get-tsconfig: 4.8.0 + esbuild: 0.24.0 + get-tsconfig: 4.8.1 rollup: 4.21.2 transitivePeerDependencies: - supports-color @@ -4127,7 +4318,7 @@ snapshots: silver-fleece@1.2.1: {} - sirv@2.0.4: + sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 @@ -4207,8 +4398,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-json-comments@3.1.1: {} sucrase@3.35.0: @@ -4227,13 +4416,13 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-eslint-parser@0.41.0(svelte@5.0.0): + svelte-eslint-parser@0.43.0(svelte@5.0.0): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.45 - postcss-scss: 4.0.9(postcss@8.4.45) + postcss: 8.4.47 + postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: svelte: 5.0.0 @@ -4243,7 +4432,7 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 - acorn: 8.12.1 + acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 code-red: 1.0.4 @@ -4259,8 +4448,8 @@ snapshots: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.5 - acorn: 8.12.1 - acorn-typescript: 1.4.13(acorn@8.12.1) + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 esm-env: 1.0.0 @@ -4322,7 +4511,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.0: {} + tinyexec@0.3.1: {} tinyglobby@0.2.10: dependencies: @@ -4349,9 +4538,9 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.6.2 + typescript: 5.6.3 ts-interface-checker@0.1.13: {} @@ -4366,18 +4555,18 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.2): + typescript-eslint@8.5.0(eslint@9.10.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.3))(eslint@9.10.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - typescript@5.6.2: {} + typescript@5.6.3: {} undici-types@5.26.5: {} @@ -4385,21 +4574,21 @@ snapshots: universalify@0.1.2: {} - unplugin-isolated-decl@0.6.5(rollup@4.21.2)(typescript@5.6.2)(webpack-sources@3.2.3): + unplugin-isolated-decl@0.6.5(rollup@4.21.2)(typescript@5.6.3)(webpack-sources@3.2.3): dependencies: '@rollup/pluginutils': 5.1.2(rollup@4.21.2) magic-string: 0.30.12 oxc-parser: 0.30.3 unplugin: 1.14.1(webpack-sources@3.2.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - rollup - webpack-sources unplugin@1.14.1(webpack-sources@3.2.3): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 webpack-virtual-modules: 0.6.2 optionalDependencies: webpack-sources: 3.2.3 @@ -4410,35 +4599,16 @@ snapshots: util-deprecate@1.0.2: {} - valibot@0.41.0(typescript@5.6.2): + valibot@0.41.0(typescript@5.6.3): optionalDependencies: - typescript: 5.6.2 - - vite-node@2.0.5(@types/node@18.19.64): - dependencies: - cac: 6.7.14 - debug: 4.3.7 - pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@18.19.64) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser + typescript: 5.6.3 - vite-node@2.0.5(@types/node@22.5.4): + vite-node@2.1.4(@types/node@22.9.0): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@22.5.4) + vite: 5.4.10(@types/node@22.9.0) transitivePeerDependencies: - '@types/node' - less @@ -4450,85 +4620,44 @@ snapshots: - supports-color - terser - vite@5.4.10(@types/node@18.19.64): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.45 - rollup: 4.21.2 - optionalDependencies: - '@types/node': 18.19.64 - fsevents: 2.3.3 - - vite@5.4.10(@types/node@22.5.4): + vite@5.4.10(@types/node@22.9.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.45 + postcss: 8.4.47 rollup: 4.21.2 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.9.0 fsevents: 2.3.3 - vitest@2.0.5(@types/node@18.19.64)(@vitest/ui@2.0.5): + vitest@2.1.4(@types/node@22.9.0)(@vitest/ui@2.1.4): dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.5 - '@vitest/pretty-format': 2.0.5 - '@vitest/runner': 2.0.5 - '@vitest/snapshot': 2.0.5 - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.1 - debug: 4.3.7 - execa: 8.0.1 - magic-string: 0.30.12 - pathe: 1.1.2 - std-env: 3.7.0 - tinybench: 2.9.0 - tinypool: 1.0.1 - tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@18.19.64) - vite-node: 2.0.5(@types/node@18.19.64) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 18.19.64 - '@vitest/ui': 2.0.5(vitest@2.0.5) - transitivePeerDependencies: - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vitest@2.0.5(@types/node@22.5.4)(@vitest/ui@2.0.5): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.5 - '@vitest/pretty-format': 2.0.5 - '@vitest/runner': 2.0.5 - '@vitest/snapshot': 2.0.5 - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.1 + '@vitest/expect': 2.1.4 + '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.9.0)) + '@vitest/pretty-format': 2.1.4 + '@vitest/runner': 2.1.4 + '@vitest/snapshot': 2.1.4 + '@vitest/spy': 2.1.4 + '@vitest/utils': 2.1.4 + chai: 5.1.2 debug: 4.3.7 - execa: 8.0.1 + expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 + tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@22.5.4) - vite-node: 2.0.5(@types/node@22.5.4) + vite: 5.4.10(@types/node@22.9.0) + vite-node: 2.1.4(@types/node@22.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.5.4 - '@vitest/ui': 2.0.5(vitest@2.0.5) + '@types/node': 22.9.0 + '@vitest/ui': 2.1.4(vitest@2.1.4) transitivePeerDependencies: - less - lightningcss + - msw - sass - sass-embedded - stylus From 55afcbecc9a870e89bc3cc3b9181f13e0a3e84c5 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:43:04 -0500 Subject: [PATCH 34/70] fix nit --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7d6f6845..b87fdf1f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ vite.config.js.timestamp-* /packages/create-svelte/template/CHANGELOG.md .test-tmp .test-output - -*storybook.log \ No newline at end of file +*storybook.log From e6386a706b3c9067ce3a186f6a755be950dc8b78 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:54:12 -0500 Subject: [PATCH 35/70] fix lint --- packages/adders/_tests/_setup/suite.ts | 2 +- packages/adders/drizzle/index.ts | 6 ++-- packages/adders/lucia/index.ts | 48 +++++++++++++------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 71b2a2a8..e5bb4c91 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -37,7 +37,7 @@ export function setupTest(addons: Addons) { // creates a pnpm workspace in each addon dir fs.writeFileSync( path.resolve(cwd, testName, 'pnpm-workspace.yaml'), - `packages:\n - '**/*'`, + "packages:\n - '**/*'", 'utf8' ); }); diff --git a/packages/adders/drizzle/index.ts b/packages/adders/drizzle/index.ts index 31794408..69a15b9c 100644 --- a/packages/adders/drizzle/index.ts +++ b/packages/adders/drizzle/index.ts @@ -204,7 +204,7 @@ export default defineAdder({ imports.addNamed(ast, 'drizzle-kit', { defineConfig: 'defineConfig' }); const envCheckStatement = common.statementFromString( - `if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set');` + "if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set');" ); common.addStatement(ast, envCheckStatement); @@ -306,7 +306,7 @@ export default defineAdder({ // env var checks const dbURLCheck = common.statementFromString( - `if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set');` + "if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set');" ); common.addStatement(ast, dbURLCheck); @@ -326,7 +326,7 @@ export default defineAdder({ imports.addNamed(ast, '$app/environment', { dev: 'dev' }); // auth token check in prod const authTokenCheck = common.statementFromString( - `if (!dev && !env.DATABASE_AUTH_TOKEN) throw new Error('DATABASE_AUTH_TOKEN is not set');` + "if (!dev && !env.DATABASE_AUTH_TOKEN) throw new Error('DATABASE_AUTH_TOKEN is not set');" ); common.addStatement(ast, authTokenCheck); diff --git a/packages/adders/lucia/index.ts b/packages/adders/lucia/index.ts index 5a498e4b..18e9aaa7 100644 --- a/packages/adders/lucia/index.ts +++ b/packages/adders/lucia/index.ts @@ -121,21 +121,21 @@ export default defineAdder({ integer: 'integer' }); object.overrideProperties(userAttributes, { - id: common.expressionFromString(`text('id').primaryKey()`) + id: common.expressionFromString("text('id').primaryKey()") }); if (options.demo) { object.overrideProperties(userAttributes, { - username: common.expressionFromString(`text('username').notNull().unique()`), - passwordHash: common.expressionFromString(`text('password_hash').notNull()`) + username: common.expressionFromString("text('username').notNull().unique()"), + passwordHash: common.expressionFromString("text('password_hash').notNull()") }); } object.overrideProperties(sessionAttributes, { - id: common.expressionFromString(`text('id').primaryKey()`), + id: common.expressionFromString("text('id').primaryKey()"), userId: common.expressionFromString( - `text('user_id').notNull().references(() => user.id)` + "text('user_id').notNull().references(() => user.id)" ), expiresAt: common.expressionFromString( - `integer('expires_at', { mode: 'timestamp' }).notNull()` + "integer('expires_at', { mode: 'timestamp' }).notNull()" ) }); } @@ -146,24 +146,24 @@ export default defineAdder({ datetime: 'datetime' }); object.overrideProperties(userAttributes, { - id: common.expressionFromString(`varchar('id', { length: 255 }).primaryKey()`) + id: common.expressionFromString("varchar('id', { length: 255 }).primaryKey()") }); if (options.demo) { object.overrideProperties(userAttributes, { username: common.expressionFromString( - `varchar('username', { length: 32 }).notNull().unique()` + "varchar('username', { length: 32 }).notNull().unique()" ), passwordHash: common.expressionFromString( - `varchar('password_hash', { length: 255 }).notNull()` + "varchar('password_hash', { length: 255 }).notNull()" ) }); } object.overrideProperties(sessionAttributes, { - id: common.expressionFromString(`varchar('id', { length: 255 }).primaryKey()`), + id: common.expressionFromString("varchar('id', { length: 255 }).primaryKey()"), userId: common.expressionFromString( - `varchar('user_id', { length: 255 }).notNull().references(() => user.id)` + "varchar('user_id', { length: 255 }).notNull().references(() => user.id)" ), - expiresAt: common.expressionFromString(`datetime('expires_at').notNull()`) + expiresAt: common.expressionFromString("datetime('expires_at').notNull()") }); } if (drizzleDialect === 'postgresql') { @@ -173,21 +173,21 @@ export default defineAdder({ timestamp: 'timestamp' }); object.overrideProperties(userAttributes, { - id: common.expressionFromString(`text('id').primaryKey()`) + id: common.expressionFromString("text('id').primaryKey()") }); if (options.demo) { object.overrideProperties(userAttributes, { - username: common.expressionFromString(`text('username').notNull().unique()`), - passwordHash: common.expressionFromString(`text('password_hash').notNull()`) + username: common.expressionFromString("text('username').notNull().unique()"), + passwordHash: common.expressionFromString("text('password_hash').notNull()") }); } object.overrideProperties(sessionAttributes, { - id: common.expressionFromString(`text('id').primaryKey()`), + id: common.expressionFromString("text('id').primaryKey()"), userId: common.expressionFromString( - `text('user_id').notNull().references(() => user.id)` + "text('user_id').notNull().references(() => user.id)" ), expiresAt: common.expressionFromString( - `timestamp('expires_at', { withTimezone: true, mode: 'date' }).notNull()` + "timestamp('expires_at', { withTimezone: true, mode: 'date' }).notNull()" ) }); } @@ -396,7 +396,7 @@ export default defineAdder({ import * as auth from '$lib/server/auth'; import { db } from '$lib/server/db'; import * as table from '$lib/server/db/schema'; - ${ts(`import type { Actions, PageServerLoad } from './$types';\n`)} + ${ts("import type { Actions, PageServerLoad } from './$types';\n")} export const load${ts(': PageServerLoad')} = async (event) => { if (event.locals.user) { return redirect(302, '/demo/lucia'); @@ -516,9 +516,9 @@ export default defineAdder({ const svelte5 = !!dependencyVersion('svelte')?.startsWith('5'); const [ts, s5] = utils.createPrinter(typescript, svelte5); return dedent` - @@ -555,7 +555,7 @@ export default defineAdder({ return dedent` import * as auth from '$lib/server/auth'; import { fail, redirect } from '@sveltejs/kit'; - ${ts(`import type { Actions, PageServerLoad } from './$types';\n`)} + ${ts("import type { Actions, PageServerLoad } from './$types';\n")} export const load${ts(': PageServerLoad')} = async (event) => { if (!event.locals.user) { return redirect(302, '/demo/lucia/login'); @@ -590,9 +590,9 @@ export default defineAdder({ const svelte5 = !!dependencyVersion('svelte')?.startsWith('5'); const [ts, s5] = utils.createPrinter(typescript, svelte5); return dedent` - From 6a1d29f06ba613d73f9340c4f3249b693f213408 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:16:54 -0500 Subject: [PATCH 36/70] simplify --- packages/adders/_tests/drizzle/test.ts | 18 +++++++----------- packages/adders/package.json | 3 --- pnpm-lock.yaml | 4 ---- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts index 48644f7e..3b067c1a 100644 --- a/packages/adders/_tests/drizzle/test.ts +++ b/packages/adders/_tests/drizzle/test.ts @@ -1,25 +1,21 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { execSync } from 'node:child_process'; import * as vi from 'vitest'; import { expect } from '@playwright/test'; -import { exec } from 'tinyexec'; import { setupTest } from '../_setup/suite.ts'; import drizzle from '../../drizzle/index.ts'; import { pageServer, pageComp } from './fixtures.ts'; const { test, variants, prepareServer } = setupTest({ drizzle }); -vi.beforeAll(async () => { +vi.beforeAll(() => { const cwd = path.dirname(fileURLToPath(import.meta.url)); - await exec('docker', ['compose', 'up', '--detach'], { - nodeOptions: { cwd, stdio: 'pipe' } - }); + execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); - return async () => { - await exec('docker', ['compose', 'down', '--volumes'], { - nodeOptions: { cwd, stdio: 'pipe' } - }); + return () => { + execSync('docker compose down --volumes', { cwd, stdio: 'pipe' }); }; }); @@ -51,8 +47,8 @@ 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 }, async () => { - await exec('npm', ['run', 'db:push'], { nodeOptions: { cwd, stdio: 'pipe' } }); + const { close } = await prepareServer({ cwd, page }, () => { + execSync('npm run db:push', { cwd, stdio: 'pipe' }); }); // kill server process when we're done ctx.onTestFinished(() => close()); diff --git a/packages/adders/package.json b/packages/adders/package.json index 42394993..39023993 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -12,8 +12,5 @@ "exports": "./index.ts", "dependencies": { "@sveltejs/cli-core": "workspace:*" - }, - "devDependencies": { - "tinyexec": "^0.3.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1a43bd9..0a4ff418 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,10 +105,6 @@ importers: '@sveltejs/cli-core': specifier: workspace:* version: link:../core - devDependencies: - tinyexec: - specifier: ^0.3.1 - version: 0.3.1 packages/ast-tooling: devDependencies: From 1e5be34e48df87835883947df29db6b01085a393 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:38:50 -0500 Subject: [PATCH 37/70] cleanup --- eslint.config.js | 2 +- packages/adders/_tests/_setup/global.ts | 6 ------ packages/adders/_tests/_setup/suite.ts | 2 +- packages/cli/testing.ts | 3 +-- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index b3835abe..d0cb3344 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -33,7 +33,7 @@ export default [ '**/dist/*', 'packages/**/tests/**/{output,input}.ts', 'rollup.config.js', - 'community-adder-template/*' + 'community-adder-template/tests/*' ] } ]; diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index 5387fb66..aaab43f5 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -6,18 +6,12 @@ const TEST_DIR = path.resolve('.test-output'); const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; export default async function ({ provide }: GlobalSetupContext) { - // global setup (e.g. spin up docker containers) - // downloads different project configurations (sveltekit, js/ts, vite-only, etc) const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); provide('testDir', TEST_DIR); provide('templatesDir', templatesDir); provide('variants', variants); - - return async () => { - // tear down... (e.g. cleanup docker containers) - }; } declare module 'vitest' { diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index e5bb4c91..1b9bf72b 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -95,7 +95,7 @@ async function prepareServer( // build project execSync(buildCommand, { cwd, stdio: 'pipe' }); - // start preview server `vite preview` + // start preview server const { url, close } = await startPreview({ cwd, command: previewCommand }); // navigate to the page diff --git a/packages/cli/testing.ts b/packages/cli/testing.ts index f6efe58c..032bc35e 100644 --- a/packages/cli/testing.ts +++ b/packages/cli/testing.ts @@ -5,8 +5,7 @@ import degit from 'degit'; import terminate from 'terminate'; import { create } from '@sveltejs/create'; -export type ProjectVariant = (typeof variants)[number]; -export const variants = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts'] as const; +export type ProjectVariant = 'kit-js' | 'kit-ts' | 'vite-js' | 'vite-ts'; const TEMPLATES_DIR = '.templates'; From 1e676fef6123eeee550f1a81475f39e3424eac67 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:41:46 -0500 Subject: [PATCH 38/70] rename `vi` to `vitest` --- community-adder-template/tests/setup/suite.ts | 16 ++++++++-------- packages/adders/_tests/_setup/suite.ts | 16 ++++++++-------- packages/adders/_tests/drizzle/test.ts | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/community-adder-template/tests/setup/suite.ts b/community-adder-template/tests/setup/suite.ts index d8607ec0..f9b39256 100644 --- a/community-adder-template/tests/setup/suite.ts +++ b/community-adder-template/tests/setup/suite.ts @@ -1,15 +1,15 @@ import fs from 'node:fs'; import path from 'node:path'; import { execSync } from 'node:child_process'; -import * as vi from 'vitest'; +import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; import { chromium, type Browser, type Page } from '@playwright/test'; import { fileURLToPath } from 'node:url'; -const cwd = vi.inject('testDir'); -const templatesDir = vi.inject('templatesDir'); -const variants = vi.inject('variants'); +const cwd = vitest.inject('testDir'); +const templatesDir = vitest.inject('templatesDir'); +const variants = vitest.inject('variants'); const SETUP_DIR = fileURLToPath(new URL('.', import.meta.url)); @@ -22,16 +22,16 @@ export function setupTest(addons: Addons) { let create: CreateProject; let browser: Browser; - const test = vi.test.extend>({} as any); + const test = vitest.test.extend>({} as any); - vi.beforeAll(async () => { + vitest.beforeAll(async () => { browser = await chromium.launch(); return async () => { await browser.close(); }; }); - vi.beforeAll(({ name }) => { + vitest.beforeAll(({ name }) => { const testName = path.parse(name).name.replace('.test', ''); // constructs a builder for create test projects @@ -46,7 +46,7 @@ export function setupTest(addons: Addons) { }); // runs before each test case - vi.beforeEach>(async (ctx) => { + vitest.beforeEach>(async (ctx) => { const browserCtx = await browser.newContext(); ctx.page = await browserCtx.newPage(); ctx.run = async (variant, options) => { diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 1b9bf72b..2bb78f00 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -1,14 +1,14 @@ import fs from 'node:fs'; import path from 'node:path'; import { execSync } from 'node:child_process'; -import * as vi from 'vitest'; +import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; import { chromium, type Browser, type Page } from '@playwright/test'; -const cwd = vi.inject('testDir'); -const templatesDir = vi.inject('templatesDir'); -const variants = vi.inject('variants'); +const cwd = vitest.inject('testDir'); +const templatesDir = vitest.inject('templatesDir'); +const variants = vitest.inject('variants'); type Fixtures = { page: Page; @@ -16,19 +16,19 @@ type Fixtures = { }; export function setupTest(addons: Addons) { - const test = vi.test.extend>({} as any); + const test = vitest.test.extend>({} as any); let create: CreateProject; let browser: Browser; - vi.beforeAll(async () => { + vitest.beforeAll(async () => { browser = await chromium.launch(); return async () => { await browser.close(); }; }); - vi.beforeAll(({ name }) => { + vitest.beforeAll(({ name }) => { const testName = path.dirname(name).split(path.sep).at(-1)!; // constructs a builder for create test projects @@ -43,7 +43,7 @@ export function setupTest(addons: Addons) { }); // runs before each test case - vi.beforeEach>(async (ctx) => { + vitest.beforeEach>(async (ctx) => { const browserCtx = await browser.newContext(); ctx.page = await browserCtx.newPage(); ctx.run = async (variant, options) => { diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts index 3b067c1a..4995980d 100644 --- a/packages/adders/_tests/drizzle/test.ts +++ b/packages/adders/_tests/drizzle/test.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { execSync } from 'node:child_process'; -import * as vi from 'vitest'; +import * as vitest from 'vitest'; import { expect } from '@playwright/test'; import { setupTest } from '../_setup/suite.ts'; import drizzle from '../../drizzle/index.ts'; @@ -10,7 +10,7 @@ import { pageServer, pageComp } from './fixtures.ts'; const { test, variants, prepareServer } = setupTest({ drizzle }); -vi.beforeAll(() => { +vitest.beforeAll(() => { const cwd = path.dirname(fileURLToPath(import.meta.url)); execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); From 0a56d2693d6694007ddf55784327938634e61cd9 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:45:05 -0500 Subject: [PATCH 39/70] windows fixes --- packages/adders/_tests/_setup/suite.ts | 2 +- packages/cli/lib/install.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 2bb78f00..fe489c9c 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -29,7 +29,7 @@ export function setupTest(addons: Addons) { }); vitest.beforeAll(({ name }) => { - const testName = path.dirname(name).split(path.sep).at(-1)!; + const testName = path.dirname(name).split('/').at(-1)!; // constructs a builder for create test projects create = createProject({ cwd, templatesDir, testName }); diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index d234b364..a36ef024 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -67,7 +67,10 @@ async function runAddon( try { const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; if (workspace.packageManager === 'npm') args.unshift('--yes'); - await exec(command, args, { nodeOptions: { cwd: workspace.cwd, stdio: 'pipe' } }); + await exec(command, args, { + nodeOptions: { cwd: workspace.cwd, stdio: 'pipe' }, + throwOnError: true + }); } catch (error) { const typedError = error as Error; throw new Error(`Failed to execute scripts '${script.description}': ` + typedError.message); From f6523d4fa6555133f3c28fc105eefcd10f15ffbf Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 13:01:40 -0500 Subject: [PATCH 40/70] more windows annoyances --- packages/adders/_tests/_setup/global.ts | 7 ++++++- packages/adders/_tests/_setup/suite.ts | 3 ++- packages/adders/storybook/index.ts | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index aaab43f5..2bef0d42 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -1,4 +1,5 @@ import path from 'node:path'; +import process from 'node:process'; import { setup, type ProjectVariant } from 'sv/test'; import type { GlobalSetupContext } from 'vitest/node'; @@ -7,7 +8,11 @@ const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; export default async function ({ provide }: GlobalSetupContext) { // downloads different project configurations (sveltekit, js/ts, vite-only, etc) - const { templatesDir } = await setup({ cwd: TEST_DIR, variants, clean: true }); + const { templatesDir } = await setup({ + cwd: TEST_DIR, + variants, + clean: process.platform !== 'win32' + }); provide('testDir', TEST_DIR); provide('templatesDir', templatesDir); diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index fe489c9c..0072802d 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; +import process from 'node:process'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; @@ -47,7 +48,7 @@ export function setupTest(addons: Addons) { const browserCtx = await browser.newContext(); ctx.page = await browserCtx.newPage(); ctx.run = async (variant, options) => { - const cwd = create({ testId: ctx.task.id, variant }); + const cwd = create({ testId: ctx.task.id, variant, clean: process.platform !== 'win32' }); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 65de68a2..20fdc5e8 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -9,7 +9,7 @@ export default defineAdder({ scripts: [ { description: 'applies storybook', - args: ['storybook@8.3', 'init', '--skip-install', '--no-dev'], + args: ['storybook@8.3.6', 'init', '--skip-install', '--no-dev'], stdio: 'inherit' } ], From 58700366cb0d2bdd258c9aad8a20909bfa2cf430 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 13:32:25 -0500 Subject: [PATCH 41/70] tweaks --- packages/adders/_tests/_setup/suite.ts | 4 ++-- packages/adders/_tests/storybook/test.ts | 2 +- packages/create/tsconfig.json | 2 +- packages/create/vitest.config.ts | 6 ++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 0072802d..8afbd374 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -88,13 +88,13 @@ async function prepareServer( afterInstall?: () => Promise | any ) { // install deps - execSync(installCommand, { cwd, stdio: 'pipe' }); + if (installCommand) execSync(installCommand, { cwd, stdio: 'pipe' }); // ...do commands and any other extra stuff await afterInstall?.(); // build project - execSync(buildCommand, { cwd, stdio: 'pipe' }); + if (buildCommand) execSync(buildCommand, { cwd, stdio: 'pipe' }); // start preview server const { url, close } = await startPreview({ cwd, command: previewCommand }); diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index a2c0bb54..494d4242 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -12,7 +12,7 @@ test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, . cwd, page, previewCommand: `pnpm storybook -p ${++port} --ci`, - buildCommand: 'echo' + buildCommand: '' }); // kill server process when we're done ctx.onTestFinished(() => close()); diff --git a/packages/create/tsconfig.json b/packages/create/tsconfig.json index 770dd836..c7f6b862 100644 --- a/packages/create/tsconfig.json +++ b/packages/create/tsconfig.json @@ -6,5 +6,5 @@ "declaration": true }, // overrides the root tsconfig `exclude` field so we're not ignoring the `test` dir - "exclude": ["templates/**", "shared/**", "dist/**"] + "exclude": ["templates/**", "shared/**", "dist/**", "vitest.config.ts"] } diff --git a/packages/create/vitest.config.ts b/packages/create/vitest.config.ts index 78e3ca4a..33cdc9c7 100644 --- a/packages/create/vitest.config.ts +++ b/packages/create/vitest.config.ts @@ -1,7 +1,5 @@ -import { defineConfig, type UserConfig } from 'vitest/config'; +import { defineConfig } from 'vitest/config'; -const config: UserConfig = defineConfig({ +export default defineConfig({ test: { dir: './test', include: ['*.ts'] } }); - -export default config; From 677fbb0e047fc32e06a611f8cfb6c87de053910e Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Fri, 8 Nov 2024 19:35:06 +0100 Subject: [PATCH 42/70] add `test:ui` script --- packages/adders/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/adders/package.json b/packages/adders/package.json index 39023993..cff17db4 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -7,7 +7,8 @@ "check": "tsc", "format": "pnpm lint --write", "lint": "prettier --check . --config ../../prettier.config.js --ignore-path ../../.gitignore --ignore-path .gitignore --ignore-path ../../.prettierignore", - "test": "vitest" + "test": "vitest", + "test:ui": "vitest --ui" }, "exports": "./index.ts", "dependencies": { From 6e9360ccbce01f6684c41a628b0ace0e16d82feb Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Fri, 8 Nov 2024 20:02:28 +0100 Subject: [PATCH 43/70] `tinyexec` `throwOnError: true` --- packages/cli/commands/add/index.ts | 5 ++++- packages/cli/common.ts | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index a91ea35c..14e0ec05 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -545,7 +545,10 @@ async function runAdders({ if (workspace.packageManager === 'npm') args.unshift('--yes'); try { - await exec(command, args, { nodeOptions: { cwd: workspace.cwd, stdio: script.stdio } }); + await exec(command, args, { + nodeOptions: { cwd: workspace.cwd, stdio: script.stdio }, + throwOnError: true + }); } catch (error) { const typedError = error as Error; throw new Error( diff --git a/packages/cli/common.ts b/packages/cli/common.ts index 3010961b..13035fd3 100644 --- a/packages/cli/common.ts +++ b/packages/cli/common.ts @@ -89,7 +89,10 @@ export async function formatFiles(options: { }): Promise { const args = ['prettier', '--write', '--ignore-unknown', ...options.paths]; const cmd = resolveCommand(options.packageManager, 'execute-local', args)!; - await exec(cmd.command, cmd.args, { nodeOptions: { cwd: options.cwd, stdio: 'pipe' } }); + await exec(cmd.command, cmd.args, { + nodeOptions: { cwd: options.cwd, stdio: 'pipe' }, + throwOnError: true + }); } const agents = AGENTS.filter((agent): agent is AgentName => !agent.includes('@')); @@ -119,7 +122,7 @@ export async function installDependencies(agent: AgentName, cwd: string): Promis spinner.start('Installing dependencies...'); try { const { command, args } = constructCommand(COMMANDS[agent].install, [])!; - await exec(command, args, { nodeOptions: { cwd } }); + await exec(command, args, { nodeOptions: { cwd }, throwOnError: true }); spinner.stop('Successfully installed dependencies'); } catch (error) { @@ -157,7 +160,10 @@ export function getGlobalPreconditions( // there are no pending changes. If the below command is run outside of a git repository, // git will exit with a failing exit code, which will trigger the catch statement. // also see https://remarkablemark.org/blog/2017/10/12/check-git-dirty/#git-status - const { stdout } = await exec('git', ['status', '--short'], { nodeOptions: { cwd } }); + const { stdout } = await exec('git', ['status', '--short'], { + nodeOptions: { cwd }, + throwOnError: true + }); if (stdout) { return { success: false, message: 'Found modified files' }; From 7181351307964ca886999c04e62d7167b1f42f9e Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:52:52 -0500 Subject: [PATCH 44/70] revert --- packages/adders/_tests/_setup/global.ts | 7 +------ packages/adders/_tests/_setup/suite.ts | 3 +-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index 2bef0d42..c65844cc 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -1,5 +1,4 @@ import path from 'node:path'; -import process from 'node:process'; import { setup, type ProjectVariant } from 'sv/test'; import type { GlobalSetupContext } from 'vitest/node'; @@ -8,11 +7,7 @@ const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; export default async function ({ provide }: GlobalSetupContext) { // downloads different project configurations (sveltekit, js/ts, vite-only, etc) - const { templatesDir } = await setup({ - cwd: TEST_DIR, - variants, - clean: process.platform !== 'win32' - }); + const { templatesDir } = await setup({ cwd: TEST_DIR, variants }); provide('testDir', TEST_DIR); provide('templatesDir', templatesDir); diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 8afbd374..1eca82e0 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -1,6 +1,5 @@ import fs from 'node:fs'; import path from 'node:path'; -import process from 'node:process'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; @@ -48,7 +47,7 @@ export function setupTest(addons: Addons) { const browserCtx = await browser.newContext(); ctx.page = await browserCtx.newPage(); ctx.run = async (variant, options) => { - const cwd = create({ testId: ctx.task.id, variant, clean: process.platform !== 'win32' }); + const cwd = create({ testId: ctx.task.id, variant }); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); From d98c630b49c093f176b950db413246b87b90b35c Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:18:18 -0500 Subject: [PATCH 45/70] properly terminate child processes --- .../tests/custom-addon.test.ts | 2 +- packages/adders/_tests/drizzle/test.ts | 2 +- packages/adders/_tests/eslint/test.ts | 2 +- packages/adders/_tests/lucia/test.ts | 2 +- packages/adders/_tests/mdsvex/test.ts | 2 +- packages/adders/_tests/paraglide/test.ts | 2 +- packages/adders/_tests/playwright/test.ts | 2 +- packages/adders/_tests/prettier/test.ts | 2 +- packages/adders/_tests/storybook/test.ts | 4 +- packages/adders/_tests/tailwindcss/test.ts | 4 +- packages/adders/_tests/vitest/test.ts | 2 +- packages/cli/package.json | 4 +- packages/cli/testing.ts | 56 ++++++++++++++----- pnpm-lock.yaml | 25 +++++---- 14 files changed, 72 insertions(+), 39 deletions(-) diff --git a/community-adder-template/tests/custom-addon.test.ts b/community-adder-template/tests/custom-addon.test.ts index f3c01b74..20a970e3 100644 --- a/community-adder-template/tests/custom-addon.test.ts +++ b/community-adder-template/tests/custom-addon.test.ts @@ -20,7 +20,7 @@ test.concurrent.for(variants)('demo - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); // expectations const textContent = await page.getByTestId('demo').textContent(); diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts index 4995980d..b8efb11b 100644 --- a/packages/adders/_tests/drizzle/test.ts +++ b/packages/adders/_tests/drizzle/test.ts @@ -51,7 +51,7 @@ test.concurrent.for(testCases)( execSync('npm run db:push', { cwd, stdio: 'pipe' }); }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(await page.$('[data-testid]')).toBeTruthy(); } diff --git a/packages/adders/_tests/eslint/test.ts b/packages/adders/_tests/eslint/test.ts index 6de35cc6..6a8d3e20 100644 --- a/packages/adders/_tests/eslint/test.ts +++ b/packages/adders/_tests/eslint/test.ts @@ -9,7 +9,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/adders/_tests/lucia/test.ts b/packages/adders/_tests/lucia/test.ts index 5b16d12d..c95ac959 100644 --- a/packages/adders/_tests/lucia/test.ts +++ b/packages/adders/_tests/lucia/test.ts @@ -14,7 +14,7 @@ test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/adders/_tests/mdsvex/test.ts b/packages/adders/_tests/mdsvex/test.ts index 1d2731f3..13f71ab6 100644 --- a/packages/adders/_tests/mdsvex/test.ts +++ b/packages/adders/_tests/mdsvex/test.ts @@ -18,7 +18,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(await page.$('.mdsvex h1')).toBeTruthy(); expect(await page.$('.mdsvex h2')).toBeTruthy(); diff --git a/packages/adders/_tests/paraglide/test.ts b/packages/adders/_tests/paraglide/test.ts index 2b72898c..e2d2ac01 100644 --- a/packages/adders/_tests/paraglide/test.ts +++ b/packages/adders/_tests/paraglide/test.ts @@ -10,7 +10,7 @@ test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => { const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/adders/_tests/playwright/test.ts b/packages/adders/_tests/playwright/test.ts index 11a0f340..e8d735f7 100644 --- a/packages/adders/_tests/playwright/test.ts +++ b/packages/adders/_tests/playwright/test.ts @@ -9,7 +9,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/adders/_tests/prettier/test.ts b/packages/adders/_tests/prettier/test.ts index 7dde97d2..1b3f2992 100644 --- a/packages/adders/_tests/prettier/test.ts +++ b/packages/adders/_tests/prettier/test.ts @@ -9,7 +9,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index 494d4242..eb128dd1 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -5,7 +5,7 @@ import storybook from '../../storybook/index.ts'; const { test, variants, prepareServer } = setupTest({ storybook }); let port = 6006; -test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { +test.concurrent.skip.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { storybook: {} }); const { close } = await prepareServer({ @@ -15,7 +15,7 @@ test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, . buildCommand: '' }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(await page.$('main .sb-bar')).toBeTruthy(); expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); diff --git a/packages/adders/_tests/tailwindcss/test.ts b/packages/adders/_tests/tailwindcss/test.ts index fd90fa0e..1ede1055 100644 --- a/packages/adders/_tests/tailwindcss/test.ts +++ b/packages/adders/_tests/tailwindcss/test.ts @@ -13,7 +13,7 @@ test.concurrent.for(variants)('none - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); const el = page.getByTestId('base'); await expect(el).toHaveCSS('background-color', 'rgb(71, 85, 105)'); @@ -30,7 +30,7 @@ test.concurrent.for(variants)('typography - %s', async (variant, { page, ...ctx const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); const el = page.getByTestId('typography'); await expect(el).toHaveCSS('font-size', '18px'); diff --git a/packages/adders/_tests/vitest/test.ts b/packages/adders/_tests/vitest/test.ts index 7707a39d..ed451996 100644 --- a/packages/adders/_tests/vitest/test.ts +++ b/packages/adders/_tests/vitest/test.ts @@ -9,7 +9,7 @@ test.concurrent.for(variants)('core - %s', async (variant, { page, ...ctx }) => const { close } = await prepareServer({ cwd, page }); // kill server process when we're done - ctx.onTestFinished(() => close()); + ctx.onTestFinished(async () => await close()); expect(true).toBe(true); }); diff --git a/packages/cli/package.json b/packages/cli/package.json index 32d36dcf..d2e845d8 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -35,15 +35,17 @@ "@sveltejs/cli-core": "workspace:*", "@sveltejs/create": "workspace:*", "@types/degit": "^2.8.6", + "@types/ps-tree": "^1.1.6", "@types/tar-fs": "^2.0.4", "commander": "^12.1.0", "degit": "^2.8.4", "empathic": "^1.0.0", "package-manager-detector": "^0.2.2", "picocolors": "^1.1.0", + "ps-tree": "^1.2.0", "tar-fs": "^3.0.6", - "terminate": "^2.8.0", "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "valibot": "^0.41.0" }, "keywords": [ diff --git a/packages/cli/testing.ts b/packages/cli/testing.ts index 032bc35e..84b3f5f7 100644 --- a/packages/cli/testing.ts +++ b/packages/cli/testing.ts @@ -1,9 +1,10 @@ import fs from 'node:fs'; +import process from 'node:process'; import path from 'node:path'; -import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'; import degit from 'degit'; -import terminate from 'terminate'; +import { exec } from 'tinyexec'; import { create } from '@sveltejs/create'; +import pstree, { type PS } from 'ps-tree'; export type ProjectVariant = 'kit-js' | 'kit-ts' | 'vite-js' | 'vite-ts'; @@ -71,20 +72,26 @@ export function createProject({ cwd, testName, templatesDir }: CreateOptions): C } type PreviewOptions = { cwd: string; command?: string }; -export async function startPreview({ cwd, command = 'npm run preview' }: PreviewOptions): Promise<{ - url: string; - server: ChildProcessWithoutNullStreams; - close: () => void; -}> { +export async function startPreview({ + cwd, + command = 'npm run preview' +}: PreviewOptions): Promise<{ url: string; close: () => Promise }> { const [cmd, ...args] = command.split(' '); - const process = spawn(cmd, args, { stdio: 'pipe', shell: true, cwd, timeout: 120_000 }); - const close = () => { - if (!process.pid) return; - terminate(process.pid); + const proc = exec(cmd, args, { + nodeOptions: { cwd, stdio: 'pipe' }, + throwOnError: true, + timeout: 60_000 + }); + + const close = async () => { + if (!proc.pid) return; + await terminate(proc.pid); }; - return await new Promise((resolve) => { - process.stdout.on('data', (data: Buffer) => { + return await new Promise((resolve, reject) => { + if (!proc.process?.stdout) return reject('impossible state'); + + proc.process.stdout.on('data', (data: Buffer) => { const value = data.toString(); // extract dev server url from console output @@ -99,8 +106,29 @@ export async function startPreview({ cwd, command = 'npm run preview' }: Preview if (urls && urls.length > 0) { const url = urls[0]; - resolve({ url, server: process, close }); + resolve({ url, close }); } }); }); } + +async function getProcessTree(pid: number) { + return new Promise((res, rej) => { + pstree(pid, (err, children) => { + if (err) rej(err); + res(children); + }); + }); +} + +async function terminate(pid: number) { + const children = await getProcessTree(pid); + // the process tree is ordered from parents -> children, + // so we'll iterate in the reverse order to terminate the children first + for (let i = children.length - 1; i >= 0; i--) { + const child = children[i]; + const pid = Number(child.PID); + process.kill(pid); + } + process.kill(pid); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a4ff418..0dbffa69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,9 @@ importers: '@types/degit': specifier: ^2.8.6 version: 2.8.6 + '@types/ps-tree': + specifier: ^1.1.6 + version: 1.1.6 '@types/tar-fs': specifier: ^2.0.4 version: 2.0.4 @@ -201,15 +204,18 @@ importers: picocolors: specifier: ^1.1.0 version: 1.1.1 + ps-tree: + specifier: ^1.2.0 + version: 1.2.0 tar-fs: specifier: ^3.0.6 version: 3.0.6 - terminate: - specifier: ^2.8.0 - version: 2.8.0 tinyexec: specifier: ^0.3.1 version: 0.3.1 + tinypool: + specifier: ^1.0.1 + version: 1.0.1 valibot: specifier: ^0.41.0 version: 0.41.0(typescript@5.6.3) @@ -965,6 +971,9 @@ packages: '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + '@types/ps-tree@1.1.6': + resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2266,10 +2275,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terminate@2.8.0: - resolution: {integrity: sha512-bcbjJEg0wY5nuJXvGxxHfmoEPkyHLCctUKO6suwtxy7jVSgGcgPeGwpbLDLELFhIaxCGRr3dPvyNg1yuz2V0eg==} - engines: {node: '>=12'} - text-decoder@1.2.0: resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} @@ -3121,6 +3126,8 @@ snapshots: '@types/node': 22.9.0 kleur: 3.0.3 + '@types/ps-tree@1.1.6': {} + '@types/resolve@1.20.2': {} '@types/semver@7.5.8': {} @@ -4478,10 +4485,6 @@ snapshots: term-size@2.2.1: {} - terminate@2.8.0: - dependencies: - ps-tree: 1.2.0 - text-decoder@1.2.0: dependencies: b4a: 1.6.6 From 9aa59cfee9184ae9df6344602e1e0b2d0a16048f Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:39:19 -0500 Subject: [PATCH 46/70] dont skip storybook --- packages/adders/_tests/storybook/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index eb128dd1..6093fc53 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -5,7 +5,7 @@ import storybook from '../../storybook/index.ts'; const { test, variants, prepareServer } = setupTest({ storybook }); let port = 6006; -test.concurrent.skip.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { +test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { const cwd = await ctx.run(variant, { storybook: {} }); const { close } = await prepareServer({ From dd141e78025f85888e6d5b088d3c48b043f03def Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 19:40:11 -0500 Subject: [PATCH 47/70] cleanup on failure to load the page --- packages/adders/_tests/_setup/suite.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 1eca82e0..eebad34e 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -98,8 +98,14 @@ async function prepareServer( // start preview server const { url, close } = await startPreview({ cwd, command: previewCommand }); - // 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 }; } From d4794f0b1b46d81c4f6f8a949525f7a85ae90622 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 20:29:21 -0500 Subject: [PATCH 48/70] unused --- packages/cli/package.json | 1 - pnpm-lock.yaml | 3 --- 2 files changed, 4 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index d2e845d8..4f80ef88 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -45,7 +45,6 @@ "ps-tree": "^1.2.0", "tar-fs": "^3.0.6", "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", "valibot": "^0.41.0" }, "keywords": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dbffa69..bb9ceae1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -213,9 +213,6 @@ importers: tinyexec: specifier: ^0.3.1 version: 0.3.1 - tinypool: - specifier: ^1.0.1 - version: 1.0.1 valibot: specifier: ^0.41.0 version: 0.41.0(typescript@5.6.3) From 50fde5cc5ba8ff503e0b1edeb8b9d52afca02771 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 20:31:25 -0500 Subject: [PATCH 49/70] newline --- community-adder-template/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community-adder-template/.gitignore b/community-adder-template/.gitignore index 4404a552..a9e1699a 100644 --- a/community-adder-template/.gitignore +++ b/community-adder-template/.gitignore @@ -1,4 +1,4 @@ node_modules temp .outputs -.test-output \ No newline at end of file +.test-output From 2b98217ebcb591cb24e168638060e7424acb2573 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:01:54 -0500 Subject: [PATCH 50/70] use vitest workspaces --- community-adder-template/package.json | 2 +- .../tests/setup/global.ts | 4 +- package.json | 3 +- packages/adders/_tests/_setup/global.ts | 4 +- packages/adders/package.json | 2 +- packages/adders/vitest.config.ts | 1 + packages/core/vitest.config.ts | 4 +- packages/create/.gitignore | 1 - packages/create/package.json | 2 +- packages/create/test/check.ts | 79 +++---------------- packages/create/vitest.config.ts | 5 +- packages/migrate/package.json | 2 +- packages/migrate/vitest.config.ts | 7 ++ rollup.config.js | 1 + vitest.workspace.ts | 3 + 15 files changed, 38 insertions(+), 82 deletions(-) create mode 100644 packages/migrate/vitest.config.ts create mode 100644 vitest.workspace.ts diff --git a/community-adder-template/package.json b/community-adder-template/package.json index 428d0913..fedd5d42 100644 --- a/community-adder-template/package.json +++ b/community-adder-template/package.json @@ -7,7 +7,7 @@ "scripts": { "create-temp": "sv create temp --types ts --template minimal --no-add-ons --no-install", "start": "sv add -C temp --community file:../", - "test": "vitest" + "test": "vitest run" }, "files": [ "src", diff --git a/community-adder-template/tests/setup/global.ts b/community-adder-template/tests/setup/global.ts index 0dab6571..95cc7c8d 100644 --- a/community-adder-template/tests/setup/global.ts +++ b/community-adder-template/tests/setup/global.ts @@ -1,9 +1,9 @@ -import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { setup, type ProjectVariant } from 'sv/test'; import type { GlobalSetupContext } from 'vitest/node'; const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; -const TEST_DIR = path.resolve('.test-output'); +const TEST_DIR = fileURLToPath(new URL('./.test-output/', import.meta.url)); export default async function ({ provide }: GlobalSetupContext) { // global setup (e.g. spin up docker containers) diff --git a/package.json b/package.json index 58bd13dd..a7a9881a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "dev": "rollup --config --watch", "format": "pnpm --parallel format", "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", - "test": "pnpm --parallel test" + "test": "pnpm vitest run --silent", + "test:ui": "pnpm vitest --ui" }, "devDependencies": { "@changesets/cli": "^2.27.9", diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index c65844cc..3777b671 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -1,8 +1,8 @@ -import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { setup, type ProjectVariant } from 'sv/test'; import type { GlobalSetupContext } from 'vitest/node'; -const TEST_DIR = path.resolve('.test-output'); +const TEST_DIR = fileURLToPath(new URL('../../../../.test-output/adders/', import.meta.url)); const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; export default async function ({ provide }: GlobalSetupContext) { diff --git a/packages/adders/package.json b/packages/adders/package.json index cff17db4..05a0f370 100644 --- a/packages/adders/package.json +++ b/packages/adders/package.json @@ -7,7 +7,7 @@ "check": "tsc", "format": "pnpm lint --write", "lint": "prettier --check . --config ../../prettier.config.js --ignore-path ../../.gitignore --ignore-path .gitignore --ignore-path ../../.prettierignore", - "test": "vitest", + "test": "vitest run", "test:ui": "vitest --ui" }, "exports": "./index.ts", diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index 8924a20d..d0b04f60 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -5,6 +5,7 @@ const ONE_MINUTE = 1000 * 60; export default defineConfig({ test: { + name: 'adders', include: ['_tests/**/test.{js,ts}'], testTimeout: ONE_MINUTE * 3, hookTimeout: ONE_MINUTE * 3, diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts index 669f2a8e..5940c172 100644 --- a/packages/core/vitest.config.ts +++ b/packages/core/vitest.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - dir: './tests', - include: ['./**/index.ts'] + name: 'core', + include: ['./tests/**/index.ts'] } }); diff --git a/packages/create/.gitignore b/packages/create/.gitignore index 14b63618..e7e5bfa8 100644 --- a/packages/create/.gitignore +++ b/packages/create/.gitignore @@ -1,5 +1,4 @@ /dist -/.test-tmp # re-enable this once we're out of prerelease /cli/versions.js diff --git a/packages/create/package.json b/packages/create/package.json index c0560933..762372ba 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -16,7 +16,7 @@ "check": "tsc", "format": "pnpm lint --write", "lint": "prettier --check . --config ../../prettier.config.js --ignore-path ../../.gitignore --ignore-path .gitignore --ignore-path ../../.prettierignore", - "test": "pnpm build:dist && vitest run", + "test": "vitest run", "update-template-repo": "pnpm build:dist && echo \"Updating template repo\" && bash ./scripts/update-template-repo.sh" }, "files": [ diff --git a/packages/create/test/check.ts b/packages/create/test/check.ts index 8beb3dba..998359f4 100644 --- a/packages/create/test/check.ts +++ b/packages/create/test/check.ts @@ -1,9 +1,8 @@ -import { exec } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; -import { fileURLToPath } from 'node:url'; import { promisify } from 'node:util'; -import glob from 'tiny-glob/sync.js'; +import { fileURLToPath } from 'node:url'; +import { exec, type PromiseWithChild } from 'node:child_process'; import { beforeAll, describe, test } from 'vitest'; import { create, type LanguageType, type TemplateType } from '../index.ts'; @@ -11,38 +10,11 @@ import { create, type LanguageType, type TemplateType } from '../index.ts'; const resolve_path = (path: string) => fileURLToPath(new URL(path, import.meta.url)); // use a directory outside of packages to ensure it isn't added to the pnpm workspace -const test_workspace_dir = resolve_path('../../../.test-tmp/create-svelte/'); - -const existing_workspace_overrides = JSON.parse( - fs.readFileSync(resolve_path('../../../package.json'), 'utf-8') -).pnpm?.overrides; - -const overrides = { ...existing_workspace_overrides }; - -for (const pkg_path of glob(resolve_path('../../../packages/*/package.json'))) { - const name = JSON.parse(fs.readFileSync(pkg_path, 'utf-8')).name; - // use `file:` protocol for opting into stricter resolve logic which catches more bugs - overrides[name] = `file:${path.dirname(path.resolve(pkg_path))}`; -} +const test_workspace_dir = resolve_path('../../../.test-output/create/'); // prepare test pnpm workspace fs.rmSync(test_workspace_dir, { recursive: true, force: true }); fs.mkdirSync(test_workspace_dir, { recursive: true }); -const workspace = { - name: 'svelte-check-test-fake-pnpm-workspace', - private: true, - version: '0.0.0', - pnpm: { overrides }, - // convert override query "@foo/bar@>x [query.replace(/(@?[^@]+)@.*$/, '$1'), range]) - ) -}; - -fs.writeFileSync( - path.join(test_workspace_dir, 'package.json'), - JSON.stringify(workspace, null, '\t') -); fs.writeFileSync(path.join(test_workspace_dir, 'pnpm-workspace.yaml'), 'packages:\n - ./*\n'); @@ -54,37 +26,13 @@ beforeAll(async () => { }); }, 60000); -function patch_package_json(pkg: any) { - Object.entries(overrides).forEach(([key, value]) => { - if (pkg.devDependencies?.[key]) { - pkg.devDependencies[key] = value; - } - - if (pkg.dependencies?.[key]) { - pkg.dependencies[key] = value; - } - - if (!pkg.pnpm) { - pkg.pnpm = {}; - } - - if (!pkg.pnpm.overrides) { - pkg.pnpm.overrides = {}; - } - - pkg.pnpm.overrides = { ...pkg.pnpm.overrides, ...overrides }; - }); - pkg.private = true; -} - /** * Tests in different templates can be run concurrently for a nice speedup locally, but tests within a template must be run sequentially. * It'd be better to group tests by template, but vitest doesn't support that yet. - * @type {Map import('node:child_process').PromiseWithChild][]>} */ -const script_test_map = new Map(); +const script_test_map = new Map PromiseWithChild]>>(); -const templates = fs.readdirSync('templates') as TemplateType[]; +const templates = fs.readdirSync(resolve_path('../templates/')) as TemplateType[]; for (const template of templates) { if (template[0] === '.') continue; @@ -100,9 +48,6 @@ for (const template of templates) { }); const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8')); - patch_package_json(pkg); - - fs.writeFileSync(path.join(cwd, 'package.json'), JSON.stringify(pkg, null, '\t') + '\n'); // run provided scripts that are non-blocking. All of them should exit with 0 // package script requires lib dir @@ -120,13 +65,9 @@ for (const template of templates) { } for (const [script, tests] of script_test_map) { - describe.concurrent( - script, - () => { - for (const [name, task] of tests) { - test(name, task); - } - }, - { timeout: 60000 } - ); + describe.concurrent(script, { timeout: 60000 }, () => { + for (const [name, task] of tests) { + test(name, task); + } + }); } diff --git a/packages/create/vitest.config.ts b/packages/create/vitest.config.ts index 33cdc9c7..132b334f 100644 --- a/packages/create/vitest.config.ts +++ b/packages/create/vitest.config.ts @@ -1,5 +1,8 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ - test: { dir: './test', include: ['*.ts'] } + test: { + name: 'create', + include: ['test/*.ts'] + } }); diff --git a/packages/migrate/package.json b/packages/migrate/package.json index e56d96c9..0fe2bffe 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -14,7 +14,7 @@ "check": "tsc", "format": "pnpm lint --write", "lint": "prettier --check .", - "test": "vitest run --silent" + "test": "vitest run" }, "files": [ "bin.js", diff --git a/packages/migrate/vitest.config.ts b/packages/migrate/vitest.config.ts new file mode 100644 index 00000000..22afa1cf --- /dev/null +++ b/packages/migrate/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + name: 'migrate' + } +}); diff --git a/rollup.config.js b/rollup.config.js index 74c8158c..c11e3d9d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -68,6 +68,7 @@ function getConfig(project) { console.log('building templates'); const start = performance.now(); await buildTemplates(path.resolve('packages', 'cli', 'dist')); + await buildTemplates(path.resolve('packages', 'create', 'dist')); const end = performance.now(); console.log(`finished building templates: ${Math.round(end - start)}ms`); } diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000..2a7e8f5f --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,3 @@ +import { defineWorkspace } from 'vitest/config'; + +export default defineWorkspace(['packages/*', 'community-adder-template']); From 8e006722f4d60794202713a3894c6f3fb6da03e4 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Sat, 9 Nov 2024 08:30:52 +0100 Subject: [PATCH 51/70] add `try-catch` while killing processes --- packages/cli/testing.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/cli/testing.ts b/packages/cli/testing.ts index 84b3f5f7..1d90e97a 100644 --- a/packages/cli/testing.ts +++ b/packages/cli/testing.ts @@ -128,7 +128,16 @@ async function terminate(pid: number) { for (let i = children.length - 1; i >= 0; i--) { const child = children[i]; const pid = Number(child.PID); + try { + process.kill(pid); + } catch { + // this can happen if a process has been automatically terminated. + } + } + + try { process.kill(pid); + } catch { + // this can happen if a process has been automatically terminated. } - process.kill(pid); } From 9526feeefe18d5e35f1010eb194ae13545c8d8e4 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Sat, 9 Nov 2024 17:51:29 +0100 Subject: [PATCH 52/70] increase navigation timeout --- packages/adders/_tests/_setup/suite.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index eebad34e..4820c621 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -98,6 +98,10 @@ async function prepareServer( // start preview server const { url, close } = await startPreview({ cwd, command: previewCommand }); + // default navigation timeout is 30 seconds. When running many tests at once as we are doing + // this is not always enough. Increase it to 60 seconds. + page.setDefaultNavigationTimeout(60_0000); + try { // navigate to the page await page.goto(url); From ebe7812b1f91c62073289816e9e1571c06c62e67 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:01:11 -0500 Subject: [PATCH 53/70] fix timeout --- packages/adders/_tests/_setup/suite.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 4820c621..3e6f3ef9 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -98,9 +98,8 @@ async function prepareServer( // start preview server const { url, close } = await startPreview({ cwd, command: previewCommand }); - // default navigation timeout is 30 seconds. When running many tests at once as we are doing - // this is not always enough. Increase it to 60 seconds. - page.setDefaultNavigationTimeout(60_0000); + // increases timeout as 30s is not always enough when running the full suite + page.setDefaultNavigationTimeout(60_000); try { // navigate to the page From ed81a57df6e2ad727be604793089e1cfdca3f150 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:31:31 -0500 Subject: [PATCH 54/70] add retries --- packages/adders/vitest.config.ts | 6 +++--- packages/create/test/check.ts | 6 +----- packages/create/vitest.config.ts | 4 +++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index d0b04f60..0d571dee 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -7,10 +7,10 @@ export default defineConfig({ test: { name: 'adders', include: ['_tests/**/test.{js,ts}'], + globalSetup: ['_tests/_setup/global.ts'], testTimeout: ONE_MINUTE * 3, hookTimeout: ONE_MINUTE * 3, - maxConcurrency: 10, - globalSetup: ['_tests/_setup/global.ts'], - retry: env.CI ? 3 : 0 + retry: env.CI ? 3 : 0, + pool: 'threads' } }); diff --git a/packages/create/test/check.ts b/packages/create/test/check.ts index 998359f4..ba807aa3 100644 --- a/packages/create/test/check.ts +++ b/packages/create/test/check.ts @@ -41,11 +41,7 @@ for (const template of templates) { const cwd = path.join(test_workspace_dir, `${template}-${types}`); fs.rmSync(cwd, { recursive: true, force: true }); - create(cwd, { - name: `create-svelte-test-${template}-${types}`, - template, - types - }); + create(cwd, { name: `create-svelte-test-${template}-${types}`, template, types }); const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8')); diff --git a/packages/create/vitest.config.ts b/packages/create/vitest.config.ts index 132b334f..f29b5427 100644 --- a/packages/create/vitest.config.ts +++ b/packages/create/vitest.config.ts @@ -1,8 +1,10 @@ +import { env } from 'node:process'; import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { name: 'create', - include: ['test/*.ts'] + include: ['test/*.ts'], + retry: env.CI ? 3 : 0 } }); From a3baf83ac705cfda800394d57de1f2fb44f5850d Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sat, 9 Nov 2024 18:35:00 -0500 Subject: [PATCH 55/70] remove storybook log --- .gitignore | 1 - packages/cli/testing.ts | 11 ++++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b87fdf1f..193b6ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,3 @@ vite.config.js.timestamp-* /packages/create-svelte/template/CHANGELOG.md .test-tmp .test-output -*storybook.log diff --git a/packages/cli/testing.ts b/packages/cli/testing.ts index 1d90e97a..907319a1 100644 --- a/packages/cli/testing.ts +++ b/packages/cli/testing.ts @@ -49,7 +49,16 @@ export async function setup({ // TODO: should probably point this to a specific commit hash (ex: `#1234abcd`) const template = degit(`vitejs/vite/packages/create-vite/${name}`, { force: true }); await template.clone(templatePath); - } else throw new Error(`Unknown project variant: ${variant}`); + + // vite templates have their gitignore file named as `_gitignore` + const gitignorePath = path.resolve(templatePath, '_gitignore'); + if (fs.existsSync(gitignorePath)) { + const fixedPath = path.resolve(templatePath, '.gitignore'); + fs.renameSync(gitignorePath, fixedPath); + } + } else { + throw new Error(`Unknown project variant: ${variant}`); + } } return { templatesDir }; From 987b1e8110b04ba02243a0a59d68fba914537e4d Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sat, 9 Nov 2024 19:22:30 -0500 Subject: [PATCH 56/70] cleanup cli package --- .../tests/setup/global.ts | 2 +- community-adder-template/tests/setup/suite.ts | 2 +- packages/adders/_tests/_setup/global.ts | 2 +- packages/adders/_tests/_setup/suite.ts | 2 +- packages/cli/bin.ts | 2 +- .../{utils => commands/add}/fetch-packages.ts | 2 +- packages/cli/commands/add/index.ts | 16 +- packages/cli/commands/add/preconditions.ts | 66 ++++++ packages/cli/commands/add/utils.ts | 25 ++- packages/cli/commands/add/workspace.ts | 6 +- packages/cli/commands/check.ts | 6 +- packages/cli/commands/create.ts | 13 +- packages/cli/commands/migrate.ts | 2 +- packages/cli/common.ts | 206 ------------------ packages/cli/index.ts | 3 - packages/cli/lib/index.ts | 3 + packages/cli/lib/install.ts | 2 +- packages/cli/{ => lib}/testing.ts | 11 +- packages/cli/package.json | 6 +- packages/cli/tsconfig.json | 2 +- packages/cli/utils/common.ts | 78 +++++++ packages/cli/{ => utils}/env.ts | 0 packages/cli/utils/package-manager.ts | 56 +++++ rollup.config.js | 12 +- 24 files changed, 269 insertions(+), 256 deletions(-) rename packages/cli/{utils => commands/add}/fetch-packages.ts (98%) create mode 100644 packages/cli/commands/add/preconditions.ts delete mode 100644 packages/cli/common.ts delete mode 100644 packages/cli/index.ts create mode 100644 packages/cli/lib/index.ts rename packages/cli/{ => lib}/testing.ts (97%) create mode 100644 packages/cli/utils/common.ts rename packages/cli/{ => utils}/env.ts (100%) create mode 100644 packages/cli/utils/package-manager.ts diff --git a/community-adder-template/tests/setup/global.ts b/community-adder-template/tests/setup/global.ts index 95cc7c8d..9b38192b 100644 --- a/community-adder-template/tests/setup/global.ts +++ b/community-adder-template/tests/setup/global.ts @@ -1,5 +1,5 @@ import { fileURLToPath } from 'node:url'; -import { setup, type ProjectVariant } from 'sv/test'; +import { setup, type ProjectVariant } from 'sv/testing'; import type { GlobalSetupContext } from 'vitest/node'; const variants: ProjectVariant[] = ['kit-js', 'kit-ts', 'vite-js', 'vite-ts']; diff --git a/community-adder-template/tests/setup/suite.ts b/community-adder-template/tests/setup/suite.ts index f9b39256..46f3f8c8 100644 --- a/community-adder-template/tests/setup/suite.ts +++ b/community-adder-template/tests/setup/suite.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; -import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; +import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing'; import { chromium, type Browser, type Page } from '@playwright/test'; import { fileURLToPath } from 'node:url'; diff --git a/packages/adders/_tests/_setup/global.ts b/packages/adders/_tests/_setup/global.ts index 3777b671..93b6b955 100644 --- a/packages/adders/_tests/_setup/global.ts +++ b/packages/adders/_tests/_setup/global.ts @@ -1,5 +1,5 @@ import { fileURLToPath } from 'node:url'; -import { setup, type ProjectVariant } from 'sv/test'; +import { setup, type ProjectVariant } from 'sv/testing'; import type { GlobalSetupContext } from 'vitest/node'; const TEST_DIR = fileURLToPath(new URL('../../../../.test-output/adders/', import.meta.url)); diff --git a/packages/adders/_tests/_setup/suite.ts b/packages/adders/_tests/_setup/suite.ts index 3e6f3ef9..df151f87 100644 --- a/packages/adders/_tests/_setup/suite.ts +++ b/packages/adders/_tests/_setup/suite.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; -import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/test'; +import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing'; import { chromium, type Browser, type Page } from '@playwright/test'; const cwd = vitest.inject('testDir'); diff --git a/packages/cli/bin.ts b/packages/cli/bin.ts index 4a4c8924..838dda5d 100644 --- a/packages/cli/bin.ts +++ b/packages/cli/bin.ts @@ -6,7 +6,7 @@ import { add } from './commands/add/index.ts'; import { create } from './commands/create.ts'; import { migrate } from './commands/migrate.ts'; import { check } from './commands/check.ts'; -import { helpConfig } from './common.ts'; +import { helpConfig } from './utils/common.ts'; program.name(pkg.name).version(pkg.version, '-v, --version').configureHelp(helpConfig); program.addCommand(create).addCommand(add).addCommand(migrate).addCommand(check); diff --git a/packages/cli/utils/fetch-packages.ts b/packages/cli/commands/add/fetch-packages.ts similarity index 98% rename from packages/cli/utils/fetch-packages.ts rename to packages/cli/commands/add/fetch-packages.ts index 9bb3e8ff..588e84a8 100644 --- a/packages/cli/utils/fetch-packages.ts +++ b/packages/cli/commands/add/fetch-packages.ts @@ -7,7 +7,7 @@ import { fileURLToPath } from 'node:url'; import type { AdderWithoutExplicitArgs } from '@sveltejs/cli-core'; // path to the `node_modules` directory of `sv` -const NODE_MODULES = path.join(fileURLToPath(import.meta.url), '..', '..', 'node_modules'); +const NODE_MODULES = fileURLToPath(new URL('../../../node_modules', import.meta.url)); const REGISTRY = 'https://registry.npmjs.org'; export const Directive = { file: 'file:', npm: 'npm:' }; diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 14e0ec05..de05a29b 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -15,11 +15,13 @@ import { getCommunityAdder } from '@sveltejs/adders'; import type { AdderWithoutExplicitArgs, OptionValues } from '@sveltejs/cli-core'; -import * as common from '../../common.ts'; -import { Directive, downloadPackage, getPackageJSON } from '../../utils/fetch-packages.ts'; +import * as common from '../../utils/common.ts'; import { createWorkspace } from './workspace.ts'; -import { getHighlighter, installPackages } from './utils.ts'; import { createOrUpdateFiles } from './processor.ts'; +import { getGlobalPreconditions } from './preconditions.ts'; +import { formatFiles, getHighlighter, installPackages } from './utils.ts'; +import { Directive, downloadPackage, getPackageJSON } from './fetch-packages.ts'; +import { installDependencies, packageManagerPrompt } from '../../utils/package-manager.ts'; const AddersSchema = v.array(v.string()); const AdderOptionFlagsSchema = v.object({ @@ -333,7 +335,7 @@ export async function runAddCommand( const { kit } = createWorkspace({ cwd: options.cwd }); const projectType = kit ? 'kit' : 'svelte'; const adders = selectedAdders.map(({ adder }) => adder); - const { preconditions } = common.getGlobalPreconditions(options.cwd, projectType, adders); + const { preconditions } = getGlobalPreconditions(options.cwd, projectType, adders); const fails: Array<{ name: string; message?: string }> = []; for (const condition of preconditions) { @@ -425,7 +427,7 @@ export async function runAddCommand( // prompt for package manager let packageManager: AgentName | undefined; if (options.install) { - packageManager = await common.packageManagerPrompt(options.cwd); + packageManager = await packageManagerPrompt(options.cwd); } // apply adders @@ -434,7 +436,7 @@ export async function runAddCommand( // install dependencies if (packageManager && options.install) { - await common.installDependencies(packageManager, options.cwd); + await installDependencies(packageManager, options.cwd); } // format modified/created files with prettier (if available) @@ -443,7 +445,7 @@ export async function runAddCommand( const { start, stop } = p.spinner(); start('Formatting modified files'); try { - await common.formatFiles({ packageManager, cwd: options.cwd, paths: filesToFormat }); + await formatFiles({ packageManager, cwd: options.cwd, paths: filesToFormat }); stop('Successfully formatted modified files'); } catch (e) { stop('Failed to format files'); diff --git a/packages/cli/commands/add/preconditions.ts b/packages/cli/commands/add/preconditions.ts new file mode 100644 index 00000000..50f90098 --- /dev/null +++ b/packages/cli/commands/add/preconditions.ts @@ -0,0 +1,66 @@ +import { exec } from 'tinyexec'; +import type { AdderWithoutExplicitArgs, Precondition } from '@sveltejs/cli-core'; + +type PreconditionCheck = { name: string; preconditions: Precondition[] }; +export function getGlobalPreconditions( + cwd: string, + projectType: 'svelte' | 'kit', + adders: AdderWithoutExplicitArgs[] +): PreconditionCheck { + return { + name: 'global checks', + preconditions: [ + { + name: 'clean working directory', + run: async () => { + try { + // If a user has pending git changes the output of the following command will list + // all files that have been added/modified/deleted and thus the output will not be empty. + // In case the output of the command below is an empty text, we can safely assume + // there are no pending changes. If the below command is run outside of a git repository, + // git will exit with a failing exit code, which will trigger the catch statement. + // also see https://remarkablemark.org/blog/2017/10/12/check-git-dirty/#git-status + const { stdout } = await exec('git', ['status', '--short'], { + nodeOptions: { cwd }, + throwOnError: true + }); + + if (stdout) { + return { success: false, message: 'Found modified files' }; + } + + return { success: true, message: undefined }; + } catch { + return { success: true, message: 'Not a git repository' }; + } + } + }, + { + name: 'supported environments', + run: () => { + const addersForInvalidEnvironment = adders.filter((a) => { + const supportedEnvironments = a.environments; + if (projectType === 'kit' && !supportedEnvironments.kit) return true; + if (projectType === 'svelte' && !supportedEnvironments.svelte) return true; + + return false; + }); + + if (addersForInvalidEnvironment.length === 0) { + return { success: true, message: undefined }; + } + + const messages = addersForInvalidEnvironment.map((a) => { + if (projectType === 'kit') { + return `'${a.id}' does not support SvelteKit`; + } else { + return `'${a.id}' requires SvelteKit`; + } + }); + + throw new Error(messages.join('\n')); + } + } + ] + }; +} diff --git a/packages/cli/commands/add/utils.ts b/packages/cli/commands/add/utils.ts index d9a12bdd..55051644 100644 --- a/packages/cli/commands/add/utils.ts +++ b/packages/cli/commands/add/utils.ts @@ -1,8 +1,10 @@ import fs from 'node:fs'; import path from 'node:path'; import pc from 'picocolors'; +import { exec } from 'tinyexec'; import { parseJson } from '@sveltejs/cli-core/parsers'; import type { Adder, Highlighter, Workspace } from '@sveltejs/cli-core'; +import { resolveCommand, type AgentName } from 'package-manager-detector'; export type Package = { name: string; @@ -30,8 +32,21 @@ export function getPackageJson(cwd: string): { return { source: packageText, data: data as Package, generateCode }; } +export async function formatFiles(options: { + packageManager: AgentName; + cwd: string; + paths: string[]; +}): Promise { + const args = ['prettier', '--write', '--ignore-unknown', ...options.paths]; + const cmd = resolveCommand(options.packageManager, 'execute-local', args)!; + await exec(cmd.command, cmd.args, { + nodeOptions: { cwd: options.cwd, stdio: 'pipe' }, + throwOnError: true + }); +} + export function readFile(cwd: string, filePath: string): string { - const fullFilePath = getFilePath(cwd, filePath); + const fullFilePath = path.resolve(cwd, filePath); if (!fileExists(cwd, filePath)) { return ''; @@ -76,7 +91,7 @@ function alphabetizeProperties(obj: Record) { } export function writeFile(workspace: Workspace, filePath: string, content: string): void { - const fullFilePath = getFilePath(workspace.cwd, filePath); + const fullFilePath = path.resolve(workspace.cwd, filePath); const fullDirectoryPath = path.dirname(fullFilePath); if (content && !content.endsWith('\n')) content += '\n'; @@ -89,14 +104,10 @@ export function writeFile(workspace: Workspace, filePath: string, content: } export function fileExists(cwd: string, filePath: string): boolean { - const fullFilePath = getFilePath(cwd, filePath); + const fullFilePath = path.resolve(cwd, filePath); return fs.existsSync(fullFilePath); } -export function getFilePath(cwd: string, fileName: string): string { - return path.join(cwd, fileName); -} - export const commonFilePaths = { packageJson: 'package.json', svelteConfig: 'svelte.config.js', diff --git a/packages/cli/commands/add/workspace.ts b/packages/cli/commands/add/workspace.ts index 6e93d7e5..ac4d396f 100644 --- a/packages/cli/commands/add/workspace.ts +++ b/packages/cli/commands/add/workspace.ts @@ -3,11 +3,11 @@ import path from 'node:path'; import * as find from 'empathic/find'; import { common, object, type AstTypes } from '@sveltejs/cli-core/js'; import { parseScript } from '@sveltejs/cli-core/parsers'; -import { TESTING } from '../../env.ts'; -import { getUserAgent } from '../../common.ts'; -import { commonFilePaths, getPackageJson, readFile } from './utils.ts'; import type { Workspace } from '@sveltejs/cli-core'; import type { AgentName } from 'package-manager-detector'; +import { TESTING } from '../../utils/env.ts'; +import { commonFilePaths, getPackageJson, readFile } from './utils.ts'; +import { getUserAgent } from '../../utils/package-manager.ts'; type CreateWorkspaceOptions = { cwd: string; packageManager?: AgentName }; export function createWorkspace({ cwd, packageManager }: CreateWorkspaceOptions): Workspace { diff --git a/packages/cli/commands/check.ts b/packages/cli/commands/check.ts index eb925103..23797d20 100644 --- a/packages/cli/commands/check.ts +++ b/packages/cli/commands/check.ts @@ -1,10 +1,10 @@ -import { execSync } from 'node:child_process'; import process from 'node:process'; +import { execSync } from 'node:child_process'; import pc from 'picocolors'; -import * as resolve from 'empathic/resolve'; import { Command } from 'commander'; +import * as resolve from 'empathic/resolve'; import { resolveCommand } from 'package-manager-detector/commands'; -import { getUserAgent } from '../common.ts'; +import { getUserAgent } from '../utils/package-manager.ts'; export const check = new Command('check') .description('a CLI for checking your Svelte code') diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts index 37a5267d..ac3463e1 100644 --- a/packages/cli/commands/create.ts +++ b/packages/cli/commands/create.ts @@ -11,9 +11,14 @@ import { type LanguageType, type TemplateType } from '@sveltejs/create'; -import * as common from '../common.js'; +import * as common from '../utils/common.ts'; import { runAddCommand } from './add/index.ts'; import { detectSync, type AgentName } from 'package-manager-detector'; +import { + getUserAgent, + installDependencies, + packageManagerPrompt +} from '../utils/package-manager.ts'; const langs = ['ts', 'jsdoc'] as const; const langMap: Record = { @@ -58,7 +63,7 @@ export const create = new Command('create') let i = 1; const initialSteps: string[] = []; const relative = path.relative(process.cwd(), directory); - const pm = packageManager ?? detectSync({ cwd })?.name ?? common.getUserAgent() ?? 'npm'; + const pm = packageManager ?? detectSync({ cwd })?.name ?? getUserAgent() ?? 'npm'; if (relative !== '') { const pathHasSpaces = relative.includes(' '); initialSteps.push( @@ -154,8 +159,8 @@ async function createProject(cwd: string, options: Options) { let packageManager: AgentName | undefined | null; let addOnNextSteps: string | undefined; const installDeps = async () => { - packageManager = await common.packageManagerPrompt(projectPath); - if (packageManager) await common.installDependencies(packageManager, projectPath); + packageManager = await packageManagerPrompt(projectPath); + if (packageManager) await installDependencies(packageManager, projectPath); }; if (options.addOns) { diff --git a/packages/cli/commands/migrate.ts b/packages/cli/commands/migrate.ts index 88a5dd7c..b3fecb36 100644 --- a/packages/cli/commands/migrate.ts +++ b/packages/cli/commands/migrate.ts @@ -2,7 +2,7 @@ import { execSync } from 'node:child_process'; import process from 'node:process'; import { Command } from 'commander'; import { resolveCommand } from 'package-manager-detector'; -import { getUserAgent } from '../common.ts'; +import { getUserAgent } from '../utils/package-manager.ts'; export const migrate = new Command('migrate') .description('a CLI for migrating Svelte(Kit) codebases') diff --git a/packages/cli/common.ts b/packages/cli/common.ts deleted file mode 100644 index 13035fd3..00000000 --- a/packages/cli/common.ts +++ /dev/null @@ -1,206 +0,0 @@ -import process from 'node:process'; -import pc from 'picocolors'; -import pkg from './package.json'; -import { exec } from 'tinyexec'; -import * as p from '@sveltejs/clack-prompts'; -import { AGENTS, type AgentName, detectSync } from 'package-manager-detector'; -import { COMMANDS, constructCommand, resolveCommand } from 'package-manager-detector/commands'; -import type { Argument, HelpConfiguration, Option } from 'commander'; -import type { AdderWithoutExplicitArgs, Precondition } from '@sveltejs/cli-core'; - -const NO_PREFIX = '--no-'; -let options: readonly Option[] = []; - -function getLongFlag(flags: string) { - return flags - .split(',') - .map((f) => f.trim()) - .find((f) => f.startsWith('--')); -} - -export const helpConfig: HelpConfiguration = { - argumentDescription: formatDescription, - optionDescription: formatDescription, - visibleOptions(cmd) { - // hack so that we can access existing options in `optionTerm` - options = cmd.options; - - const visible = cmd.options.filter((o) => !o.hidden); - const show: Option[] = []; - // hide any `--no-` flag variants if there's an existing flag of a similar name - // e.g. `--types` and `--no-types` will combine into a single `--[no-]types` flag - for (const option of visible) { - const flag = getLongFlag(option.flags); - if (flag?.startsWith(NO_PREFIX)) { - const stripped = flag.slice(NO_PREFIX.length); - const isNoVariant = visible.some((o) => getLongFlag(o.flags)?.startsWith(`--${stripped}`)); - if (isNoVariant) continue; - } - show.push(option); - } - return show; - }, - optionTerm(option) { - const longFlag = getLongFlag(option.flags); - const flag = longFlag?.split(' ').at(0); - if (!flag || !longFlag) return option.flags; - - // check if there's a `--no-{flag}` variant - const noVariant = `--no-${flag.slice(2)}`; - const hasVariant = options.some((o) => getLongFlag(o.flags) === noVariant); - if (hasVariant) { - return `--[no-]${longFlag.slice(2)}`; - } - - return option.flags; - } -}; - -function formatDescription(arg: Option | Argument): string { - let output = arg.description; - if (arg.defaultValue !== undefined && String(arg.defaultValue)) { - output += pc.dim(` (default: ${JSON.stringify(arg.defaultValue)})`); - } - if (arg.argChoices !== undefined && String(arg.argChoices)) { - output += pc.dim(` (choices: ${arg.argChoices.join(', ')})`); - } - return output; -} - -type MaybePromise = () => Promise | void; - -export async function runCommand(action: MaybePromise): Promise { - try { - p.intro(`Welcome to the Svelte CLI! ${pc.gray(`(v${pkg.version})`)}`); - await action(); - p.outro("You're all set!"); - } catch (e) { - p.cancel('Operation failed.'); - if (e instanceof Error) { - console.error(e.stack ?? e); - } - } -} - -export async function formatFiles(options: { - packageManager: AgentName; - cwd: string; - paths: string[]; -}): Promise { - const args = ['prettier', '--write', '--ignore-unknown', ...options.paths]; - const cmd = resolveCommand(options.packageManager, 'execute-local', args)!; - await exec(cmd.command, cmd.args, { - nodeOptions: { cwd: options.cwd, stdio: 'pipe' }, - throwOnError: true - }); -} - -const agents = AGENTS.filter((agent): agent is AgentName => !agent.includes('@')); -const agentOptions: PackageManagerOptions = agents.map((pm) => ({ value: pm, label: pm })); -agentOptions.unshift({ label: 'None', value: undefined }); - -type PackageManagerOptions = Array<{ value: AgentName | undefined; label: AgentName | 'None' }>; -export async function packageManagerPrompt(cwd: string): Promise { - const detected = detectSync({ cwd }); - const agent = detected?.name ?? getUserAgent(); - - const pm = await p.select({ - message: 'Which package manager do you want to install dependencies with?', - options: agentOptions, - initialValue: agent - }); - if (p.isCancel(pm)) { - p.cancel('Operation cancelled.'); - process.exit(1); - } - - return pm; -} - -export async function installDependencies(agent: AgentName, cwd: string): Promise { - const spinner = p.spinner(); - spinner.start('Installing dependencies...'); - try { - const { command, args } = constructCommand(COMMANDS[agent].install, [])!; - await exec(command, args, { nodeOptions: { cwd }, throwOnError: true }); - - spinner.stop('Successfully installed dependencies'); - } catch (error) { - spinner.stop('Failed to install dependencies', 2); - throw error; - } -} - -export function getUserAgent(): AgentName | undefined { - const userAgent = process.env.npm_config_user_agent; - if (!userAgent) return undefined; - - const pmSpec = userAgent.split(' ')[0]!; - const separatorPos = pmSpec.lastIndexOf('/'); - const name = pmSpec.substring(0, separatorPos) as AgentName; - return AGENTS.includes(name) ? name : undefined; -} - -type PreconditionCheck = { name: string; preconditions: Precondition[] }; -export function getGlobalPreconditions( - cwd: string, - projectType: 'svelte' | 'kit', - adders: AdderWithoutExplicitArgs[] -): PreconditionCheck { - return { - name: 'global checks', - preconditions: [ - { - name: 'clean working directory', - run: async () => { - try { - // If a user has pending git changes the output of the following command will list - // all files that have been added/modified/deleted and thus the output will not be empty. - // In case the output of the command below is an empty text, we can safely assume - // there are no pending changes. If the below command is run outside of a git repository, - // git will exit with a failing exit code, which will trigger the catch statement. - // also see https://remarkablemark.org/blog/2017/10/12/check-git-dirty/#git-status - const { stdout } = await exec('git', ['status', '--short'], { - nodeOptions: { cwd }, - throwOnError: true - }); - - if (stdout) { - return { success: false, message: 'Found modified files' }; - } - - return { success: true, message: undefined }; - } catch { - return { success: true, message: 'Not a git repository' }; - } - } - }, - { - name: 'supported environments', - run: () => { - const addersForInvalidEnvironment = adders.filter((a) => { - const supportedEnvironments = a.environments; - if (projectType === 'kit' && !supportedEnvironments.kit) return true; - if (projectType === 'svelte' && !supportedEnvironments.svelte) return true; - - return false; - }); - - if (addersForInvalidEnvironment.length === 0) { - return { success: true, message: undefined }; - } - - const messages = addersForInvalidEnvironment.map((a) => { - if (projectType === 'kit') { - return `'${a.id}' does not support SvelteKit`; - } else { - return `'${a.id}' requires SvelteKit`; - } - }); - - throw new Error(messages.join('\n')); - } - } - ] - }; -} diff --git a/packages/cli/index.ts b/packages/cli/index.ts deleted file mode 100644 index 31079a3c..00000000 --- a/packages/cli/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { create } from '@sveltejs/create'; -export { installAddon } from './lib/install.ts'; -export type { AddonMap, InstallOptions, OptionMap } from './lib/install.ts'; diff --git a/packages/cli/lib/index.ts b/packages/cli/lib/index.ts new file mode 100644 index 00000000..13aa9292 --- /dev/null +++ b/packages/cli/lib/index.ts @@ -0,0 +1,3 @@ +export { create } from '@sveltejs/create'; +export { installAddon } from './install.ts'; +export type { AddonMap, InstallOptions, OptionMap } from './install.ts'; diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index a36ef024..555da7e8 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -1,9 +1,9 @@ import { exec } from 'tinyexec'; import { resolveCommand } from 'package-manager-detector'; import type { Adder, Workspace, PackageManager, OptionValues, Question } from '@sveltejs/cli-core'; +import { installPackages } from '../commands/add/utils.ts'; import { createWorkspace } from '../commands/add/workspace.ts'; import { createOrUpdateFiles } from '../commands/add/processor.ts'; -import { installPackages } from '../commands/add/utils.ts'; type Addon = Adder; export type InstallOptions = { diff --git a/packages/cli/testing.ts b/packages/cli/lib/testing.ts similarity index 97% rename from packages/cli/testing.ts rename to packages/cli/lib/testing.ts index 907319a1..62857525 100644 --- a/packages/cli/testing.ts +++ b/packages/cli/lib/testing.ts @@ -1,6 +1,6 @@ import fs from 'node:fs'; -import process from 'node:process'; import path from 'node:path'; +import process from 'node:process'; import degit from 'degit'; import { exec } from 'tinyexec'; import { create } from '@sveltejs/create'; @@ -137,13 +137,12 @@ async function terminate(pid: number) { for (let i = children.length - 1; i >= 0; i--) { const child = children[i]; const pid = Number(child.PID); - try { - process.kill(pid); - } catch { - // this can happen if a process has been automatically terminated. - } + kill(pid); } + kill(pid); +} +function kill(pid: number) { try { process.kill(pid); } catch { diff --git a/packages/cli/package.json b/packages/cli/package.json index 4f80ef88..291f8afc 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -21,11 +21,11 @@ "bin": "./dist/bin.js", "exports": { ".": { - "types": "./dist/index.d.ts", + "types": "./dist/lib/index.d.ts", "default": "./dist/index.js" }, - "./test": { - "types": "./dist/testing.d.ts", + "./testing": { + "types": "./dist/lib/testing.d.ts", "default": "./dist/testing.js" } }, diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 9249a2e6..54c4c150 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -6,5 +6,5 @@ "declaration": true }, // we'll only want to enforce `isolatedDeclarations` on the library portion of the CLI - "include": ["index.ts", "testing.ts"] + "include": ["lib/index.ts", "lib/testing.ts"] } diff --git a/packages/cli/utils/common.ts b/packages/cli/utils/common.ts new file mode 100644 index 00000000..bfcbfd16 --- /dev/null +++ b/packages/cli/utils/common.ts @@ -0,0 +1,78 @@ +import pc from 'picocolors'; +import pkg from '../package.json'; +import * as p from '@sveltejs/clack-prompts'; +import type { Argument, HelpConfiguration, Option } from 'commander'; + +const NO_PREFIX = '--no-'; +let options: readonly Option[] = []; + +function getLongFlag(flags: string) { + return flags + .split(',') + .map((f) => f.trim()) + .find((f) => f.startsWith('--')); +} + +export const helpConfig: HelpConfiguration = { + argumentDescription: formatDescription, + optionDescription: formatDescription, + visibleOptions(cmd) { + // hack so that we can access existing options in `optionTerm` + options = cmd.options; + + const visible = cmd.options.filter((o) => !o.hidden); + const show: Option[] = []; + // hide any `--no-` flag variants if there's an existing flag of a similar name + // e.g. `--types` and `--no-types` will combine into a single `--[no-]types` flag + for (const option of visible) { + const flag = getLongFlag(option.flags); + if (flag?.startsWith(NO_PREFIX)) { + const stripped = flag.slice(NO_PREFIX.length); + const isNoVariant = visible.some((o) => getLongFlag(o.flags)?.startsWith(`--${stripped}`)); + if (isNoVariant) continue; + } + show.push(option); + } + return show; + }, + optionTerm(option) { + const longFlag = getLongFlag(option.flags); + const flag = longFlag?.split(' ').at(0); + if (!flag || !longFlag) return option.flags; + + // check if there's a `--no-{flag}` variant + const noVariant = `--no-${flag.slice(2)}`; + const hasVariant = options.some((o) => getLongFlag(o.flags) === noVariant); + if (hasVariant) { + return `--[no-]${longFlag.slice(2)}`; + } + + return option.flags; + } +}; + +function formatDescription(arg: Option | Argument): string { + let output = arg.description; + if (arg.defaultValue !== undefined && String(arg.defaultValue)) { + output += pc.dim(` (default: ${JSON.stringify(arg.defaultValue)})`); + } + if (arg.argChoices !== undefined && String(arg.argChoices)) { + output += pc.dim(` (choices: ${arg.argChoices.join(', ')})`); + } + return output; +} + +type MaybePromise = () => Promise | void; + +export async function runCommand(action: MaybePromise): Promise { + try { + p.intro(`Welcome to the Svelte CLI! ${pc.gray(`(v${pkg.version})`)}`); + await action(); + p.outro("You're all set!"); + } catch (e) { + p.cancel('Operation failed.'); + if (e instanceof Error) { + console.error(e.stack ?? e); + } + } +} diff --git a/packages/cli/env.ts b/packages/cli/utils/env.ts similarity index 100% rename from packages/cli/env.ts rename to packages/cli/utils/env.ts diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts new file mode 100644 index 00000000..c0226505 --- /dev/null +++ b/packages/cli/utils/package-manager.ts @@ -0,0 +1,56 @@ +import process from 'node:process'; +import { exec } from 'tinyexec'; +import * as p from '@sveltejs/clack-prompts'; +import { + AGENTS, + COMMANDS, + constructCommand, + detectSync, + type AgentName +} from 'package-manager-detector'; + +const agents = AGENTS.filter((agent): agent is AgentName => !agent.includes('@')); +const agentOptions: PackageManagerOptions = agents.map((pm) => ({ value: pm, label: pm })); +agentOptions.unshift({ label: 'None', value: undefined }); + +type PackageManagerOptions = Array<{ value: AgentName | undefined; label: AgentName | 'None' }>; +export async function packageManagerPrompt(cwd: string): Promise { + const detected = detectSync({ cwd }); + const agent = detected?.name ?? getUserAgent(); + + const pm = await p.select({ + message: 'Which package manager do you want to install dependencies with?', + options: agentOptions, + initialValue: agent + }); + if (p.isCancel(pm)) { + p.cancel('Operation cancelled.'); + process.exit(1); + } + + return pm; +} + +export async function installDependencies(agent: AgentName, cwd: string): Promise { + const spinner = p.spinner(); + spinner.start('Installing dependencies...'); + try { + const { command, args } = constructCommand(COMMANDS[agent].install, [])!; + await exec(command, args, { nodeOptions: { cwd }, throwOnError: true }); + + spinner.stop('Successfully installed dependencies'); + } catch (error) { + spinner.stop('Failed to install dependencies', 2); + throw error; + } +} + +export function getUserAgent(): AgentName | undefined { + const userAgent = process.env.npm_config_user_agent; + if (!userAgent) return undefined; + + const pmSpec = userAgent.split(' ')[0]!; + const separatorPos = pmSpec.lastIndexOf('/'); + const name = pmSpec.substring(0, separatorPos) as AgentName; + return AGENTS.includes(name) ? name : undefined; +} diff --git a/rollup.config.js b/rollup.config.js index c11e3d9d..6ec4e049 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -35,7 +35,11 @@ function getConfig(project) { parsers: `${projectRoot}/tooling/parsers.ts` }; } else if (project === 'cli') { - inputs = [`${projectRoot}/index.ts`, `${projectRoot}/testing.ts`, `${projectRoot}/bin.ts`]; + inputs = [ + `${projectRoot}/lib/index.ts`, + `${projectRoot}/lib/testing.ts`, + `${projectRoot}/bin.ts` + ]; } else { inputs = [`${projectRoot}/index.ts`]; } @@ -109,9 +113,7 @@ function getConfig(project) { plugins: [ preserveShebangs(), 'exports' in pkg && - dts({ - include: project === 'cli' ? [inputs[0], inputs[1], `${projectRoot}/lib/*`] : undefined - }), + dts({ include: project === 'cli' ? [`${projectRoot}/lib/*`] : undefined }), esbuild(), nodeResolve({ preferBuiltins: true, rootDir: projectRoot }), commonjs(), @@ -119,7 +121,7 @@ function getConfig(project) { dynamicImportVars({ // since we're relying on the usage of standard dynamic imports for community adders, we need to // prevent this plugin from transforming these cases - exclude: ['packages/cli/utils/fetch-packages.ts'] + exclude: ['packages/cli/commands/add/fetch-packages.ts'] }), buildCliTemplatesPlugin, communityAdderIdsPlugin From 650ede77fc35bee00b4c828315c624a19f0a0c43 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:20:25 -0500 Subject: [PATCH 57/70] fixes --- community-adder-template/tests/setup/global.ts | 2 +- packages/adders/vitest.config.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/community-adder-template/tests/setup/global.ts b/community-adder-template/tests/setup/global.ts index 9b38192b..872cd690 100644 --- a/community-adder-template/tests/setup/global.ts +++ b/community-adder-template/tests/setup/global.ts @@ -3,7 +3,7 @@ import { setup, type ProjectVariant } from 'sv/testing'; import type { GlobalSetupContext } 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 TEST_DIR = fileURLToPath(new URL('../../.test-output/', import.meta.url)); export default async function ({ provide }: GlobalSetupContext) { // global setup (e.g. spin up docker containers) diff --git a/packages/adders/vitest.config.ts b/packages/adders/vitest.config.ts index 0d571dee..9f43ca88 100644 --- a/packages/adders/vitest.config.ts +++ b/packages/adders/vitest.config.ts @@ -10,7 +10,6 @@ export default defineConfig({ globalSetup: ['_tests/_setup/global.ts'], testTimeout: ONE_MINUTE * 3, hookTimeout: ONE_MINUTE * 3, - retry: env.CI ? 3 : 0, - pool: 'threads' + retry: env.CI ? 3 : 0 } }); From 047c549a9cf92834025e7211bdd5309346945c3e Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sun, 10 Nov 2024 13:11:19 -0500 Subject: [PATCH 58/70] format before evaluating test --- .prettierignore | 2 -- .../core/tests/css/common/add-at-rule/input.css | 2 +- .../core/tests/css/common/add-at-rule/output.css | 4 ++-- .../core/tests/css/common/add-comment/input.css | 2 +- .../core/tests/css/common/add-comment/output.css | 2 +- .../core/tests/css/common/add-imports/input.css | 2 +- .../core/tests/css/common/add-imports/output.css | 2 +- packages/core/tests/css/common/add-rule/input.css | 2 +- packages/core/tests/css/common/add-rule/output.css | 7 ++++--- packages/core/tests/css/index.ts | 12 +++++++++--- .../core/tests/html/common/create-div/output.html | 3 ++- .../tests/html/common/create-element/output.html | 3 ++- packages/core/tests/html/index.ts | 12 +++++++++--- .../core/tests/js/arrays/object-array/output.ts | 13 ++++++++----- .../core/tests/js/arrays/string-array/output.ts | 2 +- .../core/tests/js/common/jsdoc-comment/input.ts | 6 +++--- .../core/tests/js/common/jsdoc-comment/output.ts | 6 +++--- .../exports/default-export-with-variable/output.ts | 4 ++-- .../core/tests/js/exports/default-export/output.ts | 4 ++-- .../js/exports/named-export-with-existing/output.ts | 6 +++--- .../core/tests/js/exports/named-export/output.ts | 6 +++--- .../tests/js/functions/arrow-function/output.ts | 6 +++--- .../core/tests/js/functions/function-call/output.ts | 2 +- .../core/tests/js/imports/default-import/output.ts | 2 +- .../core/tests/js/imports/empty-import/output.ts | 2 +- .../tests/js/imports/named-import-merging/input.ts | 2 +- .../tests/js/imports/named-import-merging/output.ts | 2 +- .../core/tests/js/imports/named-import/output.ts | 2 +- .../tests/js/imports/namespaced-import/output.ts | 2 +- packages/core/tests/js/index.ts | 12 +++++++++--- packages/core/tests/js/object/create/output.ts | 6 +++--- .../core/tests/js/object/override-property/input.ts | 8 ++++---- .../tests/js/object/override-property/output.ts | 8 ++++---- packages/core/tests/js/object/property/input.ts | 4 ++-- packages/core/tests/js/object/property/output.ts | 6 +++--- .../core/tests/js/object/remove-property/input.ts | 6 +++--- .../core/tests/js/object/remove-property/output.ts | 2 +- .../core/tests/js/variables/declaration/output.ts | 4 ++-- .../js/variables/type-annotate-declarator/input.ts | 2 +- .../js/variables/type-annotate-declarator/output.ts | 2 +- prettier.config.js | 9 ++++----- 41 files changed, 106 insertions(+), 85 deletions(-) delete mode 100644 .prettierignore diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index ea3293fe..00000000 --- a/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -packages/core/tests/**/input.* -packages/core/tests/**/output.* diff --git a/packages/core/tests/css/common/add-at-rule/input.css b/packages/core/tests/css/common/add-at-rule/input.css index faa4215a..cedf0a6d 100644 --- a/packages/core/tests/css/common/add-at-rule/input.css +++ b/packages/core/tests/css/common/add-at-rule/input.css @@ -1,3 +1,3 @@ .foo { - color: red; + color: red; } diff --git a/packages/core/tests/css/common/add-at-rule/output.css b/packages/core/tests/css/common/add-at-rule/output.css index ae662e2b..e2a2d26f 100644 --- a/packages/core/tests/css/common/add-at-rule/output.css +++ b/packages/core/tests/css/common/add-at-rule/output.css @@ -1,5 +1,5 @@ @tailwind 'lib/path/file.ext'; .foo { - color: red; + color: red; } -@tailwind 'lib/path/file1.ext' +@tailwind 'lib/path/file1.ext'; diff --git a/packages/core/tests/css/common/add-comment/input.css b/packages/core/tests/css/common/add-comment/input.css index faa4215a..cedf0a6d 100644 --- a/packages/core/tests/css/common/add-comment/input.css +++ b/packages/core/tests/css/common/add-comment/input.css @@ -1,3 +1,3 @@ .foo { - color: red; + color: red; } diff --git a/packages/core/tests/css/common/add-comment/output.css b/packages/core/tests/css/common/add-comment/output.css index cc8bc00f..fbb03f63 100644 --- a/packages/core/tests/css/common/add-comment/output.css +++ b/packages/core/tests/css/common/add-comment/output.css @@ -1,4 +1,4 @@ .foo { - color: red; + color: red; } /* foo comment */ diff --git a/packages/core/tests/css/common/add-imports/input.css b/packages/core/tests/css/common/add-imports/input.css index faa4215a..cedf0a6d 100644 --- a/packages/core/tests/css/common/add-imports/input.css +++ b/packages/core/tests/css/common/add-imports/input.css @@ -1,3 +1,3 @@ .foo { - color: red; + color: red; } diff --git a/packages/core/tests/css/common/add-imports/output.css b/packages/core/tests/css/common/add-imports/output.css index e5b67d82..4f96db19 100644 --- a/packages/core/tests/css/common/add-imports/output.css +++ b/packages/core/tests/css/common/add-imports/output.css @@ -1,4 +1,4 @@ @import 'lib/path/file.css'; .foo { - color: red; + color: red; } diff --git a/packages/core/tests/css/common/add-rule/input.css b/packages/core/tests/css/common/add-rule/input.css index faa4215a..cedf0a6d 100644 --- a/packages/core/tests/css/common/add-rule/input.css +++ b/packages/core/tests/css/common/add-rule/input.css @@ -1,3 +1,3 @@ .foo { - color: red; + color: red; } diff --git a/packages/core/tests/css/common/add-rule/output.css b/packages/core/tests/css/common/add-rule/output.css index 5c63305b..c99b655a 100644 --- a/packages/core/tests/css/common/add-rule/output.css +++ b/packages/core/tests/css/common/add-rule/output.css @@ -1,5 +1,6 @@ .foo { - color: red; -}.bar { - color: blue + color: red; +} +.bar { + color: blue; } diff --git a/packages/core/tests/css/index.ts b/packages/core/tests/css/index.ts index 738e1cb8..77a89d83 100644 --- a/packages/core/tests/css/index.ts +++ b/packages/core/tests/css/index.ts @@ -1,12 +1,17 @@ -import { describe, expect, test } from 'vitest'; -import { parseCss, serializeCss } from '@sveltejs/ast-tooling'; import fs from 'node:fs'; import { join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; +import prettier from 'prettier'; +import { describe, expect, test } from 'vitest'; +import { parseCss, serializeCss } from '@sveltejs/ast-tooling'; const baseDir = resolve(fileURLToPath(import.meta.url), '..'); const categoryDirectories = getDirectoryNames(baseDir); +const prettierConfig = await prettier.resolveConfig(import.meta.url); +if (!prettierConfig) throw new Error('Failed to resolve prettier config'); +prettierConfig.filepath = 'output.css'; + for (const categoryDirectory of categoryDirectories) { describe(categoryDirectory, () => { const testNames = getDirectoryNames(join(baseDir, categoryDirectory)); @@ -23,7 +28,8 @@ for (const categoryDirectory of categoryDirectories) { module.run({ ast }); const output = serializeCss(ast); - await expect(output).toMatchFileSnapshot(`${testDirectoryPath}/output.css`); + const formattedOutput = await prettier.format(output, prettierConfig); + await expect(formattedOutput).toMatchFileSnapshot(`${testDirectoryPath}/output.css`); }); } }); diff --git a/packages/core/tests/html/common/create-div/output.html b/packages/core/tests/html/common/create-div/output.html index f9cce455..d68abe73 100644 --- a/packages/core/tests/html/common/create-div/output.html +++ b/packages/core/tests/html/common/create-div/output.html @@ -1,2 +1,3 @@ -
+
+
diff --git a/packages/core/tests/html/common/create-element/output.html b/packages/core/tests/html/common/create-element/output.html index 351470bd..6a6aa0de 100644 --- a/packages/core/tests/html/common/create-element/output.html +++ b/packages/core/tests/html/common/create-element/output.html @@ -1,2 +1,3 @@ -
+ +
diff --git a/packages/core/tests/html/index.ts b/packages/core/tests/html/index.ts index 6719acd4..dfad1d0d 100644 --- a/packages/core/tests/html/index.ts +++ b/packages/core/tests/html/index.ts @@ -1,12 +1,17 @@ -import { describe, expect, test } from 'vitest'; -import { parseHtml, serializeHtml } from '@sveltejs/ast-tooling'; import fs from 'node:fs'; import { join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; +import prettier from 'prettier'; +import { describe, expect, test } from 'vitest'; +import { parseHtml, serializeHtml } from '@sveltejs/ast-tooling'; const baseDir = resolve(fileURLToPath(import.meta.url), '..'); const categoryDirectories = getDirectoryNames(baseDir); +const prettierConfig = await prettier.resolveConfig(import.meta.url); +if (!prettierConfig) throw new Error('Failed to resolve prettier config'); +prettierConfig.filepath = 'output.html'; + for (const categoryDirectory of categoryDirectories) { describe(categoryDirectory, () => { const testNames = getDirectoryNames(join(baseDir, categoryDirectory)); @@ -23,7 +28,8 @@ for (const categoryDirectory of categoryDirectories) { module.run({ ast }); const output = serializeHtml(ast); - await expect(output).toMatchFileSnapshot(`${testDirectoryPath}/output.html`); + const formattedOutput = await prettier.format(output, prettierConfig); + await expect(formattedOutput).toMatchFileSnapshot(`${testDirectoryPath}/output.html`); }); } }); diff --git a/packages/core/tests/js/arrays/object-array/output.ts b/packages/core/tests/js/arrays/object-array/output.ts index c47de750..1fa08802 100644 --- a/packages/core/tests/js/arrays/object-array/output.ts +++ b/packages/core/tests/js/arrays/object-array/output.ts @@ -1,5 +1,8 @@ -const array = [{ - test: true -}, { - test2: 'string' -}]; \ No newline at end of file +const array = [ + { + test: true + }, + { + test2: 'string' + } +]; diff --git a/packages/core/tests/js/arrays/string-array/output.ts b/packages/core/tests/js/arrays/string-array/output.ts index 7d00f941..e7618b3e 100644 --- a/packages/core/tests/js/arrays/string-array/output.ts +++ b/packages/core/tests/js/arrays/string-array/output.ts @@ -1 +1 @@ -const array = ['test', 'test2']; \ No newline at end of file +const array = ['test', 'test2']; diff --git a/packages/core/tests/js/common/jsdoc-comment/input.ts b/packages/core/tests/js/common/jsdoc-comment/input.ts index c4a1447a..a3423c81 100644 --- a/packages/core/tests/js/common/jsdoc-comment/input.ts +++ b/packages/core/tests/js/common/jsdoc-comment/input.ts @@ -1,5 +1,5 @@ function switchToLanguage(newLanguage) { - const canonicalPath = i18n.route($page.url.pathname); - const localisedPath = i18n.resolveRoute(canonicalPath, newLanguage); - goto(localisedPath); + const canonicalPath = i18n.route($page.url.pathname); + const localisedPath = i18n.resolveRoute(canonicalPath, newLanguage); + goto(localisedPath); } diff --git a/packages/core/tests/js/common/jsdoc-comment/output.ts b/packages/core/tests/js/common/jsdoc-comment/output.ts index d97338ba..2394044f 100644 --- a/packages/core/tests/js/common/jsdoc-comment/output.ts +++ b/packages/core/tests/js/common/jsdoc-comment/output.ts @@ -2,7 +2,7 @@ * @param {import("$lib/paraglide/runtime").AvailableLanguageTag} newLanguage */ function switchToLanguage(newLanguage) { - const canonicalPath = i18n.route($page.url.pathname); - const localisedPath = i18n.resolveRoute(canonicalPath, newLanguage); - goto(localisedPath); + const canonicalPath = i18n.route($page.url.pathname); + const localisedPath = i18n.resolveRoute(canonicalPath, newLanguage); + goto(localisedPath); } diff --git a/packages/core/tests/js/exports/default-export-with-variable/output.ts b/packages/core/tests/js/exports/default-export-with-variable/output.ts index e3eafc9d..920afac1 100644 --- a/packages/core/tests/js/exports/default-export-with-variable/output.ts +++ b/packages/core/tests/js/exports/default-export-with-variable/output.ts @@ -1,5 +1,5 @@ const object = { - test: 'string' + test: 'string' }; -export default object; \ No newline at end of file +export default object; diff --git a/packages/core/tests/js/exports/default-export/output.ts b/packages/core/tests/js/exports/default-export/output.ts index 76088cc4..d2516b3e 100644 --- a/packages/core/tests/js/exports/default-export/output.ts +++ b/packages/core/tests/js/exports/default-export/output.ts @@ -1,3 +1,3 @@ export default { - test: 'string' -}; \ No newline at end of file + test: 'string' +}; diff --git a/packages/core/tests/js/exports/named-export-with-existing/output.ts b/packages/core/tests/js/exports/named-export-with-existing/output.ts index 9bcf50f5..3cc72fee 100644 --- a/packages/core/tests/js/exports/named-export-with-existing/output.ts +++ b/packages/core/tests/js/exports/named-export-with-existing/output.ts @@ -1,4 +1,4 @@ export const named = { - test: 'string', - test2: "string2" -}; \ No newline at end of file + test: 'string', + test2: 'string2' +}; diff --git a/packages/core/tests/js/exports/named-export/output.ts b/packages/core/tests/js/exports/named-export/output.ts index c8a12a18..fec3056c 100644 --- a/packages/core/tests/js/exports/named-export/output.ts +++ b/packages/core/tests/js/exports/named-export/output.ts @@ -1,7 +1,7 @@ export const variable = { - test: 'string' + test: 'string' }; export const variable2 = { - test2: 'string2' -}; \ No newline at end of file + test2: 'string2' +}; diff --git a/packages/core/tests/js/functions/arrow-function/output.ts b/packages/core/tests/js/functions/arrow-function/output.ts index c74b611e..1dc5293f 100644 --- a/packages/core/tests/js/functions/arrow-function/output.ts +++ b/packages/core/tests/js/functions/arrow-function/output.ts @@ -1,6 +1,6 @@ () => console.log('foo'); () => { - console.log('foo'); - console.log('bar'); -}; \ No newline at end of file + console.log('foo'); + console.log('bar'); +}; diff --git a/packages/core/tests/js/functions/function-call/output.ts b/packages/core/tests/js/functions/function-call/output.ts index 6a886f44..69b852d5 100644 --- a/packages/core/tests/js/functions/function-call/output.ts +++ b/packages/core/tests/js/functions/function-call/output.ts @@ -1,4 +1,4 @@ function foo(bar: string) { console.log(bar); } -foo("bar"); \ No newline at end of file +foo('bar'); diff --git a/packages/core/tests/js/imports/default-import/output.ts b/packages/core/tests/js/imports/default-import/output.ts index 9203d582..0f58f59e 100644 --- a/packages/core/tests/js/imports/default-import/output.ts +++ b/packages/core/tests/js/imports/default-import/output.ts @@ -1 +1 @@ -import MyPackage from 'package'; \ No newline at end of file +import MyPackage from 'package'; diff --git a/packages/core/tests/js/imports/empty-import/output.ts b/packages/core/tests/js/imports/empty-import/output.ts index 47f21090..bf92fd96 100644 --- a/packages/core/tests/js/imports/empty-import/output.ts +++ b/packages/core/tests/js/imports/empty-import/output.ts @@ -1,2 +1,2 @@ import 'package/file.css'; -import './relativ/file.css'; \ No newline at end of file +import './relativ/file.css'; diff --git a/packages/core/tests/js/imports/named-import-merging/input.ts b/packages/core/tests/js/imports/named-import-merging/input.ts index 67f0c3d9..f4d71375 100644 --- a/packages/core/tests/js/imports/named-import-merging/input.ts +++ b/packages/core/tests/js/imports/named-import-merging/input.ts @@ -1 +1 @@ -import { namedOne } from "package"; +import { namedOne } from 'package'; diff --git a/packages/core/tests/js/imports/named-import-merging/output.ts b/packages/core/tests/js/imports/named-import-merging/output.ts index 772a0f86..7e5affa6 100644 --- a/packages/core/tests/js/imports/named-import-merging/output.ts +++ b/packages/core/tests/js/imports/named-import-merging/output.ts @@ -1 +1 @@ -import { namedOne, namedTwo } from "package"; \ No newline at end of file +import { namedOne, namedTwo } from 'package'; diff --git a/packages/core/tests/js/imports/named-import/output.ts b/packages/core/tests/js/imports/named-import/output.ts index 1a3abd90..640312d9 100644 --- a/packages/core/tests/js/imports/named-import/output.ts +++ b/packages/core/tests/js/imports/named-import/output.ts @@ -1,2 +1,2 @@ import { Handle } from '@sveltejs/kit'; -import { namedOne } from 'package'; \ No newline at end of file +import { namedOne } from 'package'; diff --git a/packages/core/tests/js/imports/namespaced-import/output.ts b/packages/core/tests/js/imports/namespaced-import/output.ts index 56eda1b3..89dc72a7 100644 --- a/packages/core/tests/js/imports/namespaced-import/output.ts +++ b/packages/core/tests/js/imports/namespaced-import/output.ts @@ -1,2 +1,2 @@ import * as bar from './some-file'; -import * as foo from 'package'; \ No newline at end of file +import * as foo from 'package'; diff --git a/packages/core/tests/js/index.ts b/packages/core/tests/js/index.ts index fc93e163..8cf489a4 100644 --- a/packages/core/tests/js/index.ts +++ b/packages/core/tests/js/index.ts @@ -1,12 +1,17 @@ -import { describe, expect, test } from 'vitest'; -import { parseScript, serializeScript } from '@sveltejs/ast-tooling'; import fs from 'node:fs'; import { join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; +import prettier from 'prettier'; +import { describe, expect, test } from 'vitest'; +import { parseScript, serializeScript } from '@sveltejs/ast-tooling'; const baseDir = resolve(fileURLToPath(import.meta.url), '..'); const categoryDirectories = getDirectoryNames(baseDir); +const prettierConfig = await prettier.resolveConfig(import.meta.url); +if (!prettierConfig) throw new Error('Failed to resolve prettier config'); +prettierConfig.filepath = 'output.ts'; + for (const categoryDirectory of categoryDirectories) { describe(categoryDirectory, () => { const testNames = getDirectoryNames(join(baseDir, categoryDirectory)); @@ -23,7 +28,8 @@ for (const categoryDirectory of categoryDirectories) { module.run({ ast }); const output = serializeScript(ast, input); - await expect(output).toMatchFileSnapshot(`${testDirectoryPath}/output.ts`); + const formattedOutput = await prettier.format(output, prettierConfig); + await expect(formattedOutput).toMatchFileSnapshot(`${testDirectoryPath}/output.ts`); }); } }); diff --git a/packages/core/tests/js/object/create/output.ts b/packages/core/tests/js/object/create/output.ts index a31bc6cf..b8a403ca 100644 --- a/packages/core/tests/js/object/create/output.ts +++ b/packages/core/tests/js/object/create/output.ts @@ -1,6 +1,6 @@ const empty = {}; const created = { - foo: 1, - bar: 'string' -}; \ No newline at end of file + foo: 1, + bar: 'string' +}; diff --git a/packages/core/tests/js/object/override-property/input.ts b/packages/core/tests/js/object/override-property/input.ts index 42413f9b..72b9d208 100644 --- a/packages/core/tests/js/object/override-property/input.ts +++ b/packages/core/tests/js/object/override-property/input.ts @@ -1,5 +1,5 @@ const test = { - foo: 1, - bar: 'string', - lorem: true -} + foo: 1, + bar: 'string', + lorem: true +}; diff --git a/packages/core/tests/js/object/override-property/output.ts b/packages/core/tests/js/object/override-property/output.ts index d759f951..0069e775 100644 --- a/packages/core/tests/js/object/override-property/output.ts +++ b/packages/core/tests/js/object/override-property/output.ts @@ -1,5 +1,5 @@ const test = { - foo: 2, - bar: "string2", - lorem: false -} \ No newline at end of file + foo: 2, + bar: 'string2', + lorem: false +}; diff --git a/packages/core/tests/js/object/property/input.ts b/packages/core/tests/js/object/property/input.ts index 2e7612f4..8d0b560b 100644 --- a/packages/core/tests/js/object/property/input.ts +++ b/packages/core/tests/js/object/property/input.ts @@ -1,3 +1,3 @@ const test = { - foo: 1 -} + foo: 1 +}; diff --git a/packages/core/tests/js/object/property/output.ts b/packages/core/tests/js/object/property/output.ts index 022a2a8b..3967f063 100644 --- a/packages/core/tests/js/object/property/output.ts +++ b/packages/core/tests/js/object/property/output.ts @@ -1,4 +1,4 @@ const test = { - foo: 1, - bar: "string" -} \ No newline at end of file + foo: 1, + bar: 'string' +}; diff --git a/packages/core/tests/js/object/remove-property/input.ts b/packages/core/tests/js/object/remove-property/input.ts index 2ff5dd43..3967f063 100644 --- a/packages/core/tests/js/object/remove-property/input.ts +++ b/packages/core/tests/js/object/remove-property/input.ts @@ -1,4 +1,4 @@ const test = { - foo: 1, - bar: 'string' -} + foo: 1, + bar: 'string' +}; diff --git a/packages/core/tests/js/object/remove-property/output.ts b/packages/core/tests/js/object/remove-property/output.ts index e51fe4a1..f3129ed1 100644 --- a/packages/core/tests/js/object/remove-property/output.ts +++ b/packages/core/tests/js/object/remove-property/output.ts @@ -1 +1 @@ -const test = {} +const test = {}; diff --git a/packages/core/tests/js/variables/declaration/output.ts b/packages/core/tests/js/variables/declaration/output.ts index 2863841c..e96c602e 100644 --- a/packages/core/tests/js/variables/declaration/output.ts +++ b/packages/core/tests/js/variables/declaration/output.ts @@ -1,5 +1,5 @@ const testNumber = 2; const testObject = { - foo: 'bar' -}; \ No newline at end of file + foo: 'bar' +}; diff --git a/packages/core/tests/js/variables/type-annotate-declarator/input.ts b/packages/core/tests/js/variables/type-annotate-declarator/input.ts index c064160a..9726ffde 100644 --- a/packages/core/tests/js/variables/type-annotate-declarator/input.ts +++ b/packages/core/tests/js/variables/type-annotate-declarator/input.ts @@ -1 +1 @@ -const str = "123"; +const str = '123'; diff --git a/packages/core/tests/js/variables/type-annotate-declarator/output.ts b/packages/core/tests/js/variables/type-annotate-declarator/output.ts index 82e25885..99232ae3 100644 --- a/packages/core/tests/js/variables/type-annotate-declarator/output.ts +++ b/packages/core/tests/js/variables/type-annotate-declarator/output.ts @@ -1 +1 @@ -const str: string = "123"; +const str: string = '123'; diff --git a/prettier.config.js b/prettier.config.js index 1a3d9c70..e44ee21e 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -44,11 +44,13 @@ const packageSortOrder = [ 'keywords' ]; +/** @type {import("prettier").Config} */ export default { useTabs: true, singleQuote: true, trailingComma: 'none', printWidth: 100, + endOfLine: 'lf', plugins: ['prettier-plugin-packagejson', 'prettier-plugin-svelte'], overrides: [ { @@ -65,10 +67,7 @@ export default { } }, { - files: [ - '**/CHANGELOG.md', - 'packages/migrate/migrations/routes/*/samples.md' - ], + files: ['**/CHANGELOG.md', 'packages/migrate/migrations/routes/*/samples.md'], options: { requirePragma: true } @@ -80,4 +79,4 @@ export default { } } ] -} +}; From fe810a5a265bd8a018567f88aef303faff56d593 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sun, 10 Nov 2024 13:20:25 -0500 Subject: [PATCH 59/70] fix dir path --- packages/cli/commands/add/fetch-packages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/commands/add/fetch-packages.ts b/packages/cli/commands/add/fetch-packages.ts index 588e84a8..d14be995 100644 --- a/packages/cli/commands/add/fetch-packages.ts +++ b/packages/cli/commands/add/fetch-packages.ts @@ -7,7 +7,7 @@ import { fileURLToPath } from 'node:url'; import type { AdderWithoutExplicitArgs } from '@sveltejs/cli-core'; // path to the `node_modules` directory of `sv` -const NODE_MODULES = fileURLToPath(new URL('../../../node_modules', import.meta.url)); +const NODE_MODULES = fileURLToPath(new URL('../node_modules', import.meta.url)); const REGISTRY = 'https://registry.npmjs.org'; export const Directive = { file: 'file:', npm: 'npm:' }; From 25cadb6520a3fdd17ffcfec2aee0c6d116fe163f Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:24:16 -0500 Subject: [PATCH 60/70] setup matrix --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 328d0750..78e64e81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,10 @@ jobs: - run: pnpm build - run: pnpm check test: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 From 88f94737d4119c341c28f8cd24030e40afb1ed04 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Sun, 10 Nov 2024 19:11:40 -0500 Subject: [PATCH 61/70] skip running docker containers outside of linux runners --- packages/adders/_tests/drizzle/test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/adders/_tests/drizzle/test.ts b/packages/adders/_tests/drizzle/test.ts index b8efb11b..2a6d7230 100644 --- a/packages/adders/_tests/drizzle/test.ts +++ b/packages/adders/_tests/drizzle/test.ts @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; +import process from 'node:process'; import { fileURLToPath } from 'node:url'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; @@ -10,7 +11,11 @@ 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'; + vitest.beforeAll(() => { + if (noDocker) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); @@ -33,6 +38,7 @@ const testCases = [ 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 }); const ts = variant === 'kit-ts'; From 9d5b6b20bfdbfc31c23b4652bde24adb62b47a11 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 16:59:15 +0100 Subject: [PATCH 62/70] print console output? --- packages/cli/lib/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 555da7e8..838e911e 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -68,7 +68,7 @@ async function runAddon( const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; if (workspace.packageManager === 'npm') args.unshift('--yes'); await exec(command, args, { - nodeOptions: { cwd: workspace.cwd, stdio: 'pipe' }, + nodeOptions: { cwd: workspace.cwd, stdio: 'inherit' }, throwOnError: true }); } catch (error) { From ef2df6ec003f342814ac240053748b292a20968a Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 17:45:22 +0100 Subject: [PATCH 63/70] force `npm` for storybook? --- packages/cli/lib/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 838e911e..7d970fce 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -65,7 +65,7 @@ async function runAddon( if (script.condition?.(workspace) === false) continue; try { - const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; + const { args, command } = resolveCommand('npm', 'execute', script.args)!; if (workspace.packageManager === 'npm') args.unshift('--yes'); await exec(command, args, { nodeOptions: { cwd: workspace.cwd, stdio: 'inherit' }, From c3aa2fcebbe61e8b696a6126ab913ae4eeb74a4b Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 17:53:43 +0100 Subject: [PATCH 64/70] Revert "force `npm` for storybook?" This reverts commit ef2df6ec003f342814ac240053748b292a20968a. --- packages/cli/lib/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 7d970fce..838e911e 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -65,7 +65,7 @@ async function runAddon( if (script.condition?.(workspace) === false) continue; try { - const { args, command } = resolveCommand('npm', 'execute', script.args)!; + const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; if (workspace.packageManager === 'npm') args.unshift('--yes'); await exec(command, args, { nodeOptions: { cwd: workspace.cwd, stdio: 'inherit' }, From 1c095d614d0484710408a8605b54b1d0be145cc1 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 18:03:13 +0100 Subject: [PATCH 65/70] try latest --- packages/adders/storybook/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 20fdc5e8..9a76cbef 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -9,7 +9,7 @@ export default defineAdder({ scripts: [ { description: 'applies storybook', - args: ['storybook@8.3.6', 'init', '--skip-install', '--no-dev'], + args: ['storybook@latest', 'init', '--skip-install', '--no-dev'], stdio: 'inherit' } ], From 57ab58efd12e386a23e796140c6ca1e7a15d13d4 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 18:08:59 +0100 Subject: [PATCH 66/70] Revert "try latest" This reverts commit 1c095d614d0484710408a8605b54b1d0be145cc1. --- packages/adders/storybook/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adders/storybook/index.ts b/packages/adders/storybook/index.ts index 9a76cbef..20fdc5e8 100644 --- a/packages/adders/storybook/index.ts +++ b/packages/adders/storybook/index.ts @@ -9,7 +9,7 @@ export default defineAdder({ scripts: [ { description: 'applies storybook', - args: ['storybook@latest', 'init', '--skip-install', '--no-dev'], + args: ['storybook@8.3.6', 'init', '--skip-install', '--no-dev'], stdio: 'inherit' } ], From 88bf2ec9a0b81d502c1b19443b5eceb8f9c0c188 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 18:09:06 +0100 Subject: [PATCH 67/70] Revert "print console output?" This reverts commit 9d5b6b20bfdbfc31c23b4652bde24adb62b47a11. --- packages/cli/lib/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 838e911e..555da7e8 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -68,7 +68,7 @@ async function runAddon( const { args, command } = resolveCommand(workspace.packageManager, 'execute', script.args)!; if (workspace.packageManager === 'npm') args.unshift('--yes'); await exec(command, args, { - nodeOptions: { cwd: workspace.cwd, stdio: 'inherit' }, + nodeOptions: { cwd: workspace.cwd, stdio: 'pipe' }, throwOnError: true }); } catch (error) { From fc72e9a0800b020bf0361520f9649b878bed63b0 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Mon, 11 Nov 2024 18:31:29 +0100 Subject: [PATCH 68/70] skip runnung storybook tests in ci on windows --- packages/adders/_tests/storybook/test.ts | 32 ++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/adders/_tests/storybook/test.ts b/packages/adders/_tests/storybook/test.ts index 6093fc53..4fdc82a4 100644 --- a/packages/adders/_tests/storybook/test.ts +++ b/packages/adders/_tests/storybook/test.ts @@ -1,3 +1,4 @@ +import process from 'node:process'; import { expect } from '@playwright/test'; import { setupTest } from '../_setup/suite.ts'; import storybook from '../../storybook/index.ts'; @@ -5,18 +6,23 @@ import storybook from '../../storybook/index.ts'; const { test, variants, prepareServer } = setupTest({ storybook }); let port = 6006; -test.concurrent.for(variants)('storybook loaded - %s', async (variant, { page, ...ctx }) => { - const cwd = await ctx.run(variant, { storybook: {} }); - const { close } = await prepareServer({ - cwd, - page, - previewCommand: `pnpm storybook -p ${++port} --ci`, - buildCommand: '' - }); - // kill server process when we're done - ctx.onTestFinished(async () => await close()); +const skip = process.env.CI && process.platform === 'win32'; +test.skipIf(skip).concurrent.for(variants)( + 'storybook loaded - %s', + async (variant, { page, ...ctx }) => { + const cwd = await ctx.run(variant, { storybook: {} }); - expect(await page.$('main .sb-bar')).toBeTruthy(); - expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); -}); + const { close } = await prepareServer({ + cwd, + page, + previewCommand: `pnpm storybook -p ${++port} --ci`, + buildCommand: '' + }); + // kill server process when we're done + ctx.onTestFinished(async () => await close()); + + expect(await page.$('main .sb-bar')).toBeTruthy(); + expect(await page.$('#storybook-preview-wrapper')).toBeTruthy(); + } +); From 77fd78ebfc9cdc1446ecf12e126f2c7522c44944 Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 11 Nov 2024 15:51:14 -0500 Subject: [PATCH 69/70] last bits --- .gitignore | 1 - eslint.config.js | 1 - package.json | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 193b6ac1..aeb3dc67 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,4 @@ package-lock.json yarn.lock vite.config.js.timestamp-* /packages/create-svelte/template/CHANGELOG.md -.test-tmp .test-output diff --git a/eslint.config.js b/eslint.config.js index d0cb3344..62799efb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -28,7 +28,6 @@ export default [ 'packages/create/scripts/**/*', 'packages/create/templates/**/*', '**/temp/*', - '.test-tmp/*', '**/.test-output/*', '**/dist/*', 'packages/**/tests/**/{output,input}.ts', diff --git a/package.json b/package.json index a7a9881a..abe8d183 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "dev": "rollup --config --watch", "format": "pnpm --parallel format", "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", - "test": "pnpm vitest run --silent", - "test:ui": "pnpm vitest --ui" + "test": "vitest run --silent", + "test:ui": "vitest --ui" }, "devDependencies": { "@changesets/cli": "^2.27.9", From b6d91be066bdca2244b2fe4b0de265e441420a8b Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Mon, 11 Nov 2024 15:58:40 -0500 Subject: [PATCH 70/70] format --- packages/cli/commands/create.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts index b033c09f..dd93c4f1 100644 --- a/packages/cli/commands/create.ts +++ b/packages/cli/commands/create.ts @@ -64,8 +64,7 @@ export const create = new Command('create') let i = 1; const initialSteps: string[] = []; const relative = path.relative(process.cwd(), directory); - const pm = - packageManager ?? detectSync({ cwd: directory })?.name ?? getUserAgent() ?? 'npm'; + const pm = packageManager ?? detectSync({ cwd: directory })?.name ?? getUserAgent() ?? 'npm'; if (relative !== '') { const pathHasSpaces = relative.includes(' '); initialSteps.push(