Skip to content

Commit 473d62c

Browse files
committed
Merge branch 'main' into chore/tsdown
2 parents 70c279b + 35b3e02 commit 473d62c

File tree

39 files changed

+384
-353
lines changed

39 files changed

+384
-353
lines changed

community-addon-template/src/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { defineAddon, defineAddonOptions } from '@sveltejs/cli-core';
22
import { imports } from '@sveltejs/cli-core/js';
3+
import * as svelte from '@sveltejs/cli-core/svelte';
34
import { parseSvelte } from '@sveltejs/cli-core/parsers';
45

56
export const options = defineAddonOptions()
@@ -26,9 +27,10 @@ export default defineAddon({
2627

2728
sv.file('src/DemoComponent.svelte', (content) => {
2829
if (!options.demo) return content;
29-
const { script, generateCode } = parseSvelte(content, { typescript });
30-
imports.addDefault(script.ast, { from: '../addon-template-demo.txt?raw', as: 'demo' });
31-
return generateCode({ script: script.generateCode(), template: '{demo}' });
30+
const { ast, generateCode } = parseSvelte(content);
31+
const scriptAst = svelte.ensureScript(ast, { langTs: typescript });
32+
imports.addDefault(scriptAst, { from: '../addon-template-demo.txt?raw', as: 'demo' });
33+
return generateCode();
3234
});
3335
}
3436
});

packages/addons/_tests/mdsvex/test.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import path from 'node:path';
33
import { expect } from '@playwright/test';
44
import { parseSvelte } from '@sveltejs/cli-core/parsers';
55
import { imports } from '@sveltejs/cli-core/js';
6-
import * as html from '@sveltejs/cli-core/html';
6+
import * as svelte from '@sveltejs/cli-core/svelte';
77
import { setupTest } from '../_setup/suite.ts';
88
import { svxFile } from './fixtures.ts';
99
import mdsvex from '../../mdsvex/index.ts';
@@ -40,19 +40,32 @@ function addFixture(cwd: string, variant: string) {
4040
}
4141

4242
const src = fs.readFileSync(page, 'utf8');
43-
const { script, template, generateCode } = parseSvelte(src);
44-
imports.addDefault(script.ast, { from: './Demo.svx', as: 'Demo' });
43+
const { ast, generateCode } = parseSvelte(src);
44+
const scriptAst = svelte.ensureScript(ast);
45+
imports.addDefault(scriptAst, { from: './Demo.svx', as: 'Demo' });
4546

46-
const div = html.createDiv({ class: 'mdsvex' });
47-
html.appendElement(template.ast.childNodes, div);
48-
const mdsvexNode = html.createElement('Demo');
49-
html.appendElement(div.childNodes, mdsvexNode);
50-
51-
const content = generateCode({
52-
script: script.generateCode(),
53-
template: template.generateCode()
47+
ast.fragment.nodes.push({
48+
type: 'RegularElement',
49+
name: 'div',
50+
attributes: [
51+
{
52+
type: 'Attribute',
53+
name: 'class',
54+
value: [{ type: 'Text', data: 'mdsvex', raw: 'mdsvex', start: 0, end: 0 }],
55+
start: 0,
56+
end: 0
57+
}
58+
],
59+
fragment: {
60+
type: 'Fragment',
61+
nodes: svelte.toFragment('<Demo />')
62+
},
63+
start: 0,
64+
end: 0
5465
});
5566

67+
const content = generateCode();
68+
5669
fs.writeFileSync(page, content, 'utf8');
5770
fs.writeFileSync(svx, svxFile, 'utf8');
5871
}

packages/addons/common.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { imports, exports, common } from '@sveltejs/cli-core/js';
2+
import { toFragment, type SvelteAst, ensureScript } from '@sveltejs/cli-core/svelte';
23
import { parseScript, parseSvelte } from '@sveltejs/cli-core/parsers';
34
import process from 'node:process';
45

@@ -63,22 +64,34 @@ export function addEslintConfigPrettier(content: string): string {
6364
return generateCode();
6465
}
6566

66-
export function addToDemoPage(existingContent: string, path: string, typescript: boolean): string {
67-
const { script, template, generateCode } = parseSvelte(existingContent, { typescript });
68-
69-
for (const node of template.ast.childNodes) {
70-
// we use includes as it could be "/demo/${path}" or "resolve("demo/${path}")" or "resolve('demo/${path}')"
71-
if (node.type === 'tag' && node.attribs['href'].includes(`/demo/${path}`)) {
72-
return existingContent;
67+
export function addToDemoPage(existingContent: string, path: string, langTs: boolean): string {
68+
const { ast, generateCode } = parseSvelte(existingContent);
69+
70+
for (const node of ast.fragment.nodes) {
71+
if (node.type === 'RegularElement') {
72+
const hrefAttribute = node.attributes.find(
73+
(x) => x.type === 'Attribute' && x.name === 'href'
74+
) as SvelteAst.Attribute;
75+
if (!hrefAttribute || !hrefAttribute.value) continue;
76+
77+
if (!Array.isArray(hrefAttribute.value)) continue;
78+
79+
const hasDemo = hrefAttribute.value.some(
80+
// we use includes as it could be "/demo/${path}" or "resolve("demo/${path}")" or "resolve('demo/${path}')"
81+
(x) => x.type === 'Text' && x.data.includes(`/demo/${path}`)
82+
);
83+
if (hasDemo) {
84+
return existingContent;
85+
}
7386
}
7487
}
7588

76-
imports.addNamed(script.ast, { imports: ['resolve'], from: '$app/paths' });
89+
imports.addNamed(ensureScript(ast, { langTs }), { imports: ['resolve'], from: '$app/paths' });
90+
91+
ast.fragment.nodes.unshift(...toFragment(`<a href={resolve('/demo/${path}')}>${path}</a>`));
92+
ast.fragment.nodes.unshift();
7793

78-
return generateCode({
79-
script: script.generateCode(),
80-
template: `<a href={resolve('/demo/${path}')}>${path}</a>\n${template.source}`
81-
});
94+
return generateCode();
8295
}
8396

8497
/**

packages/addons/paraglide/index.ts

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import MagicString from 'magic-string';
21
import { colors, defineAddon, defineAddonOptions, log } from '@sveltejs/cli-core';
32
import { common, imports, variables, exports, kit as kitJs, vite } from '@sveltejs/cli-core/js';
43
import * as html from '@sveltejs/cli-core/html';
4+
import * as svelte from '@sveltejs/cli-core/svelte';
55
import { parseHtml, parseJson, parseScript, parseSvelte } from '@sveltejs/cli-core/parsers';
66
import { addToDemoPage } from '../common.ts';
77

@@ -183,35 +183,34 @@ export default defineAddon({
183183

184184
// add usage example
185185
sv.file(`${kit.routesDirectory}/demo/paraglide/+page.svelte`, (content) => {
186-
const { script, template, generateCode } = parseSvelte(content, { typescript });
187-
imports.addNamed(script.ast, { from: '$lib/paraglide/messages.js', imports: ['m'] });
188-
imports.addNamed(script.ast, { from: '$app/navigation', imports: ['goto'] });
189-
imports.addNamed(script.ast, { from: '$app/state', imports: ['page'] });
190-
imports.addNamed(script.ast, { from: '$lib/paraglide/runtime', imports: ['setLocale'] });
186+
const { ast, generateCode } = parseSvelte(content);
187+
const scriptAst = svelte.ensureScript(ast, { langTs: typescript });
191188

192-
const scriptCode = new MagicString(script.generateCode());
193-
194-
const templateCode = new MagicString(template.source);
189+
imports.addNamed(scriptAst, { imports: { m: 'm' }, from: '$lib/paraglide/messages.js' });
190+
imports.addNamed(scriptAst, {
191+
imports: {
192+
setLocale: 'setLocale'
193+
},
194+
from: '$lib/paraglide/runtime'
195+
});
195196

196197
// add localized message
197-
templateCode.append("\n\n<h1>{m.hello_world({ name: 'SvelteKit User' })}</h1>\n");
198+
let templateCode = "<h1>{m.hello_world({ name: 'SvelteKit User' })}</h1>";
198199

199200
// add links to other localized pages, the first one is the default
200201
// language, thus it does not require any localized route
201202
const { validLanguageTags } = parseLanguageTagInput(options.languageTags);
202203
const links = validLanguageTags
203-
.map(
204-
(x) =>
205-
`${templateCode.getIndentString()}<button onclick={() => setLocale('${x}')}>${x}</button>`
206-
)
207-
.join('\n');
208-
templateCode.append(`<div>\n${links}\n</div>`);
209-
210-
templateCode.append(
211-
'<p>\nIf you use VSCode, install the <a href="https://marketplace.visualstudio.com/items?itemName=inlang.vs-code-extension" target="_blank">Sherlock i18n extension</a> for a better i18n experience.\n</p>'
212-
);
204+
.map((x) => `<button onclick={() => setLocale('${x}')}>${x}</button>`)
205+
.join('');
206+
templateCode += `<div>${links}</div>`;
207+
208+
templateCode +=
209+
'<p>If you use VSCode, install the <a href="https://marketplace.visualstudio.com/items?itemName=inlang.vs-code-extension" target="_blank">Sherlock i18n extension</a> for a better i18n experience.</p>';
213210

214-
return generateCode({ script: scriptCode.toString(), template: templateCode.toString() });
211+
ast.fragment.nodes.push(...svelte.toFragment(templateCode));
212+
213+
return generateCode();
215214
});
216215
}
217216

packages/addons/tailwindcss/index.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineAddon, defineAddonOptions } from '@sveltejs/cli-core';
22
import { imports, vite } from '@sveltejs/cli-core/js';
3+
import * as svelte from '@sveltejs/cli-core/svelte';
34
import { parseCss, parseJson, parseScript, parseSvelte } from '@sveltejs/cli-core/parsers';
4-
import { addSlot } from '@sveltejs/cli-core/html';
55

66
const plugins = [
77
{
@@ -32,7 +32,7 @@ export default defineAddon({
3232
shortDescription: 'css framework',
3333
homepage: 'https://tailwindcss.com',
3434
options,
35-
run: ({ sv, options, files, typescript, kit, dependencyVersion }) => {
35+
run: ({ sv, options, files, kit, dependencyVersion, typescript }) => {
3636
const prettierInstalled = Boolean(dependencyVersion('prettier'));
3737

3838
sv.devDependency('tailwindcss', '^4.1.17');
@@ -97,30 +97,28 @@ export default defineAddon({
9797
const appSvelte = 'src/App.svelte';
9898
const stylesheetRelative = files.getRelative({ from: appSvelte, to: files.stylesheet });
9999
sv.file(appSvelte, (content) => {
100-
const { script, generateCode } = parseSvelte(content, { typescript });
101-
imports.addEmpty(script.ast, { from: stylesheetRelative });
102-
return generateCode({ script: script.generateCode() });
100+
const { ast, generateCode } = parseSvelte(content);
101+
const scriptAst = svelte.ensureScript(ast, { langTs: typescript });
102+
imports.addEmpty(scriptAst, { from: stylesheetRelative });
103+
return generateCode();
103104
});
104105
} else {
105106
const layoutSvelte = `${kit?.routesDirectory}/+layout.svelte`;
106107
const stylesheetRelative = files.getRelative({ from: layoutSvelte, to: files.stylesheet });
107108
sv.file(layoutSvelte, (content) => {
108-
const { script, template, generateCode } = parseSvelte(content, { typescript });
109-
imports.addEmpty(script.ast, { from: stylesheetRelative });
109+
const { ast, generateCode } = parseSvelte(content);
110+
const scriptAst = svelte.ensureScript(ast, { langTs: typescript });
111+
imports.addEmpty(scriptAst, { from: stylesheetRelative });
110112

111113
if (content.length === 0) {
112114
const svelteVersion = dependencyVersion('svelte');
113115
if (!svelteVersion) throw new Error('Failed to determine svelte version');
114-
addSlot(script.ast, {
115-
htmlAst: template.ast,
116+
svelte.addSlot(ast, {
116117
svelteVersion
117118
});
118119
}
119120

120-
return generateCode({
121-
script: script.generateCode(),
122-
template: content.length === 0 ? template.generateCode() : undefined
123-
});
121+
return generateCode();
124122
});
125123
}
126124

packages/cli/commands/create.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,7 @@ async function createProject(cwd: ProjectPath, options: Options) {
255255
});
256256

257257
if (options.fromPlayground) {
258-
await createProjectFromPlayground(
259-
options.fromPlayground,
260-
projectPath,
261-
language === 'typescript'
262-
);
258+
await createProjectFromPlayground(options.fromPlayground, projectPath);
263259
}
264260

265261
p.log.success('Project created');
@@ -322,19 +318,15 @@ async function createProject(cwd: ProjectPath, options: Options) {
322318
return { directory: projectPath, addOnNextSteps, packageManager };
323319
}
324320

325-
async function createProjectFromPlayground(
326-
url: string,
327-
cwd: string,
328-
typescript: boolean
329-
): Promise<void> {
321+
async function createProjectFromPlayground(url: string, cwd: string): Promise<void> {
330322
const urlData = parsePlaygroundUrl(url);
331323
const playground = await downloadPlaygroundData(urlData);
332324

333325
// Detect external dependencies and ask for confirmation
334326
const dependencies = detectPlaygroundDependencies(playground.files);
335327
const installDependencies = await confirmExternalDependencies(Array.from(dependencies.keys()));
336328

337-
setupPlaygroundProject(url, playground, cwd, installDependencies, typescript);
329+
setupPlaygroundProject(url, playground, cwd, installDependencies);
338330
}
339331

340332
async function confirmExternalDependencies(dependencies: string[]): Promise<boolean> {
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<script lang="ts">
22
import './layout.css';
33
import favicon from '$lib/assets/favicon.svg';
4-
4+
55
let { children } = $props();
66
</script>
77

8-
<svelte:head>
9-
<link rel="icon" href={favicon} />
10-
</svelte:head>
11-
8+
<svelte:head><link rel="icon" href={favicon} /></svelte:head>
129
{@render children()}
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
<script lang="ts">
22
import { setLocale } from '$lib/paraglide/runtime';
3-
import { page } from '$app/state';
4-
import { goto } from '$app/navigation';
53
import { m } from '$lib/paraglide/messages.js';
64
</script>
75

8-
9-
106
<h1>{m.hello_world({ name: 'SvelteKit User' })}</h1>
117
<div>
128
<button onclick={() => setLocale('en')}>en</button>
139
<button onclick={() => setLocale('es')}>es</button>
14-
</div><p>
15-
If you use VSCode, install the <a href="https://marketplace.visualstudio.com/items?itemName=inlang.vs-code-extension" target="_blank">Sherlock i18n extension</a> for a better i18n experience.
10+
</div>
11+
<p>
12+
If you use VSCode, install the
13+
<a
14+
href="https://marketplace.visualstudio.com/items?itemName=inlang.vs-code-extension"
15+
target="_blank"
16+
>
17+
Sherlock i18n extension
18+
</a>
19+
for a better i18n experience.
1620
</p>

packages/core/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"./css": "./tooling/css/index.ts",
2323
"./html": "./tooling/html/index.ts",
2424
"./js": "./tooling/js/index.ts",
25+
"./svelte": "./tooling/svelte/index.ts",
2526
"./parsers": "./tooling/parsers.ts"
2627
},
2728
"devDependencies": {
@@ -40,6 +41,7 @@
4041
"picocolors": "^1.1.1",
4142
"postcss": "^8.5.6",
4243
"silver-fleece": "^1.2.1",
44+
"svelte": "^5.45.0",
4345
"yaml": "^2.8.1",
4446
"zimmerframe": "^1.1.4"
4547
},
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
const test = {
2-
/** a comment */
2+
// prettier-ignore
33
foo: 1
44
};

0 commit comments

Comments
 (0)