Skip to content

Commit 8368444

Browse files
committed
feat(vite-plugin-svelte): support esm in svelte.config.js (see #29)
1 parent a2acab9 commit 8368444

File tree

6 files changed

+39
-27
lines changed

6 files changed

+39
-27
lines changed

.changeset/blue-schools-bake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': patch
3+
---
4+
5+
Feature: Support esm in svelte.config.js

packages/vite-plugin-svelte/src/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,10 @@ export default function vitePluginSvelte(inlineOptions?: Partial<Options>): Plug
9191
return extraViteConfig as Partial<UserConfig>;
9292
},
9393

94-
configResolved(config) {
95-
options = resolveOptions(inlineOptions, config);
94+
async configResolved(config) {
95+
options = await resolveOptions(inlineOptions, config);
9696
requestParser = buildIdParser(options);
97-
// init compiler
98-
compileSvelte = createCompileSvelte(options, config);
97+
compileSvelte = createCompileSvelte(options);
9998
},
10099

101100
configureServer(server) {

packages/vite-plugin-svelte/src/utils/compile.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import { CompileOptions, PreprocessorGroup, ResolvedOptions } from './options';
1+
import { CompileOptions, ResolvedOptions } from './options';
22
import { compile, preprocess, walk } from 'svelte/compiler';
33
// @ts-ignore
44
import { createMakeHot } from 'svelte-hmr';
55
import { SvelteRequest } from './id';
66
import { safeBase64Hash } from './hash';
77
import { log } from './log';
8-
import { ResolvedConfig } from 'vite';
9-
import { buildExtraPreprocessors } from './preprocess';
108

11-
const _createCompileSvelte = (makeHot: Function, extraPreprocessors: PreprocessorGroup[]) =>
9+
const _createCompileSvelte = (makeHot: Function) =>
1210
async function compileSvelte(
1311
svelteRequest: SvelteRequest,
1412
code: string,
@@ -31,17 +29,9 @@ const _createCompileSvelte = (makeHot: Function, extraPreprocessors: Preprocesso
3129
}
3230

3331
let preprocessed;
34-
const preprocessors = [];
32+
3533
if (options.preprocess) {
36-
if (Array.isArray(options.preprocess)) {
37-
preprocessors.push(...options.preprocess);
38-
} else {
39-
preprocessors.push(options.preprocess);
40-
}
41-
}
42-
preprocessors.push(...(extraPreprocessors || []));
43-
if (preprocessors.length > 0) {
44-
preprocessed = await preprocess(code, preprocessors, { filename });
34+
preprocessed = await preprocess(code, options.preprocess, { filename });
4535
if (preprocessed.dependencies) dependencies.push(...preprocessed.dependencies);
4636
if (preprocessed.map) finalCompilerOptions.sourcemap = preprocessed.map;
4737
}
@@ -97,10 +87,9 @@ function buildMakeHot(options: ResolvedOptions) {
9787
}
9888
}
9989

100-
export function createCompileSvelte(options: ResolvedOptions, config: ResolvedConfig) {
90+
export function createCompileSvelte(options: ResolvedOptions) {
10191
const makeHot = buildMakeHot(options);
102-
const extraPreprocessors = buildExtraPreprocessors(options, config);
103-
return _createCompileSvelte(makeHot, extraPreprocessors);
92+
return _createCompileSvelte(makeHot);
10493
}
10594

10695
export interface Code {

packages/vite-plugin-svelte/src/utils/loadSvelteConfig.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { log } from './log';
44

55
const knownSvelteConfigNames = ['svelte.config.js', 'svelte.config.cjs'];
66

7-
export function loadSvelteConfig(root: string = process.cwd()) {
7+
// hide dynamic import from ts transform to prevent it turning into a require
8+
// see https://github.com/microsoft/TypeScript/issues/43329#issuecomment-811606238
9+
const dynamicImportDefault = new Function('path', 'return import(path).then(m => m.default)');
10+
11+
export async function loadSvelteConfig(root: string = process.cwd()) {
812
const foundConfigs = knownSvelteConfigNames
913
.map((candidate) => path.resolve(root, candidate))
1014
.filter((file) => fs.existsSync(file));
@@ -18,7 +22,7 @@ export function loadSvelteConfig(root: string = process.cwd()) {
1822
);
1923
}
2024
try {
21-
const config = require(foundConfigs[0]);
25+
const config = await dynamicImportDefault(foundConfigs[0]);
2226
log.debug(`loaded svelte config ${foundConfigs[0]}`, config);
2327
return config;
2428
} catch (e) {

packages/vite-plugin-svelte/src/utils/options.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { ResolvedConfig, ViteDevServer } from 'vite';
33
import { log } from './log';
44
import { loadSvelteConfig } from './loadSvelteConfig';
5+
import { addExtraPreprocessors } from './preprocess';
56

67
const knownOptions = new Set([
78
'include',
@@ -116,19 +117,20 @@ function mergeOptions(
116117
};
117118
}
118119

119-
export function resolveOptions(
120+
export async function resolveOptions(
120121
inlineOptions: Partial<Options> = {},
121122
viteConfig: ResolvedConfig
122-
): ResolvedOptions {
123+
): Promise<ResolvedOptions> {
123124
const defaultOptions = buildDefaultOptions(viteConfig, inlineOptions);
124125
// TODO always load from vite root dir or make this configurable?
125-
const svelteConfig = loadSvelteConfig(viteConfig.root) || {};
126+
const svelteConfig = (await loadSvelteConfig(viteConfig.root)) || {};
126127
const resolvedOptions = mergeOptions(defaultOptions, svelteConfig, inlineOptions, viteConfig);
127128

128129
enforceOptionsForProduction(resolvedOptions);
129130

130131
enforceOptionsForHmr(resolvedOptions);
131132

133+
addExtraPreprocessors(resolvedOptions, viteConfig);
132134
log.debug('resolved options', resolvedOptions);
133135
return resolvedOptions;
134136
}

packages/vite-plugin-svelte/src/utils/preprocess.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function createInjectScopeEverythingRulePreprocessorGroup(): PreprocessorGroup {
7474
};
7575
}
7676

77-
export function buildExtraPreprocessors(options: ResolvedOptions, config: ResolvedConfig) {
77+
function buildExtraPreprocessors(options: ResolvedOptions, config: ResolvedConfig) {
7878
const extraPreprocessors = [];
7979
if (options.useVitePreprocess) {
8080
log.debug('adding vite preprocessor');
@@ -99,3 +99,16 @@ export function buildExtraPreprocessors(options: ResolvedOptions, config: Resolv
9999

100100
return extraPreprocessors;
101101
}
102+
103+
export function addExtraPreprocessors(options: ResolvedOptions, config: ResolvedConfig) {
104+
const extra = buildExtraPreprocessors(options, config);
105+
if (extra?.length > 0) {
106+
if (!options.preprocess) {
107+
options.preprocess = extra;
108+
} else if (Array.isArray(options.preprocess)) {
109+
options.preprocess.push(...extra);
110+
} else {
111+
options.preprocess = [options.preprocess, ...extra];
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)