Skip to content

vscode xxxData to xxxProps #2796

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jul 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ A `.svelte` file would look something like this:
let count = $state(1);

let doubled = $derived(count * 2);
let quadrupled = $derived(doubled * 2);
let quadrupled = $derived(doubled * 2);

function handleClick() {
count += 1;
}
</script>

<button onclick={handleClick}>Count: {count}</button>
<button onclick="{handleClick}">Count: {count}</button>

<p>{count} * 2 = {doubled}</p>
<p>{doubled} * 2 = {quadrupled}</p>
Expand Down
3 changes: 2 additions & 1 deletion packages/svelte-vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"build": "npm run build:ts && npm run build:grammar",
"vscode:prepublish": "npm install && npm run build && npm prune --production",
"watch": "npm run build:grammar && tsc -w -p ./",
"test": "npm run build:grammar && node test/grammar/test.js"
"test": "npm run build:grammar && node test/grammar/test.js && vitest --run"
},
"repository": {
"type": "git",
Expand Down Expand Up @@ -745,6 +745,7 @@
"js-yaml": "^3.14.0",
"tslib": "^2.4.0",
"typescript": "^5.8.2",
"vitest": "^3.2.4",
"vscode-tmgrammar-test": "^0.0.11"
},
"dependencies": {
Expand Down
22 changes: 11 additions & 11 deletions packages/svelte-vscode/src/sveltekit/generateFiles/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { commands, ExtensionContext, ProgressLocation, Uri, window, workspace }
import { addResourceCommandMap } from './commands';
import { generateResources } from './generate';
import { resourcesMap } from './resources';
import { FileType, ResourceType, GenerateConfig, CommandType, ProjectType } from './types';
import { checkProjectType } from '../utils';
import { FileType, ResourceType, GenerateConfig, CommandType } from './types';
import { checkProjectKind } from '../utils';

class GenerateError extends Error {}

Expand Down Expand Up @@ -38,7 +38,7 @@ async function handleSingle(uri: Uri | undefined, resourceType: ResourceType) {
}
const resources = [resource];

const { type, rootPath, scriptExtension } = await getCommonConfig(uri);
const { kind, rootPath, scriptExtension } = await getCommonConfig(uri);

const itemPath = await promptResourcePath();

Expand All @@ -48,15 +48,15 @@ async function handleSingle(uri: Uri | undefined, resourceType: ResourceType) {

await generate({
path: path.join(rootPath, itemPath),
type,
kind,
pageExtension: 'svelte',
scriptExtension,
resources
});
}

async function handleMultiple(uri: Uri | undefined) {
const { type, rootPath, scriptExtension } = await getCommonConfig(uri);
const { kind, rootPath, scriptExtension } = await getCommonConfig(uri);
const itemPath = await promptResourcePath();

if (!itemPath) {
Expand Down Expand Up @@ -92,7 +92,7 @@ async function handleMultiple(uri: Uri | undefined) {

await generate({
path: path.join(rootPath, itemPath),
type,
kind,
pageExtension: 'svelte',
scriptExtension,
resources: result.map((res) => res.value)
Expand Down Expand Up @@ -125,17 +125,17 @@ async function getCommonConfig(uri: Uri | undefined) {
);
}

const type = await checkProjectType(rootPath);
const scriptExtension = getScriptExtension(type);
const kind = await checkProjectKind(rootPath);
const scriptExtension = getScriptExtension(kind);
return {
type,
kind,
scriptExtension,
rootPath
} as const;
}

function getScriptExtension(type: ProjectType) {
return type === ProjectType.JS || type === ProjectType.JS_SV5 ? 'js' : 'ts';
function getScriptExtension(kind: GenerateConfig['kind']) {
return kind.withTs ? 'ts' : 'js';
}

function getRootPath(uri: Uri | undefined) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
<script>
Expand All @@ -16,15 +16,13 @@ const tsScriptTemplate = `
<h1>{$page.status}: {$page.error?.message}</h1>
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsScriptTemplate],
[ProjectType.JS_SV5, defaultScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withTs } = config.kind;
let template = defaultScriptTemplate;

if (withTs) {
template = tsScriptTemplate;
}

return template.trim();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
/** @type {import('./$types').LayoutLoad} */
Expand All @@ -23,15 +23,15 @@ export const load = (async () => {
}) satisfies LayoutLoad;
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate],
[ProjectType.JS_SV5, defaultScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withTs, withSatisfies } = config.kind;
let template = defaultScriptTemplate;

if (withTs && withSatisfies) {
template = tsSatisfiesScriptTemplate;
} else if (withTs && !withSatisfies) {
template = tsScriptTemplate;
}

return template.trim();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
/** @type {import('./$types').LayoutServerLoad} */
Expand All @@ -23,15 +23,15 @@ export const load = (async () => {
}) satisfies LayoutServerLoad;
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate],
[ProjectType.JS_SV5, defaultScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withTs, withSatisfies } = config.kind;
let template = defaultScriptTemplate;

if (withTs && withSatisfies) {
template = tsSatisfiesScriptTemplate;
} else if (withTs && !withSatisfies) {
template = tsScriptTemplate;
}

return template.trim();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
<script>
Expand All @@ -20,6 +20,16 @@ const tsSv5ScriptTemplate = `
{@render children()}
`;

const tsSv5ScriptTemplateProps = `
<script lang="ts">
import type { LayoutProps } from './$types';

let { data, children }: LayoutProps = $props();
</script>

{@render children()}
`;

const tsScriptTemplate = `
<script lang="ts">
import type { LayoutData } from './$types';
Expand All @@ -39,15 +49,32 @@ const jsSv5ScriptTemplate = `
{@render children()}
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsSv5ScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsSv5ScriptTemplate],
[ProjectType.JS_SV5, jsSv5ScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);
const jsSv5ScriptTemplateProps = `
<script>
/** @type {import('./$types').LayoutProps} */
let { data, children } = $props();
</script>

{@render children()}
`;

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withRunes, withTs, withProps } = config.kind;
let template = defaultScriptTemplate;

if (withRunes && withTs && withProps) {
template = tsSv5ScriptTemplateProps;
} else if (withRunes && withTs && !withProps) {
template = tsSv5ScriptTemplate;
} else if (withRunes && !withTs && withProps) {
template = jsSv5ScriptTemplateProps;
} else if (withRunes && !withTs && !withProps) {
template = jsSv5ScriptTemplate;
} else if (!withRunes && withTs) {
template = tsScriptTemplate;
} else if (!withRunes && !withTs) {
template = defaultScriptTemplate;
}

return template.trim();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
/** @type {import('./$types').PageLoad} */
Expand All @@ -23,15 +23,15 @@ export const load = (async () => {
}) satisfies PageLoad;
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate],
[ProjectType.JS_SV5, defaultScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withTs, withSatisfies } = config.kind;
let template = defaultScriptTemplate;

if (withTs && withSatisfies) {
template = tsSatisfiesScriptTemplate;
} else if (withTs && !withSatisfies) {
template = tsScriptTemplate;
}

return template.trim();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GenerateConfig, ProjectType, Resource } from '../types';
import { GenerateConfig, Resource } from '../types';

const defaultScriptTemplate = `
/** @type {import('./$types').PageServerLoad} */
Expand All @@ -23,15 +23,15 @@ export const load = (async () => {
}) satisfies PageServerLoad;
`;

const scriptTemplate: ReadonlyMap<ProjectType, string> = new Map([
[ProjectType.TS_SV5, tsScriptTemplate],
[ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate],
[ProjectType.JS_SV5, defaultScriptTemplate],
[ProjectType.TS, tsScriptTemplate],
[ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate],
[ProjectType.JS, defaultScriptTemplate]
]);

export default async function (config: GenerateConfig): ReturnType<Resource['generate']> {
return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim();
const { withTs, withSatisfies } = config.kind;
let template = defaultScriptTemplate;

if (withTs && withSatisfies) {
template = tsSatisfiesScriptTemplate;
} else if (withTs && !withSatisfies) {
template = tsScriptTemplate;
}

return template.trim();
}
Loading