Skip to content

Commit 41e943c

Browse files
authored
Merge pull request #55 from retejs/svelte-5
feat: support svelte 5
2 parents 7f90c1d + 65c5290 commit 41e943c

File tree

19 files changed

+178
-37
lines changed

19 files changed

+178
-37
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import adapter from '@sveltejs/adapter-static';
2+
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
3+
4+
/** @type {import('@sveltejs/kit').Config} */
5+
const config = {
6+
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
7+
// for more information about preprocessors
8+
preprocess: vitePreprocess(),
9+
10+
kit: {
11+
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
12+
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
13+
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
14+
adapter: adapter({
15+
strict: false
16+
})
17+
}
18+
};
19+
20+
export default config;

assets/app/stack/svelte/modules/customization/CustomConnection.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import type { ClassicScheme } from "rete-svelte-plugin";
2+
import type { ClassicScheme } from "rete-svelte-plugin/* [svelte5] /5 [/svelte5] */";
33
type Position = { x: number; y: number };
44
55
// svelte-ignore unused-export-let

assets/app/stack/svelte/modules/customization/CustomNode.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
2-
import type { ClassicScheme, SvelteArea2D } from "rete-svelte-plugin";
3-
import { Ref } from "rete-svelte-plugin";
2+
import type { ClassicScheme, SvelteArea2D } from "rete-svelte-plugin/* [svelte5] /5 [/svelte5] */";
3+
import { Ref } from "rete-svelte-plugin/* [svelte5] /5 [/svelte5] */";
44
type NodeExtraData = { width?: number; height?: number };
55
66
function sortByIndex<K, I extends undefined | { index?: number }>(

assets/app/stack/svelte/modules/routes/+layout.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script>
22
import Header from "./Header.svelte";
3-
import "./styles.css";
3+
/* [!svelte5] import "./styles.css"; [/!svelte5] */
4+
/* [svelte5] import "../app.css"; [/svelte5] */
45
</script>
56

67
<div class="app">

assets/app/stack/svelte/modules/routes/+page.svelte

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
import welcome from "$lib/images/svelte-welcome.webp";
33
import welcome_fallback from "$lib/images/svelte-welcome.png";
44
5-
import "./styles.css";
5+
import "../common.css";
6+
import "../customization/background.css";
67
import { onMount } from "svelte";
78
let el: HTMLElement;
89
@@ -33,9 +34,6 @@
3334
</section>
3435

3536
<style>
36-
@import '../common.css';
37-
@import '../customization/background.css';
38-
3937
section {
4038
display: flex;
4139
flex-direction: column;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
declare module '*.svelte' {
2+
import type { Component } from 'svelte'
3+
4+
// eslint-disable-next-line init-declarations
5+
const component: Component
6+
7+
export default component
8+
}

assets/app/templates/3d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { ConnectionPlugin, Presets as ConnectionPresets } from 'rete-connection-
77
/* [react18] import { createRoot } from 'react-dom/client' [/react18] */
88
/* [vue-render] import { VuePlugin, VueArea2D, Presets as VuePresets } from 'rete-vue-plugin/* [vue2] /vue2 [/vue2] */' [/vue-render] */
99
/* [angular-render] import { AngularPlugin, AngularArea2D, Presets as AngularPresets } from 'rete-angular-plugin/* [angular12] /12 [/angular12] *//* [angular13] /13 [/angular13] *//* [angular14] /14 [/angular14] *//* [angular15] /15 [/angular15] *//* [angular16] /16 [/angular16] *//* [angular17] /17 [/angular17] *//* [angular18] /18 [/angular18] */' [/angular-render] */
10-
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin' [/svelte-render] */
10+
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin/* [svelte5] /5 [/svelte5] */' [/svelte-render] */
1111
/* [lit-render] import { LitPlugin, LitArea2D, Presets as LitPresets } from '@retejs/lit-plugin' [/lit-render] */
1212
/* [dataflow] import { DataflowEngine, DataflowNode } from 'rete-engine' [/dataflow] */
1313
/* [arrange] import { AutoArrangePlugin, Presets as ArrangePresets } from 'rete-auto-arrange-plugin' [/arrange] */

assets/app/templates/customization

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
/* [react18] import { createRoot } from 'react-dom/client' [/react18] */
1010
/* [stack-vue] import { VuePlugin, VueArea2D, Presets as VuePresets } from 'rete-vue-plugin/* [vue2] /vue2 [/vue2] */' [/stack-vue] */
1111
/* [stack-angular] import { AngularPlugin, AngularArea2D, Presets as AngularPresets } from 'rete-angular-plugin/* [angular12] /12 [/angular12] *//* [angular13] /13 [/angular13] *//* [angular14] /14 [/angular14] *//* [angular15] /15 [/angular15] *//* [angular16] /16 [/angular16] *//* [angular17] /17 [/angular17] *//* [angular18] /18 [/angular18] */' [/stack-angular] */
12-
/* [stack-svelte] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin' [/stack-svelte] */
12+
/* [stack-svelte] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin/* [svelte5] /5 [/svelte5] */' [/stack-svelte] */
1313
/* [stack-lit] import { LitPlugin, LitArea2D, Presets as LitPresets } from '@retejs/lit-plugin' [/stack-lit] */
1414
/* [stack-react] import { CustomNode } from "../customization/CustomNode";
1515
import { StyledNode } from "../customization/StyledNode";
@@ -127,13 +127,13 @@ export async function createEditor(container: HTMLElement/* [stack-angular] , in
127127
SveltePresets.classic.setup({
128128
customize: {
129129
node() {
130-
return CustomNodeComponent as any;
130+
return CustomNodeComponent;
131131
},
132132
connection() {
133-
return CustomConnectionComponent as any;
133+
return CustomConnectionComponent;
134134
},
135135
socket() {
136-
return CustomSocketComponent as any;
136+
return CustomSocketComponent;
137137
}
138138
},
139139
})

assets/app/templates/default

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Area2D, /* [import-area-extensions] AreaExtensions, [/import-area-exten
66
/* [react18] import { createRoot } from 'react-dom/client' [/react18] */
77
/* [vue-render] import { VuePlugin, VueArea2D, Presets as VuePresets } from 'rete-vue-plugin/* [vue2] /vue2 [/vue2] */' [/vue-render] */
88
/* [angular-render] import { AngularPlugin, AngularArea2D, Presets as AngularPresets } from 'rete-angular-plugin/* [angular12] /12 [/angular12] *//* [angular13] /13 [/angular13] *//* [angular14] /14 [/angular14] *//* [angular15] /15 [/angular15] *//* [angular16] /16 [/angular16] *//* [angular17] /17 [/angular17] *//* [angular18] /18 [/angular18] */' [/angular-render] */
9-
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin' [/svelte-render] */
9+
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin/* [svelte5] /5 [/svelte5] */' [/svelte-render] */
1010
/* [lit-render] import { LitPlugin, LitArea2D, Presets as LitPresets } from '@retejs/lit-plugin' [/lit-render] */
1111
/* [dataflow] import { DataflowEngine, DataflowNode } from 'rete-engine' [/dataflow] */
1212
/* [arrange] import { AutoArrangePlugin, Presets as ArrangePresets } from 'rete-auto-arrange-plugin' [/arrange] */

assets/app/templates/perf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { /* [import-area-extensions] AreaExtensions, [/import-area-extensions] *
55
/* [react18] import { createRoot } from 'react-dom/client' [/react18] */
66
/* [vue-render] import { VuePlugin, VueArea2D, Presets as VuePresets } from 'rete-vue-plugin/* [vue2] /vue2 [/vue2] */' [/vue-render] */
77
/* [angular-render] import { AngularPlugin, AngularArea2D, Presets as AngularPresets } from 'rete-angular-plugin/* [angular12] /12 [/angular12] *//* [angular13] /13 [/angular13] *//* [angular14] /14 [/angular14] *//* [angular15] /15 [/angular15] *//* [angular16] /16 [/angular16] *//* [angular17] /17 [/angular17] *//* [angular18] /18 [/angular18] */' [/angular-render] */
8-
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin' [/svelte-render] */
8+
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin/* [svelte5] /5 [/svelte5] */' [/svelte-render] */
99
/* [lit-render] import { LitPlugin, LitArea2D, Presets as LitPresets } from '@retejs/lit-plugin' [/lit-render] */
1010

1111

assets/app/templates/scopes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Area2D, /* [import-area-extensions] AreaExtensions, [/import-area-exten
66
/* [react18] import { createRoot } from 'react-dom/client' [/react18] */
77
/* [vue-render] import { VuePlugin, VueArea2D, Presets as VuePresets } from 'rete-vue-plugin/* [vue2] /vue2 [/vue2] */' [/vue-render] */
88
/* [angular-render] import { AngularPlugin, AngularArea2D, Presets as AngularPresets } from 'rete-angular-plugin/* [angular12] /12 [/angular12] *//* [angular13] /13 [/angular13] *//* [angular14] /14 [/angular14] *//* [angular15] /15 [/angular15] *//* [angular16] /16 [/angular16] *//* [angular17] /17 [/angular17] *//* [angular18] /18 [/angular18] */' [/angular-render] */
9-
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin' [/svelte-render] */
9+
/* [svelte-render] import { SveltePlugin, SvelteArea2D, Presets as SveltePresets } from 'rete-svelte-plugin/* [svelte5] /5 [/svelte5] */' [/svelte-render] */
1010
/* [lit-render] import { LitPlugin, LitArea2D, Presets as LitPresets } from '@retejs/lit-plugin' [/lit-render] */
1111
import { ScopesPlugin, Presets as ScopesPresets } from "rete-scopes-plugin";
1212
/* [context-menu] import { ContextMenuPlugin, ContextMenuExtra, Presets as ContextMenuPresets } from 'rete-context-menu-plugin' [/context-menu] */

src/app/features.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { AppStack } from '.'
22
import { AngularVersion } from './stack/angular'
3+
import { SvelteVersion } from './stack/svelte'
34
import { DefaultTemplateKey } from './template-builder'
45

56
function ver(name: string, next: boolean) {
@@ -92,7 +93,7 @@ export class Svelte implements Feature {
9293
templateKeys: DefaultTemplateKey[] = ['svelte-render']
9394
requiredDependencies: string[] = ['sass']
9495

95-
constructor(version: 3 | 4, next: boolean) {
96+
constructor(version: SvelteVersion, next: boolean) {
9697
this.templateKeys.push(`svelte${version}`)
9798
this.requiredDependencies.push(
9899
ver('rete-render-utils', next),

src/app/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ViteBuilder, VueBuilder, VueViteBuilder
1111
} from './stack'
1212
import { AngularVersion } from './stack/angular'
13+
import { SvelteVersion } from './stack/svelte'
1314
import { DefaultTemplateKey, TemplateBuilder } from './template-builder'
1415

1516
export const builders = {
@@ -51,12 +52,15 @@ export async function createApp({ name, stack, version, features, depsAlias, for
5152
if (!appStacks.includes(selectedStack)) throwError('unknown stack')
5253

5354
const builder = builders[selectedStack]
54-
const selectedVersion = version || await select('Version', builder.versions.map(value => ({
55+
const builderVersions = builder.versions as number[]
56+
const selectedVersion = version || await select<number>('Version', builderVersions.map(value => ({
5557
name: String(value),
5658
value: value
5759
})))
5860

59-
if (!builder.versions.includes(selectedVersion)) throwError('specified version is not available for selected stack')
61+
if (!builderVersions.includes(selectedVersion)) {
62+
throwError('specified version is not available for selected stack')
63+
}
6064

6165
const featuresList: Features.Feature[] = [
6266
new Features.Default(builder.foundation, next),
@@ -71,7 +75,7 @@ export async function createApp({ name, stack, version, features, depsAlias, for
7175
? selectedVersion as 2
7276
: 3, next),
7377
new Features.Svelte(builder.foundation === 'svelte'
74-
? selectedVersion as 4
78+
? selectedVersion as SvelteVersion
7579
: 4, next),
7680
new Features.Lit(builder.foundation === 'lit'
7781
? selectedVersion as 3

src/app/stack/angular/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { basename, dirname, join } from 'path'
66
import { AppBuilder } from '../../app-builder'
77
import { assetsCommon, assetsStack } from '../../consts'
88
import { TemplateBuilder } from '../../template-builder'
9+
import { FileTemplate } from '../../template-builder-helpers'
910
import { removeBudgets } from './budgets'
1011
import { installCompatibleTS } from './compatibility'
1112

@@ -56,10 +57,11 @@ export class AngularBuilder implements AppBuilder {
5657
}
5758
})
5859

59-
const appModulePath = join(src, 'app', 'app.module.ts')
60-
const appFile = await fs.promises.readFile(appModulePath, { encoding: 'utf-8' })
60+
const fileTemplate = new FileTemplate(template)
6161

62-
await fs.promises.writeFile(appModulePath, await template.build(appFile))
62+
await fileTemplate.apply([
63+
join(src, 'app', 'app.module.ts')
64+
])
6365
}
6466

6567
async putScript(name: string, path: string, code: string): Promise<void> {

src/app/stack/svelte/compatibility.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { join } from 'path'
2+
3+
interface ToolsSet {
4+
create: {
5+
version: string
6+
flags?: string[]
7+
}
8+
kit: {
9+
version: string
10+
}
11+
config?: {
12+
path?: string
13+
}
14+
adapter: {
15+
version: string
16+
}
17+
}
18+
19+
const legacy: ToolsSet = {
20+
create: {
21+
version: '4'
22+
},
23+
kit: {
24+
version: '1'
25+
},
26+
adapter: {
27+
version: '2'
28+
}
29+
}
30+
31+
const tools: Record<`v${number}`, ToolsSet> = {
32+
v5: {
33+
create: {
34+
version: '6',
35+
flags: ['--svelte5']
36+
},
37+
kit: {
38+
version: '2'
39+
},
40+
config: {
41+
path: '5'
42+
},
43+
adapter: {
44+
version: '3'
45+
}
46+
},
47+
v4: legacy,
48+
v3: legacy
49+
}
50+
51+
export function getToolsFor(version: number) {
52+
return tools[`v${version}`]
53+
}
54+
55+
export function getConfigFor(version: number) {
56+
const name = 'svelte.config.js'
57+
const path = version === 5
58+
? '5'
59+
: '.'
60+
61+
return {
62+
source: join(path, name),
63+
name
64+
}
65+
}

src/app/stack/svelte/index.ts

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,57 @@
1-
import execa from 'execa'
21
import fs from 'fs'
32
import fse from 'fs-extra'
43
import { dirname, join } from 'path'
54

5+
import { exec } from '../../../shared/exec'
66
import { getTSConfig, setTSConfig } from '../../../shared/ts-config'
77
import { AppBuilder } from '../../app-builder'
88
import { assetsCommon, assetsStack } from '../../consts'
9+
import { TemplateBuilder } from '../../template-builder'
10+
import { FileTemplate } from '../../template-builder-helpers'
11+
import { getConfigFor, getToolsFor } from './compatibility'
12+
13+
export type SvelteVersion = 3 | 4 | 5
914

1015
export class SvelteBuilder implements AppBuilder {
1116
public name = 'Svelte'
12-
public versions = [3, 4]
17+
public versions: SvelteVersion[] = [3, 4, 5]
1318
public foundation = 'svelte' as const
1419

1520
public async create(name: string, version: number) {
16-
await execa('npm', [
17-
'create', `svelte-with-args@4`, '-y',
18-
'--',
21+
const tools = getToolsFor(version)
22+
23+
await exec('npx', [
24+
`create-svelte-with-args@${tools.create.version}`,
1925
'--name', name,
2026
'--template', 'default',
2127
'--types', 'typescript',
22-
'--no-prettier', '--no-eslint', '--no-playwright', '--no-vitest'
28+
'--no-prettier', '--no-eslint', '--no-playwright', '--no-vitest',
29+
...tools.create.flags ?? []
2330
], { stdio: 'inherit' })
24-
await execa('npm', ['i'], { cwd: join(process.cwd(), name), stdio: 'inherit' })
31+
await exec('npm', ['i'], { cwd: join(process.cwd(), name), stdio: 'inherit' })
2532

2633
const tsConfig = await getTSConfig(name)
2734

2835
tsConfig.compilerOptions.preserveValueImports = false
2936
tsConfig.compilerOptions.importsNotUsedAsValues = 'preserve'
37+
tsConfig.compilerOptions.verbatimModuleSyntax = false
3038

3139
await setTSConfig(name, tsConfig)
3240

33-
await execa('npm', [
41+
await exec('npm', [
3442
'i',
3543
`svelte@${version}`,
36-
`@sveltejs/kit@1`
44+
`@sveltejs/kit@${tools.kit.version}`
3745
], { stdio: 'inherit', cwd: name })
3846

39-
const configName = 'svelte.config.js'
47+
const { name: configName, source } = getConfigFor(version)
4048

41-
await fse.copy(join(assetsStack, 'svelte', configName), join(name, configName), { overwrite: true })
42-
await execa('npm', ['i', `@sveltejs/adapter-static@2`], { stdio: 'inherit', cwd: name })
49+
await fse.copy(join(assetsStack, 'svelte', source), join(name, configName), { overwrite: true })
50+
await exec('npm', ['i', `@sveltejs/adapter-static@${tools.adapter.version}`], { stdio: 'inherit', cwd: name })
4351
}
4452

45-
async putAssets(name: string) {
53+
// eslint-disable-next-line @typescript-eslint/naming-convention
54+
async putAssets<K extends string>(name: string, _version: number, template: TemplateBuilder<K>) {
4655
const modules = join(assetsStack, 'svelte', 'modules')
4756
const src = join(name, 'src')
4857

@@ -54,6 +63,15 @@ export class SvelteBuilder implements AppBuilder {
5463
recursive: true,
5564
overwrite: true
5665
})
66+
67+
const fileTemplate = new FileTemplate(template)
68+
69+
await fileTemplate.apply([
70+
join(src, 'customization', 'CustomConnection.svelte'),
71+
join(src, 'customization', 'CustomNode.svelte'),
72+
join(src, 'routes', '+layout.svelte'),
73+
join(src, 'routes', '+page.svelte')
74+
], false)
5775
}
5876

5977
async putScript(name: string, path: string, code: string) {

src/app/template-builder-helpers.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import fs from 'fs'
2+
3+
import { TemplateBuilder } from './template-builder'
4+
5+
export class FileTemplate<K extends string> {
6+
constructor(private readonly template: TemplateBuilder<K>) {}
7+
8+
async apply(modules: string[], format = true) {
9+
for (const module of modules) {
10+
const file = await fs.promises.readFile(module, { encoding: 'utf-8' })
11+
12+
await fs.promises.writeFile(module, await this.template.build(file, format))
13+
}
14+
}
15+
}

src/app/template-builder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import prettier from 'prettier'
55

66
import { assets as assetsRoot } from '../consts'
77
import { AngularVersion } from './stack/angular'
8+
import { SvelteVersion } from './stack/svelte'
89

910
export const templatesPath = join(assetsRoot, 'app', 'templates')
1011
export const entryScriptPath = join(assetsRoot, 'app', 'entry_ts')
1112
export type DefaultTemplateKey = 'zoom-at' | 'react-render' | 'react18' | 'vue-render'
1213
| `vue${2 | 3}` | 'angular-render' | `angular${AngularVersion}`
13-
| 'svelte-render' | `svelte${3 | 4}` | 'lit-render' | `lit${3}`
14+
| 'svelte-render' | `svelte${SvelteVersion}` | 'lit-render' | `lit${3}`
1415
| 'dataflow' | 'arrange' | 'sizes' | 'readonly' | 'order-nodes' | 'selectable'
1516
| 'context-menu' | 'import-area-extensions' | 'minimap' | 'reroute' | `stack-${string}`
1617

0 commit comments

Comments
 (0)