Skip to content

Commit 40332ca

Browse files
Merge pull request #283 from mcous/svelte-5-modules
feat(svelte5): add support for Svelte 5 modules
2 parents 96ee087 + 250441a commit 40332ca

File tree

3 files changed

+31
-11
lines changed

3 files changed

+31
-11
lines changed

e2e/svelte-5/src/module.test.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import { test } from '@jest/globals'
22

3-
// TODO(mcous, 2024-05-23): this import fails
4-
// See https://github.com/svelteness/svelte-jester/pull/283
5-
// import * as Subject from "./module.svelte.js";
6-
const Subject = {}
3+
import * as Subject from './module.svelte.js'
74

8-
test.skip('get current count', () => {
5+
test('get current count', () => {
96
const subject = Subject.createCounter()
107
const result = subject.count
118

129
expect(result).toBe(0)
1310
})
1411

15-
test.skip('increment', () => {
12+
test('increment', () => {
1613
const subject = Subject.createCounter()
1714

1815
subject.increment()

src/transformer.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { execSync } from 'child_process'
22
import { basename, extname } from 'path'
33
import { pathToFileURL } from 'url'
4-
import { compile, preprocess as sveltePreprocess } from 'svelte/compiler'
4+
import * as SvelteCompiler from 'svelte/compiler'
55

66
import { getSvelteConfig } from './svelteconfig.js'
7-
import { dynamicImport, IS_COMMON_JS, isSvelte3 } from './utils.js'
7+
import { dynamicImport, IS_COMMON_JS, isSvelte3, isSvelteModule } from './utils.js'
88

99
const currentFileExtension = (global.__dirname !== undefined ? extname(__filename) : extname(pathToFileURL(import.meta.url).toString())).replace('.', '')
1010

@@ -29,7 +29,7 @@ const processAsync = async (source, filename, jestOptions) => {
2929

3030
const svelteConfigPath = getSvelteConfig(rootMode, filename, preprocess)
3131
const svelteConfig = await dynamicImport(svelteConfigPath)
32-
const processed = await sveltePreprocess(
32+
const processed = await SvelteCompiler.preprocess(
3333
source,
3434
svelteConfig.default.preprocess || {},
3535
{ filename }
@@ -91,6 +91,8 @@ const compiler = (format, options = {}, filename, processedCode, processedMap) =
9191
opts.format = format
9292
}
9393

94+
const compile = isSvelteModule(filename) ? compileModule : compileComponent
95+
9496
let result
9597
try {
9698
result = compile(processedCode, opts)
@@ -115,6 +117,18 @@ const compiler = (format, options = {}, filename, processedCode, processedMap) =
115117
}
116118
}
117119

120+
const compileComponent = (processedCode, opts) => {
121+
return SvelteCompiler.compile(processedCode, opts)
122+
}
123+
124+
const compileModule = (processedCode, opts) => {
125+
return SvelteCompiler.compileModule(processedCode, {
126+
filename: opts.filename,
127+
dev: opts.dev,
128+
generate: opts.ssr ? 'server' : 'client'
129+
})
130+
}
131+
118132
export default {
119133
process: processSync,
120134
processAsync

src/utils.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import { pathToFileURL } from 'url'
2-
import { VERSION } from 'svelte/compiler'
2+
import * as SvelteCompiler from 'svelte/compiler'
33

44
export const dynamicImport = async (filename) => import(pathToFileURL(filename).toString())
55

66
export const IS_COMMON_JS = typeof module !== 'undefined'
77

8-
export const isSvelte3 = (version = VERSION) => version.startsWith('3')
8+
export const isSvelte3 = (version = SvelteCompiler.VERSION) => version.startsWith('3')
9+
10+
const DEFAULT_SVELTE_MODULE_INFIX = ['.svelte.']
11+
12+
const DEFAULT_SVELTE_MODULE_EXT = ['.js', '.ts']
13+
14+
export const isSvelteModule = (filename) =>
15+
typeof SvelteCompiler.compileModule === 'function' &&
16+
DEFAULT_SVELTE_MODULE_INFIX.some((infix) => filename.includes(infix)) &&
17+
DEFAULT_SVELTE_MODULE_EXT.some((ext) => filename.endsWith(ext))

0 commit comments

Comments
 (0)