diff --git a/packages/sv-utils/src/index.ts b/packages/sv-utils/src/index.ts index 00288175d..ad6df04f4 100644 --- a/packages/sv-utils/src/index.ts +++ b/packages/sv-utils/src/index.ts @@ -82,3 +82,4 @@ export { color } from './color.ts'; // Types export type { Comments, AstTypes, SvelteAst } from './tooling/index.ts'; +export type { TransformFn } from './tooling/transforms.ts'; diff --git a/packages/sv-utils/src/tooling/transforms.ts b/packages/sv-utils/src/tooling/transforms.ts index 82f92b0c9..c673f4949 100644 --- a/packages/sv-utils/src/tooling/transforms.ts +++ b/packages/sv-utils/src/tooling/transforms.ts @@ -18,6 +18,8 @@ import { type RootWithInstance, ensureScript } from './svelte/index.ts'; import * as svelteNs from './svelte/index.ts'; import * as textNs from './text.ts'; +export type TransformFn = (content: string) => string; + type TransformOptions = { /** Called when parsing fails. If provided, the original content is returned unchanged. */ onParseError?: (error: unknown) => void; @@ -69,7 +71,7 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ script( - cb: (args: { + cb: (file: { ast: TsEstree.Program; comments: Comments; content: string; @@ -92,7 +94,7 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ svelte( - cb: (args: { + cb: (file: { ast: SvelteAst.Root; content: string; svelte: typeof svelteNs; @@ -119,14 +121,14 @@ export const transforms = { */ svelteScript( scriptOptions: { language: 'ts' | 'js' }, - cb: (args: { + cb: (file: { ast: RootWithInstance; content: string; svelte: typeof svelteNs; js: typeof jsNs; }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseSvelte(content), options); if (!parsed) return content; @@ -148,13 +150,13 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ css( - cb: (args: { + cb: (file: { ast: Omit; content: string; css: typeof cssNs; }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseCss(content), options); if (!parsed) return content; @@ -170,9 +172,9 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ json( - cb: (args: { data: T; content: string; json: typeof jsonNs }) => void | false, + cb: (file: { data: T; content: string; json: typeof jsonNs }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseJson(content), options); if (!parsed) return content; @@ -188,9 +190,9 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ yaml( - cb: (args: { data: ReturnType['data']; content: string }) => void | false, + cb: (file: { data: ReturnType['data']; content: string }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseYaml(content), options); if (!parsed) return content; @@ -206,9 +208,9 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ toml( - cb: (args: { data: TomlTable; content: string }) => void | false, + cb: (file: { data: TomlTable; content: string }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseToml(content), options); if (!parsed) return content; @@ -224,9 +226,9 @@ export const transforms = { * Return `false` from the callback to abort - the original content is returned unchanged. */ html( - cb: (args: { ast: SvelteAst.Fragment; content: string; html: typeof htmlNs }) => void | false, + cb: (file: { ast: SvelteAst.Fragment; content: string; html: typeof htmlNs }) => void | false, options?: TransformOptions - ): (content: string) => string { + ): TransformFn { return (content) => { const parsed = withParseError(() => parseHtml(content), options); if (!parsed) return content; @@ -242,9 +244,7 @@ export const transforms = { * Unlike other transforms there's no AST here - just string in, string out. * Return the new content, or `false` to abort (original content is returned unchanged). */ - text( - cb: (args: { content: string; text: typeof textNs }) => string | false - ): (content: string) => string { + text(cb: (file: { content: string; text: typeof textNs }) => string | false): TransformFn { return (content) => { const result = cb({ content, text: textNs }); if (result === false) return content; diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index 22094f2ec..838a407d3 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -4,10 +4,10 @@ import { Walker, color, dedent, - text, transforms, resolveCommand, - createPrinter + createPrinter, + type TransformFn } from '@sveltejs/sv-utils'; import crypto from 'node:crypto'; import { defineAddon, defineAddonOptions } from '../core/config.ts'; @@ -86,14 +86,8 @@ export default defineAddon({ }) ); - sv.file( - '.env', - transforms.text(({ content }) => generateEnvFileContent(content, demoGithub, false)) - ); - sv.file( - '.env.example', - transforms.text(({ content }) => generateEnvFileContent(content, demoGithub, true)) - ); + sv.file('.env', generateEnv(demoGithub, false)); + sv.file('.env.example', generateEnv(demoGithub, true)); sv.file( `${directory.lib}/server/auth.${language}`, @@ -296,7 +290,7 @@ export default defineAddon({ sv.file( `${directory.kitRoutes}/demo/better-auth/login/+page.server.${language}`, - transforms.text(({ content }) => { + (content) => { if (content) { const filePath = `${directory.kitRoutes}/demo/better-auth/login/+page.server.${language}`; log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); @@ -397,31 +391,29 @@ export default defineAddon({ export const actions${ts(': Actions')} = {${signInEmailAction}${signInSocialAction} }; `; - }) + } ); - sv.file( - `${directory.kitRoutes}/demo/better-auth/login/+page.svelte`, - transforms.text(({ content }) => { - if (content) { - const filePath = `${directory.kitRoutes}/demo/better-auth/login/+page.svelte`; - log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); - return false; - } + sv.file(`${directory.kitRoutes}/demo/better-auth/login/+page.svelte`, (content) => { + if (content) { + const filePath = `${directory.kitRoutes}/demo/better-auth/login/+page.svelte`; + log.warn(`Existing ${color.warning(filePath)} file. Could not update.`); + return false; + } - const tailwind = dependencyVersion('@tailwindcss/vite') !== undefined; - const input = tailwind - ? ' class="mt-1 px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"' - : ''; - const btn = tailwind - ? ' class="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 transition"' - : ''; + const tailwind = dependencyVersion('@tailwindcss/vite') !== undefined; + const input = tailwind + ? ' class="mt-1 px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"' + : ''; + const btn = tailwind + ? ' class="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 transition"' + : ''; - const svelte5 = !!dependencyVersion('svelte')?.startsWith('5'); - const [ts, s5] = createPrinter(language === 'ts', svelte5); + const svelte5 = !!dependencyVersion('svelte')?.startsWith('5'); + const [ts, s5] = createPrinter(language === 'ts', svelte5); - const passwordForm = demoPassword - ? ` + const passwordForm = demoPassword + ? `