diff --git a/.changeset/icy-mice-jump.md b/.changeset/icy-mice-jump.md new file mode 100644 index 000000000..23fa9c71b --- /dev/null +++ b/.changeset/icy-mice-jump.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +api: rename `files` to `file`, `kit` to `isKit` & `directory` diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index f38dc58f3..87a263333 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -35,16 +35,14 @@ export default defineAddon({ shortDescription: 'auth library', homepage: 'https://www.better-auth.com', options, - setup: ({ kit, dependencyVersion, unsupported, dependsOn, runsAfter }) => { - if (!kit) unsupported('Requires SvelteKit'); + setup: ({ isKit, dependencyVersion, unsupported, dependsOn, runsAfter }) => { + if (!isKit) unsupported('Requires SvelteKit'); if (!dependencyVersion('drizzle-orm')) dependsOn('drizzle'); runsAfter('sveltekitAdapter'); runsAfter('tailwindcss'); }, - run: ({ sv, language, options, kit, dependencyVersion, files }) => { - if (!kit) throw new Error('SvelteKit is required'); - + run: ({ sv, language, options, directory, dependencyVersion, file }) => { const demoPassword = options.demo.includes('password'); const demoGithub = options.demo.includes('github'); const hasDemo = demoPassword || demoGithub; @@ -89,7 +87,7 @@ export default defineAddon({ sv.file('.env', (content) => generateEnvFileContent(content, demoGithub, false)); sv.file('.env.example', (content) => generateEnvFileContent(content, demoGithub, true)); - sv.file(`${kit?.libDirectory}/server/auth.${language}`, (content) => { + sv.file(`${directory.lib}/server/auth.${language}`, (content) => { const { ast, generateCode, comments } = parse.script(content); js.imports.addNamed(ast, { from: '$lib/server/db', imports: [d1 ? 'getDb' : 'db'] }); @@ -165,10 +163,10 @@ export default defineAddon({ return generateCode(); }); - const authConfigPath = `${kit?.libDirectory}/server/auth.${language}`; - const authSchemaPath = `${kit?.libDirectory}/server/db/auth.schema.${language}`; + const authConfigPath = `${directory.lib}/server/auth.${language}`; + const authSchemaPath = `${directory.lib}/server/db/auth.schema.${language}`; - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert( data, @@ -178,14 +176,14 @@ export default defineAddon({ return generateCode(); }); - sv.file(`${kit?.libDirectory}/server/db/auth.schema.${language}`, (content) => { + sv.file(`${directory.lib}/server/db/auth.schema.${language}`, (content) => { if (content) return content; return dedent` // If you see this file, you have not run the auth:schema script yet, but you should! `; }); - sv.file(`${kit?.libDirectory}/server/db/schema.${language}`, (content) => { + sv.file(`${directory.lib}/server/db/schema.${language}`, (content) => { const { ast, generateCode } = parse.script(content); js.exports.addNamespace(ast, { from: './auth.schema' }); @@ -276,15 +274,15 @@ export default defineAddon({ }); if (hasDemo) { - sv.file(`${kit?.routesDirectory}/demo/+page.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/demo/+page.svelte`, (content) => { return addToDemoPage(content, 'better-auth', language); }); sv.file( - `${kit!.routesDirectory}/demo/better-auth/login/+page.server.${language}`, + `${directory.kitRoutes}/demo/better-auth/login/+page.server.${language}`, (content) => { if (content) { - const filePath = `${kit!.routesDirectory}/demo/better-auth/login/+page.server.${language}`; + const filePath = `${directory.kitRoutes}/demo/better-auth/login/+page.server.${language}`; log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); return content; } @@ -386,9 +384,9 @@ export default defineAddon({ } ); - sv.file(`${kit!.routesDirectory}/demo/better-auth/login/+page.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/demo/better-auth/login/+page.svelte`, (content) => { if (content) { - const filePath = `${kit!.routesDirectory}/demo/better-auth/login/+page.svelte`; + const filePath = `${directory.kitRoutes}/demo/better-auth/login/+page.svelte`; log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); return content; } @@ -450,9 +448,9 @@ export default defineAddon({ `; }); - sv.file(`${kit!.routesDirectory}/demo/better-auth/+page.server.${language}`, (content) => { + sv.file(`${directory.kitRoutes}/demo/better-auth/+page.server.${language}`, (content) => { if (content) { - const filePath = `${kit!.routesDirectory}/demo/better-auth/+page.server.${language}`; + const filePath = `${directory.kitRoutes}/demo/better-auth/+page.server.${language}`; log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); return content; } @@ -483,9 +481,9 @@ export default defineAddon({ `; }); - sv.file(`${kit!.routesDirectory}/demo/better-auth/+page.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/demo/better-auth/+page.svelte`, (content) => { if (content) { - const filePath = `${kit!.routesDirectory}/demo/better-auth/+page.svelte`; + const filePath = `${directory.kitRoutes}/demo/better-auth/+page.svelte`; log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); return content; } diff --git a/packages/sv/src/addons/devtools-json.ts b/packages/sv/src/addons/devtools-json.ts index e4d8dc46a..156edd16a 100644 --- a/packages/sv/src/addons/devtools-json.ts +++ b/packages/sv/src/addons/devtools-json.ts @@ -7,11 +7,11 @@ export default defineAddon({ homepage: 'https://github.com/ChromeDevTools/vite-plugin-devtools-json', options: {}, - run: ({ sv, files }) => { + run: ({ sv, file }) => { sv.devDependency('vite-plugin-devtools-json', '^1.0.0'); // add the vite plugin - sv.file(files.viteConfig, (content) => { + sv.file(file.viteConfig, (content) => { const { ast, generateCode } = parse.script(content); const vitePluginName = 'devtoolsJson'; diff --git a/packages/sv/src/addons/drizzle.ts b/packages/sv/src/addons/drizzle.ts index 7447acd63..5aab71380 100644 --- a/packages/sv/src/addons/drizzle.ts +++ b/packages/sv/src/addons/drizzle.ts @@ -84,21 +84,19 @@ export default defineAddon({ shortDescription: 'database orm', homepage: 'https://orm.drizzle.team', options, - setup: ({ kit, unsupported, runsAfter }) => { + setup: ({ isKit, unsupported, runsAfter }) => { runsAfter('prettier'); runsAfter('sveltekitAdapter'); - if (!kit) return unsupported('Requires SvelteKit'); + if (!isKit) return unsupported('Requires SvelteKit'); }, - run: ({ sv, language, options, kit, dependencyVersion, cwd, cancel, files }) => { - if (!kit) throw new Error('SvelteKit is required'); - + run: ({ sv, language, options, directory, dependencyVersion, cwd, cancel, file }) => { if (options.database === 'd1' && !dependencyVersion('@sveltejs/adapter-cloudflare')) { return cancel('Cloudflare D1 requires @sveltejs/adapter-cloudflare — add the adapter first'); } const typescript = language === 'ts'; - const baseDBPath = path.resolve(cwd, kit.libDirectory, 'server', 'db'); + const baseDBPath = path.resolve(cwd, directory.lib, 'server', 'db'); const paths = { 'drizzle config': path.resolve(cwd, `drizzle.config.${language}`), 'database schema': path.resolve(baseDBPath, `schema.${language}`), @@ -194,7 +192,7 @@ export default defineAddon({ }); } - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); if (options.docker) json.packageScriptsUpsert(data, 'db:start', 'docker compose up'); @@ -208,13 +206,13 @@ export default defineAddon({ const hasPrettier = Boolean(dependencyVersion('prettier')); if (hasPrettier) { - sv.file(files.prettierignore, (content) => { + sv.file(file.prettierignore, (content) => { return text.upsert(content, '/drizzle/'); }); } if (options.database === 'sqlite') { - sv.file(files.gitignore, (content) => { + sv.file(file.gitignore, (content) => { if (content.length === 0) return content; return text.upsert(content, '*.db', { comment: 'SQLite' }); }); @@ -270,7 +268,7 @@ export default defineAddon({ js.exports.createDefault(ast, { fallback: js.common.parseExpression(` defineConfig({ - schema: "./src/lib/server/db/schema.${language}", + schema: "./${directory.lib}/server/db/schema.${language}", dialect: "${getDialect()}", ${d1 ? "driver: 'd1-http'," : ''} dbCredentials: { diff --git a/packages/sv/src/addons/eslint.ts b/packages/sv/src/addons/eslint.ts index f57eec50f..feea56524 100644 --- a/packages/sv/src/addons/eslint.ts +++ b/packages/sv/src/addons/eslint.ts @@ -8,7 +8,7 @@ export default defineAddon({ shortDescription: 'linter', homepage: 'https://eslint.org', options: {}, - run: ({ sv, language, dependencyVersion, files }) => { + run: ({ sv, language, dependencyVersion, file }) => { const typescript = language === 'ts'; const prettierInstalled = Boolean(dependencyVersion('prettier')); @@ -23,7 +23,7 @@ export default defineAddon({ if (prettierInstalled) sv.devDependency('eslint-config-prettier', '^10.1.8'); - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert(data, 'lint', 'eslint .'); @@ -31,7 +31,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.eslintConfig, (content) => { + sv.file(file.eslintConfig, (content) => { const { ast, comments, generateCode } = parse.script(content); const eslintConfigs: Array = []; @@ -140,14 +140,14 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.vscodeExtensions, (content) => { + sv.file(file.vscodeExtensions, (content) => { const { data, generateCode } = parse.json(content); json.arrayUpsert(data, 'recommendations', 'dbaeumer.vscode-eslint'); return generateCode(); }); if (prettierInstalled) { - sv.file(files.eslintConfig, addEslintConfigPrettier); + sv.file(file.eslintConfig, addEslintConfigPrettier); } } }); diff --git a/packages/sv/src/addons/mdsvex.ts b/packages/sv/src/addons/mdsvex.ts index d329b9c30..79168c56f 100644 --- a/packages/sv/src/addons/mdsvex.ts +++ b/packages/sv/src/addons/mdsvex.ts @@ -6,10 +6,10 @@ export default defineAddon({ shortDescription: 'svelte + markdown', homepage: 'https://mdsvex.pngwn.io', options: {}, - run: ({ sv, files }) => { + run: ({ sv, file }) => { sv.devDependency('mdsvex', '^0.12.6'); - sv.file(files.svelteConfig, (content) => { + sv.file(file.svelteConfig, (content) => { const { ast, generateCode } = parse.script(content); js.imports.addNamed(ast, { from: 'mdsvex', imports: ['mdsvex'] }); diff --git a/packages/sv/src/addons/paraglide.ts b/packages/sv/src/addons/paraglide.ts index 6bcde3224..a72d4fcd8 100644 --- a/packages/sv/src/addons/paraglide.ts +++ b/packages/sv/src/addons/paraglide.ts @@ -50,18 +50,16 @@ export default defineAddon({ shortDescription: 'i18n', homepage: 'https://inlang.com/m/gerre34r/library-inlang-paraglideJs', options, - setup: ({ kit, unsupported }) => { - if (!kit) unsupported('Requires SvelteKit'); + setup: ({ isKit, unsupported }) => { + if (!isKit) unsupported('Requires SvelteKit'); }, - run: ({ sv, options, files, language, kit }) => { - if (!kit) throw new Error('SvelteKit is required'); - - const paraglideOutDir = 'src/lib/paraglide'; + run: ({ sv, options, file, language, directory }) => { + const paraglideOutDir = `${directory.lib}/paraglide`; sv.devDependency('@inlang/paraglide-js', '^2.10.0'); // add the vite plugin - sv.file(files.viteConfig, (content) => { + sv.file(file.viteConfig, (content) => { const { ast, generateCode } = parse.script(content); const vitePluginName = 'paraglideVitePlugin'; @@ -152,7 +150,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.gitignore, (content) => { + sv.file(file.gitignore, (content) => { if (!content) return content; content = text.upsert(content, paraglideOutDir, { comment: 'Paraglide' }); @@ -178,7 +176,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(`${kit.routesDirectory}/+layout.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/+layout.svelte`, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); js.imports.addNamed(ast.instance.content, { @@ -198,12 +196,12 @@ export default defineAddon({ }); if (options.demo) { - sv.file(`${kit.routesDirectory}/demo/+page.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/demo/+page.svelte`, (content) => { return addToDemoPage(content, 'paraglide', language); }); // add usage example - sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => { + sv.file(`${directory.kitRoutes}/demo/paraglide/+page.svelte`, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); diff --git a/packages/sv/src/addons/playwright.ts b/packages/sv/src/addons/playwright.ts index 75216fe83..9cda97cfc 100644 --- a/packages/sv/src/addons/playwright.ts +++ b/packages/sv/src/addons/playwright.ts @@ -8,10 +8,10 @@ export default defineAddon({ shortDescription: 'browser testing', homepage: 'https://playwright.dev', options: {}, - run: ({ sv, language, files, kit }) => { + run: ({ sv, language, file, isKit, directory }) => { sv.devDependency('@playwright/test', '^1.58.2'); - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert(data, 'test:e2e', 'playwright test'); @@ -20,16 +20,16 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.gitignore, (content) => { + sv.file(file.gitignore, (content) => { if (!content) return content; return text.upsert(content, 'test-results', { comment: 'Playwright' }); }); - const testDir = kit ? `${kit.routesDirectory}/demo/playwright` : 'src'; - const testRoute = kit ? '/demo/playwright' : '/'; + const testDir = isKit ? `${directory.kitRoutes}/demo/playwright` : directory.src; + const testRoute = isKit ? '/demo/playwright' : '/'; - if (kit) { - sv.file(`${kit.routesDirectory}/demo/+page.svelte`, (content) => { + if (isKit) { + sv.file(`${directory.kitRoutes}/demo/+page.svelte`, (content) => { return addToDemoPage(content, 'playwright', language); }); @@ -42,7 +42,7 @@ export default defineAddon({ }); } - sv.file(`${testDir}/${kit ? 'page' : 'app'}.svelte.e2e.${language}`, (content) => { + sv.file(`${testDir}/${isKit ? 'page' : 'app'}.svelte.e2e.${language}`, (content) => { if (content) return content; return dedent` @@ -83,12 +83,12 @@ export default defineAddon({ }); }, - nextSteps: ({ kit }) => { + nextSteps: ({ isKit }) => { const steps: string[] = []; steps.push(`Run ${color.command('npx playwright install')} to download browsers`); - if (kit) { + if (isKit) { steps.push(`Visit ${color.route('/demo/playwright')} to see the demo page`); } diff --git a/packages/sv/src/addons/prettier.ts b/packages/sv/src/addons/prettier.ts index c1c7d307a..6d1af4a2a 100644 --- a/packages/sv/src/addons/prettier.ts +++ b/packages/sv/src/addons/prettier.ts @@ -8,14 +8,14 @@ export default defineAddon({ shortDescription: 'formatter', homepage: 'https://prettier.io', options: {}, - run: ({ sv, dependencyVersion, files }) => { + run: ({ sv, dependencyVersion, file }) => { const tailwindcssInstalled = Boolean(dependencyVersion('tailwindcss')); if (tailwindcssInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.7.2'); sv.devDependency('prettier', '^3.8.1'); sv.devDependency('prettier-plugin-svelte', '^3.4.1'); - sv.file(files.prettierignore, (content) => { + sv.file(file.prettierignore, (content) => { if (content) return content; return dedent` # Package Managers @@ -30,7 +30,7 @@ export default defineAddon({ `; }); - sv.file(files.prettierrc, (content) => { + sv.file(file.prettierrc, (content) => { let data, generateCode; try { ({ data, generateCode } = parse.json(content)); @@ -52,7 +52,7 @@ export default defineAddon({ if (tailwindcssInstalled) { json.arrayUpsert(data, 'plugins', 'prettier-plugin-tailwindcss'); - data.tailwindStylesheet ??= files.getRelative({ to: files.stylesheet }); + data.tailwindStylesheet ??= file.getRelative({ to: file.stylesheet }); } data.overrides ??= []; @@ -68,7 +68,7 @@ export default defineAddon({ const eslintVersion = dependencyVersion('eslint'); const eslintInstalled = hasEslint(eslintVersion); - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert(data, 'lint', 'prettier --check .', { mode: 'prepend' }); @@ -77,7 +77,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.vscodeExtensions, (content) => { + sv.file(file.vscodeExtensions, (content) => { const { data, generateCode } = parse.json(content); json.arrayUpsert(data, 'recommendations', 'esbenp.prettier-vscode'); return generateCode(); @@ -93,7 +93,7 @@ export default defineAddon({ if (eslintInstalled) { sv.devDependency('eslint-config-prettier', '^10.1.8'); - sv.file(files.eslintConfig, addEslintConfigPrettier); + sv.file(file.eslintConfig, addEslintConfigPrettier); } } }); diff --git a/packages/sv/src/addons/sveltekit-adapter.ts b/packages/sv/src/addons/sveltekit-adapter.ts index 18287bf80..192cdf892 100644 --- a/packages/sv/src/addons/sveltekit-adapter.ts +++ b/packages/sv/src/addons/sveltekit-adapter.ts @@ -46,14 +46,14 @@ export default defineAddon({ shortDescription: 'deployment', homepage: 'https://svelte.dev/docs/kit/adapters', options, - setup: ({ kit, unsupported }) => { - if (!kit) unsupported('Requires SvelteKit'); + setup: ({ isKit, unsupported }) => { + if (!isKit) unsupported('Requires SvelteKit'); }, - run: ({ sv, options, files, cwd, language }) => { + run: ({ sv, options, file, cwd, language }) => { const adapter = adapters.find((a) => a.id === options.adapter)!; // removes previously installed adapters - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); const devDeps = data['devDependencies']; @@ -77,7 +77,7 @@ export default defineAddon({ sv.devDependency(adapter.package, adapter.version); - sv.file(files.svelteConfig, (content) => { + sv.file(file.svelteConfig, (content) => { const { ast, comments, generateCode } = parse.script(content); // finds any existing adapter's import declaration @@ -144,7 +144,7 @@ export default defineAddon({ } if (!data.name) { - const pkg = parse.json(readFileSync(join(cwd, files.package), 'utf-8')); + const pkg = parse.json(readFileSync(join(cwd, file.package), 'utf-8')); data.name = sanitizeName(pkg.data.name, 'wrangler'); } @@ -180,7 +180,7 @@ export default defineAddon({ const typeChecked = language === 'ts' || jsconfig; if (typeChecked) { - sv.file(files.gitignore, (content) => { + sv.file(file.gitignore, (content) => { if (content.length === 0) return content; return text.upsert(content, '/worker-configuration.d.ts', { comment: 'Cloudflare Types' @@ -188,7 +188,7 @@ export default defineAddon({ }); // Setup wrangler types command - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert(data, 'gen', 'wrangler types'); diff --git a/packages/sv/src/addons/tailwindcss.ts b/packages/sv/src/addons/tailwindcss.ts index 00941ab25..c14820d76 100644 --- a/packages/sv/src/addons/tailwindcss.ts +++ b/packages/sv/src/addons/tailwindcss.ts @@ -30,7 +30,7 @@ export default defineAddon({ shortDescription: 'css framework', homepage: 'https://tailwindcss.com', options, - run: ({ sv, options, files, kit, dependencyVersion, language }) => { + run: ({ sv, options, file, isKit, directory, dependencyVersion, language }) => { const prettierInstalled = Boolean(dependencyVersion('prettier')); sv.devDependency('tailwindcss', '^4.1.18'); @@ -46,7 +46,7 @@ export default defineAddon({ } // add the vite plugin - sv.file(files.viteConfig, (content) => { + sv.file(file.viteConfig, (content) => { const { ast, generateCode } = parse.script(content); const vitePluginName = 'tailwindcss'; @@ -56,7 +56,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.stylesheet, (content) => { + sv.file(file.stylesheet, (content) => { const { ast, generateCode } = parse.css(content); // since we are prepending all the `AtRule` let's add them in reverse order, @@ -81,9 +81,9 @@ export default defineAddon({ return generateCode(); }); - if (!kit) { - const appSvelte = 'src/App.svelte'; - const stylesheetRelative = files.getRelative({ from: appSvelte, to: files.stylesheet }); + if (!isKit) { + const appSvelte = `${directory.src}/App.svelte`; + const stylesheetRelative = file.getRelative({ from: appSvelte, to: file.stylesheet }); sv.file(appSvelte, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); @@ -91,8 +91,8 @@ export default defineAddon({ return generateCode(); }); } else { - const layoutSvelte = `${kit?.routesDirectory}/+layout.svelte`; - const stylesheetRelative = files.getRelative({ from: layoutSvelte, to: files.stylesheet }); + const layoutSvelte = `${directory.kitRoutes}/+layout.svelte`; + const stylesheetRelative = file.getRelative({ from: layoutSvelte, to: file.stylesheet }); sv.file(layoutSvelte, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); @@ -110,7 +110,7 @@ export default defineAddon({ }); } - sv.file(files.vscodeSettings, (content) => { + sv.file(file.vscodeSettings, (content) => { const { data, generateCode } = parse.json(content); data['files.associations'] ??= {}; @@ -119,18 +119,18 @@ export default defineAddon({ return generateCode(); }); - sv.file(files.vscodeExtensions, (content) => { + sv.file(file.vscodeExtensions, (content) => { const { data, generateCode } = parse.json(content); json.arrayUpsert(data, 'recommendations', 'bradlc.vscode-tailwindcss'); return generateCode(); }); if (prettierInstalled) { - sv.file(files.prettierrc, (content) => { + sv.file(file.prettierrc, (content) => { const { data, generateCode } = parse.json(content); json.arrayUpsert(data, 'plugins', 'prettier-plugin-tailwindcss'); - data.tailwindStylesheet ??= files.getRelative({ to: files.stylesheet }); + data.tailwindStylesheet ??= file.getRelative({ to: file.stylesheet }); return generateCode(); }); diff --git a/packages/sv/src/addons/vitest-addon.ts b/packages/sv/src/addons/vitest-addon.ts index 50f632980..43e840e4c 100644 --- a/packages/sv/src/addons/vitest-addon.ts +++ b/packages/sv/src/addons/vitest-addon.ts @@ -23,7 +23,7 @@ export default defineAddon({ homepage: 'https://vitest.dev', options, - run: ({ sv, files, language, kit, options, dependencyVersion }) => { + run: ({ sv, file, language, directory, options, dependencyVersion }) => { const unitTesting = options.usages.includes('unit'); const componentTesting = options.usages.includes('component'); @@ -40,7 +40,7 @@ export default defineAddon({ sv.devDependency('playwright', '^1.58.2'); } - sv.file(files.package, (content) => { + sv.file(file.package, (content) => { const { data, generateCode } = parse.json(content); json.packageScriptsUpsert(data, 'test:unit', 'vitest'); @@ -50,7 +50,7 @@ export default defineAddon({ return generateCode(); }); - const examplesDir = (kit ? kit.libDirectory : 'src/lib') + '/vitest-examples'; + const examplesDir = `${directory.lib}/vitest-examples`; const typed = language === 'ts'; if (unitTesting || componentTesting) { @@ -119,11 +119,11 @@ export default defineAddon({ }); } - sv.file(files.viteConfig, (content) => { + sv.file(file.viteConfig, (content) => { const { ast, generateCode } = parse.script(content); const clientObjectExpression = js.object.create({ - extends: `./${files.viteConfig}`, + extends: `./${file.viteConfig}`, test: { name: 'client', browser: { @@ -137,7 +137,7 @@ export default defineAddon({ }); const serverObjectExpression = js.object.create({ - extends: `./${files.viteConfig}`, + extends: `./${file.viteConfig}`, test: { name: 'server', environment: 'node', diff --git a/packages/sv/src/cli/create.ts b/packages/sv/src/cli/create.ts index 172a25bf3..c10e83500 100644 --- a/packages/sv/src/cli/create.ts +++ b/packages/sv/src/cli/create.ts @@ -428,15 +428,18 @@ export async function createVirtualWorkspace({ type }: CreateVirtualWorkspaceOptions): Promise { const override: { - kit?: Workspace['kit']; + isKit?: boolean; + directory?: Workspace['directory']; dependencies: Record; } = { dependencies: {} }; // These are our default project structure so we know that it's a kit project if (template === 'minimal' || template === 'demo' || template === 'library') { - override.kit = { - routesDirectory: 'src/routes', - libDirectory: 'src/lib' + override.isKit = true; + override.directory = { + src: 'src', + lib: 'src/lib', + kitRoutes: 'src/routes' }; } @@ -454,8 +457,8 @@ export async function createVirtualWorkspace({ const virtualWorkspace: Workspace = { ...tentativeWorkspace, language: type === 'typescript' ? 'ts' : 'js', - files: { - ...tentativeWorkspace.files, + file: { + ...tentativeWorkspace.file, viteConfig: type === 'typescript' ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig, svelteConfig: commonFilePaths.svelteConfig // currently we always use js files, never typescript files } diff --git a/packages/sv/src/cli/tests/snapshots/@my-org/sv/src/index.js b/packages/sv/src/cli/tests/snapshots/@my-org/sv/src/index.js index bf1d89251..d1755e9e6 100644 --- a/packages/sv/src/cli/tests/snapshots/@my-org/sv/src/index.js +++ b/packages/sv/src/cli/tests/snapshots/@my-org/sv/src/index.js @@ -13,18 +13,16 @@ export default defineAddon({ id: '@my-org/sv', options, - setup: ({ kit, unsupported }) => { - if (!kit) unsupported('Requires SvelteKit'); + setup: ({ isKit, unsupported }) => { + if (!isKit) unsupported('Requires SvelteKit'); }, - run: ({ kit, sv, options, language, cancel }) => { - if (!kit) return cancel('SvelteKit is required'); - - sv.file(`src/lib/@my-org/sv/content.txt`, () => { + run: ({ directory, sv, options, language }) => { + sv.file(`${directory.lib}/@my-org/sv/content.txt`, () => { return `This is a text file made by the Community Addon Template demo for the add-on: '@my-org/sv'!`; }); - sv.file(`src/lib/@my-org/sv/HelloComponent.svelte`, (content) => { + sv.file(`${directory.lib}/@my-org/sv/HelloComponent.svelte`, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); @@ -36,7 +34,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(kit.routesDirectory + '/+page.svelte', (content) => { + sv.file(directory.kitRoutes + '/+page.svelte', (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); diff --git a/packages/sv/src/core/config.ts b/packages/sv/src/core/config.ts index 5ebd7fd0c..a89e4a9a6 100644 --- a/packages/sv/src/core/config.ts +++ b/packages/sv/src/core/config.ts @@ -50,7 +50,7 @@ export type Addon = { /** Why is this addon not supported? * * @example - * if (!kit) unsupported('Requires SvelteKit'); + * if (!isKit) unsupported('Requires SvelteKit'); */ unsupported: (reason: string) => void; diff --git a/packages/sv/src/core/workspace.ts b/packages/sv/src/core/workspace.ts index fc5c10160..b660833e8 100644 --- a/packages/sv/src/core/workspace.ts +++ b/packages/sv/src/core/workspace.ts @@ -28,10 +28,10 @@ export type Workspace = { dependencyVersion: (pkg: string) => string | undefined; /** to know if the workspace is using typescript or javascript */ language: 'ts' | 'js'; - files: { + file: { viteConfig: 'vite.config.js' | 'vite.config.ts'; svelteConfig: 'svelte.config.js' | 'svelte.config.ts'; - /** `${kit.routesDirectory}/layout.css` or `src/app.css` */ + /** `${directory.routes}/layout.css` or `src/app.css` */ stylesheet: `${string}/layout.css` | 'src/app.css'; package: 'package.json'; gitignore: '.gitignore'; @@ -46,8 +46,14 @@ export type Workspace = { /** Get the relative path between two files */ getRelative: ({ from, to }: { from?: string; to: string }) => string; }; - /** If we are in a kit project, this object will contain the lib and routes directories */ - kit: { libDirectory: string; routesDirectory: string } | undefined; + isKit: boolean; + directory: { + src: string; + /** In SvelteKit taking `kit.files.lib` automatically. Falls back to `src/lib` in non-Kit projects */ + lib: string; + /** In SvelteKit taking `kit.files.routes` automatically. Falls back to `src/routes` in non-Kit projects */ + kitRoutes: string; + }; /** The package manager used to install dependencies */ packageManager: AgentName; }; @@ -56,7 +62,8 @@ type CreateWorkspaceOptions = { cwd: string; packageManager?: AgentName; override?: { - kit?: Workspace['kit']; + isKit?: boolean; + directory?: Workspace['directory']; dependencies: Record; }; }; @@ -112,21 +119,22 @@ export async function createWorkspace({ dependencies[key] = value.replaceAll(/[^\d|.]/g, ''); } - const kit = override?.kit - ? override.kit - : dependencies['@sveltejs/kit'] - ? parseKitOptions(resolvedCwd, svelteConfig) - : undefined; + const isKit = override?.isKit ?? !!dependencies['@sveltejs/kit']; + const directory = override?.directory + ? override.directory + : isKit + ? { src: 'src', ...parseKitOptions(resolvedCwd, svelteConfig) } + : { src: 'src', lib: 'src/lib', kitRoutes: 'src/routes' }; - const stylesheet: `${string}/layout.css` | 'src/app.css' = kit - ? `${kit.routesDirectory}/layout.css` + const stylesheet: `${string}/layout.css` | 'src/app.css' = isKit + ? `${directory.kitRoutes}/layout.css` : 'src/app.css'; return { cwd: resolvedCwd, packageManager: packageManager ?? (await detectPackageManager(cwd)), language: typescript ? 'ts' : 'js', - files: { + file: { viteConfig, svelteConfig, stylesheet, @@ -147,7 +155,8 @@ export async function createWorkspace({ return relativePath; } }, - kit, + isKit, + directory, dependencyVersion: (pkg) => dependencies[pkg] }; } @@ -222,8 +231,8 @@ function parseKitOptions(cwd: string, svelteConfigPath: string) { }); const lib = js.object.property(files, { name: 'lib', fallback: js.common.createLiteral('') }); - const routesDirectory = (routes.value as string) || 'src/routes'; - const libDirectory = (lib.value as string) || 'src/lib'; - - return { routesDirectory, libDirectory }; + return { + lib: (lib.value as string) || 'src/lib', + kitRoutes: (routes.value as string) || 'src/routes' + }; } diff --git a/packages/sv/src/create/templates/addon/src/index.js b/packages/sv/src/create/templates/addon/src/index.js index 889aab0af..463b2b900 100644 --- a/packages/sv/src/create/templates/addon/src/index.js +++ b/packages/sv/src/create/templates/addon/src/index.js @@ -13,18 +13,16 @@ export default defineAddon({ id: '~SV-NAME-TODO~', options, - setup: ({ kit, unsupported }) => { - if (!kit) unsupported('Requires SvelteKit'); + setup: ({ isKit, unsupported }) => { + if (!isKit) unsupported('Requires SvelteKit'); }, - run: ({ kit, sv, options, language, cancel }) => { - if (!kit) return cancel('SvelteKit is required'); - - sv.file(`src/lib/~SV-NAME-TODO~/content.txt`, () => { + run: ({ directory, sv, options, language }) => { + sv.file(`${directory.lib}/~SV-NAME-TODO~/content.txt`, () => { return `This is a text file made by the Community Addon Template demo for the add-on: '~SV-NAME-TODO~'!`; }); - sv.file(`src/lib/~SV-NAME-TODO~/HelloComponent.svelte`, (content) => { + sv.file(`${directory.lib}/~SV-NAME-TODO~/HelloComponent.svelte`, (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language }); @@ -36,7 +34,7 @@ export default defineAddon({ return generateCode(); }); - sv.file(kit.routesDirectory + '/+page.svelte', (content) => { + sv.file(directory.kitRoutes + '/+page.svelte', (content) => { const { ast, generateCode } = parse.svelte(content); svelte.ensureScript(ast, { language });