diff --git a/.changeset/petite-clocks-relax.md b/.changeset/petite-clocks-relax.md new file mode 100644 index 000000000..3fe8158e1 --- /dev/null +++ b/.changeset/petite-clocks-relax.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix(cloudflare): remove commented out `Platform` placeholder when adding Cloudflare types diff --git a/packages/sv/lib/addons/better-auth.ts b/packages/sv/lib/addons/better-auth.ts index 116858b41..fdf12364e 100644 --- a/packages/sv/lib/addons/better-auth.ts +++ b/packages/sv/lib/addons/better-auth.ts @@ -156,7 +156,7 @@ export default defineAddon({ }); sv.file('src/app.d.ts', (content) => { - const { ast, generateCode } = parse.script(content); + const { ast, comments, generateCode } = parse.script(content); js.imports.addNamed(ast, { imports: ['User', 'Session'], @@ -169,6 +169,9 @@ export default defineAddon({ throw new Error('Failed detecting `locals` interface in `src/app.d.ts`'); } + // remove the commented out placeholder since we're adding the real one + comments.remove((c) => c.type === 'Line' && c.value.trim() === 'interface Locals {}'); + const user = locals.body.body.find((prop) => js.common.hasTypeProperty(prop, { name: 'user' }) ); @@ -176,37 +179,11 @@ export default defineAddon({ js.common.hasTypeProperty(prop, { name: 'session' }) ); - function addProps( - name: string, - value: string, - optional = false - ): AstTypes.TSInterfaceBody['body'][number] { - return { - type: 'TSPropertySignature', - key: { - type: 'Identifier', - name - }, - computed: false, - optional, - typeAnnotation: { - type: 'TSTypeAnnotation', - typeAnnotation: { - type: 'TSTypeReference', - typeName: { - type: 'Identifier', - name: value - } - } - } - }; - } - if (!user) { - locals.body.body.push(addProps('user', 'User', true)); + locals.body.body.push(js.common.createTypeProperty('user', 'User', true)); } if (!session) { - locals.body.body.push(addProps('session', 'Session', true)); + locals.body.body.push(js.common.createTypeProperty('session', 'Session', true)); } return generateCode(); }); diff --git a/packages/sv/lib/addons/sveltekit-adapter.ts b/packages/sv/lib/addons/sveltekit-adapter.ts index 994335bef..5c64bfa74 100644 --- a/packages/sv/lib/addons/sveltekit-adapter.ts +++ b/packages/sv/lib/addons/sveltekit-adapter.ts @@ -1,7 +1,6 @@ import { readFileSync } from 'node:fs'; import { join } from 'node:path'; import { - type AstTypes, defineAddon, defineAddonOptions, js, @@ -211,18 +210,21 @@ export default defineAddon({ }); sv.file('src/app.d.ts', (content) => { - const { ast, generateCode } = parse.script(content); + const { ast, comments, generateCode } = parse.script(content); const platform = js.kit.addGlobalAppInterface(ast, { name: 'Platform' }); if (!platform) { throw new Error('Failed detecting `platform` interface in `src/app.d.ts`'); } + // remove the commented out placeholder since we're adding the real one + comments.remove((c) => c.type === 'Line' && c.value.trim() === 'interface Platform {}'); + platform.body.body.push( - createCloudflarePlatformType('env', 'Env'), - createCloudflarePlatformType('ctx', 'ExecutionContext'), - createCloudflarePlatformType('caches', 'CacheStorage'), - createCloudflarePlatformType('cf', 'IncomingRequestCfProperties', true) + js.common.createTypeProperty('env', 'Env'), + js.common.createTypeProperty('ctx', 'ExecutionContext'), + js.common.createTypeProperty('caches', 'CacheStorage'), + js.common.createTypeProperty('cf', 'IncomingRequestCfProperties', true) ); return generateCode(); @@ -244,29 +246,3 @@ export default defineAddon({ return toReturn; } }); - -function createCloudflarePlatformType( - name: string, - value: string, - optional = false -): AstTypes.TSInterfaceBody['body'][number] { - return { - type: 'TSPropertySignature', - key: { - type: 'Identifier', - name - }, - computed: false, - optional, - typeAnnotation: { - type: 'TSTypeAnnotation', - typeAnnotation: { - type: 'TSTypeReference', - typeName: { - type: 'Identifier', - name: value - } - } - } - }; -} diff --git a/packages/sv/lib/cli/tests/snapshots/create-with-all-addons/src/app.d.ts b/packages/sv/lib/cli/tests/snapshots/create-with-all-addons/src/app.d.ts index 64ed26a98..87f8dbd97 100644 --- a/packages/sv/lib/cli/tests/snapshots/create-with-all-addons/src/app.d.ts +++ b/packages/sv/lib/cli/tests/snapshots/create-with-all-addons/src/app.d.ts @@ -7,7 +7,6 @@ declare global { interface Locals { user?: User; session?: Session } // interface Error {} - // interface Locals {} // interface PageData {} // interface PageState {} // interface Platform {} diff --git a/packages/sv/lib/core/tests/js/common/create-type-property/input.ts b/packages/sv/lib/core/tests/js/common/create-type-property/input.ts new file mode 100644 index 000000000..943dd0c93 --- /dev/null +++ b/packages/sv/lib/core/tests/js/common/create-type-property/input.ts @@ -0,0 +1,7 @@ +declare global { + namespace App { + // interface Platform {} + } +} + +export {}; diff --git a/packages/sv/lib/core/tests/js/common/create-type-property/output.ts b/packages/sv/lib/core/tests/js/common/create-type-property/output.ts new file mode 100644 index 000000000..09d6ad1bc --- /dev/null +++ b/packages/sv/lib/core/tests/js/common/create-type-property/output.ts @@ -0,0 +1,13 @@ +declare global { + namespace App { + interface Platform { + env: Env; + ctx: ExecutionContext; + cf?: IncomingRequestCfProperties + } + + // interface Platform {} + } +} + +export {}; diff --git a/packages/sv/lib/core/tests/js/common/create-type-property/run.ts b/packages/sv/lib/core/tests/js/common/create-type-property/run.ts new file mode 100644 index 000000000..40dbb38a7 --- /dev/null +++ b/packages/sv/lib/core/tests/js/common/create-type-property/run.ts @@ -0,0 +1,10 @@ +import { common, kit, type AstTypes } from '../../../../tooling/js/index.ts'; + +export function run(ast: AstTypes.Program): void { + const platform = kit.addGlobalAppInterface(ast as AstTypes.TSProgram, { name: 'Platform' }); + platform.body.body.push( + common.createTypeProperty('env', 'Env'), + common.createTypeProperty('ctx', 'ExecutionContext'), + common.createTypeProperty('cf', 'IncomingRequestCfProperties', true) + ); +} diff --git a/packages/sv/lib/core/tooling/js/common.ts b/packages/sv/lib/core/tooling/js/common.ts index eb6cab28a..038b668a9 100644 --- a/packages/sv/lib/core/tooling/js/common.ts +++ b/packages/sv/lib/core/tooling/js/common.ts @@ -192,3 +192,29 @@ export function hasTypeProperty( node.key.name === options.name ); } + +export function createTypeProperty( + name: string, + value: string, + optional = false +): AstTypes.TSInterfaceBody['body'][number] { + return { + type: 'TSPropertySignature', + key: { + type: 'Identifier', + name + }, + computed: false, + optional, + typeAnnotation: { + type: 'TSTypeAnnotation', + typeAnnotation: { + type: 'TSTypeReference', + typeName: { + type: 'Identifier', + name: value + } + } + } + }; +}