@sveltejs/vite-plugin-svelte 1.0.0-next.40 → 1.0.0-next.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +69 -92
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +59 -75
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +8 -2
- package/src/utils/esbuild.ts +3 -26
- package/src/utils/optimizer.ts +17 -22
- package/src/utils/options.ts +16 -7
- package/src/utils/preprocess.ts +6 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sveltejs/vite-plugin-svelte",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.41",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "dominikg",
|
|
6
6
|
"files": [
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"homepage": "https://github.com/sveltejs/vite-plugin-svelte#readme",
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@rollup/pluginutils": "^4.2.0",
|
|
44
|
-
"debug": "^4.3.
|
|
44
|
+
"debug": "^4.3.4",
|
|
45
45
|
"kleur": "^4.1.4",
|
|
46
46
|
"magic-string": "^0.26.1",
|
|
47
47
|
"svelte-hmr": "^0.14.11"
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"diff-match-patch": "^1.0.5",
|
|
51
51
|
"svelte": "^3.44.0",
|
|
52
|
-
"vite": "^2.
|
|
52
|
+
"vite": "^2.9.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependenciesMeta": {
|
|
55
55
|
"diff-match-patch": {
|
|
@@ -60,11 +60,11 @@
|
|
|
60
60
|
"@types/debug": "^4.1.7",
|
|
61
61
|
"@types/diff-match-patch": "^1.0.32",
|
|
62
62
|
"diff-match-patch": "^1.0.5",
|
|
63
|
-
"esbuild": "^0.14.
|
|
63
|
+
"esbuild": "^0.14.31",
|
|
64
64
|
"rollup": "^2.70.1",
|
|
65
|
-
"svelte": "^3.46.
|
|
66
|
-
"tsup": "^5.12.
|
|
67
|
-
"vite": "^2.
|
|
65
|
+
"svelte": "^3.46.6",
|
|
66
|
+
"tsup": "^5.12.4",
|
|
67
|
+
"vite": "^2.9.1"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"dev": "pnpm run build:ci -- --sourcemap --watch src",
|
package/src/index.ts
CHANGED
|
@@ -19,7 +19,7 @@ import { ensureWatchedFile, setupWatchers } from './utils/watch';
|
|
|
19
19
|
import { resolveViaPackageJsonSvelte } from './utils/resolve';
|
|
20
20
|
import { PartialResolvedId } from 'rollup';
|
|
21
21
|
import { toRollupError } from './utils/error';
|
|
22
|
-
import {
|
|
22
|
+
import { saveSvelteMetadata } from './utils/optimizer';
|
|
23
23
|
|
|
24
24
|
export function svelte(inlineOptions?: Partial<Options>): Plugin {
|
|
25
25
|
if (process.env.DEBUG != null) {
|
|
@@ -70,7 +70,13 @@ export function svelte(inlineOptions?: Partial<Options>): Plugin {
|
|
|
70
70
|
},
|
|
71
71
|
|
|
72
72
|
async buildStart() {
|
|
73
|
-
|
|
73
|
+
if (!options.experimental.prebundleSvelteLibraries) return;
|
|
74
|
+
const isSvelteMetadataChanged = await saveSvelteMetadata(viteConfig.cacheDir, options);
|
|
75
|
+
if (isSvelteMetadataChanged) {
|
|
76
|
+
// Force Vite to optimize again. Although we mutate the config here, it works because
|
|
77
|
+
// Vite's optimizer runs after `buildStart()`.
|
|
78
|
+
viteConfig.server.force = true;
|
|
79
|
+
}
|
|
74
80
|
},
|
|
75
81
|
|
|
76
82
|
configureServer(server) {
|
package/src/utils/esbuild.ts
CHANGED
|
@@ -8,7 +8,6 @@ import { toESBuildError } from './error';
|
|
|
8
8
|
|
|
9
9
|
type EsbuildOptions = NonNullable<DepOptimizationOptions['esbuildOptions']>;
|
|
10
10
|
type EsbuildPlugin = NonNullable<EsbuildOptions['plugins']>[number];
|
|
11
|
-
type EsbuildPluginBuild = Parameters<EsbuildPlugin['setup']>[0];
|
|
12
11
|
|
|
13
12
|
export const facadeEsbuildSveltePluginName = 'vite-plugin-svelte:facade';
|
|
14
13
|
|
|
@@ -16,7 +15,9 @@ export function esbuildSveltePlugin(options: ResolvedOptions): EsbuildPlugin {
|
|
|
16
15
|
return {
|
|
17
16
|
name: 'vite-plugin-svelte:optimize-svelte',
|
|
18
17
|
setup(build) {
|
|
19
|
-
|
|
18
|
+
// Skip in scanning phase as Vite already handles scanning Svelte files.
|
|
19
|
+
// Otherwise this would heavily slow down the scanning phase.
|
|
20
|
+
if (build.initialOptions.plugins?.some((v) => v.name === 'vite:dep-scan')) return;
|
|
20
21
|
|
|
21
22
|
const svelteExtensions = (options.extensions ?? ['.svelte']).map((ext) => ext.slice(1));
|
|
22
23
|
const svelteFilter = new RegExp(`\\.(` + svelteExtensions.join('|') + `)(\\?.*)?$`);
|
|
@@ -34,30 +35,6 @@ export function esbuildSveltePlugin(options: ResolvedOptions): EsbuildPlugin {
|
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
function disableVitePrebundleSvelte(build: EsbuildPluginBuild) {
|
|
38
|
-
const viteDepPrebundlePlugin = build.initialOptions.plugins?.find(
|
|
39
|
-
(v) => v.name === 'vite:dep-pre-bundle'
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
if (!viteDepPrebundlePlugin) return;
|
|
43
|
-
|
|
44
|
-
// Prevent vite:dep-pre-bundle from externalizing svelte files
|
|
45
|
-
const _setup = viteDepPrebundlePlugin.setup.bind(viteDepPrebundlePlugin);
|
|
46
|
-
viteDepPrebundlePlugin.setup = function (build) {
|
|
47
|
-
const _onResolve = build.onResolve.bind(build);
|
|
48
|
-
build.onResolve = function (options, callback) {
|
|
49
|
-
if (options.filter.source.includes('svelte')) {
|
|
50
|
-
options.filter = new RegExp(
|
|
51
|
-
options.filter.source.replace('|svelte', ''),
|
|
52
|
-
options.filter.flags
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
return _onResolve(options, callback);
|
|
56
|
-
};
|
|
57
|
-
return _setup(build);
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
38
|
async function compileSvelte(
|
|
62
39
|
options: ResolvedOptions,
|
|
63
40
|
{ filename, code }: { filename: string; code: string }
|
package/src/utils/optimizer.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import { optimizeDeps, ResolvedConfig } from 'vite';
|
|
4
3
|
import { ResolvedOptions } from './options';
|
|
5
4
|
|
|
6
5
|
// List of options that changes the prebundling result
|
|
@@ -13,24 +12,28 @@ const PREBUNDLE_SENSITIVE_OPTIONS: (keyof ResolvedOptions)[] = [
|
|
|
13
12
|
'preprocess'
|
|
14
13
|
];
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @returns Whether the Svelte metadata has changed
|
|
17
|
+
*/
|
|
18
|
+
export async function saveSvelteMetadata(cacheDir: string, options: ResolvedOptions) {
|
|
19
|
+
const svelteMetadata = generateSvelteMetadata(options);
|
|
20
|
+
const svelteMetadataPath = path.resolve(cacheDir, '_svelte_metadata.json');
|
|
18
21
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const svelteMetadataPath = path.resolve(viteMetadataPath, '../_svelte_metadata.json');
|
|
23
|
-
const currentSvelteMetadata = JSON.stringify(generateSvelteMetadata(options), (_, value) => {
|
|
22
|
+
const currentSvelteMetadata = JSON.stringify(svelteMetadata, (_, value) => {
|
|
23
|
+
// Handle preprocessors
|
|
24
24
|
return typeof value === 'function' ? value.toString() : value;
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
let existingSvelteMetadata: string | undefined;
|
|
28
|
+
try {
|
|
29
|
+
existingSvelteMetadata = await fs.readFile(svelteMetadataPath, 'utf8');
|
|
30
|
+
} catch {
|
|
31
|
+
// ignore
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
await
|
|
33
|
-
fs.
|
|
34
|
+
await fs.mkdir(cacheDir, { recursive: true });
|
|
35
|
+
await fs.writeFile(svelteMetadataPath, currentSvelteMetadata);
|
|
36
|
+
return currentSvelteMetadata !== existingSvelteMetadata;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
function generateSvelteMetadata(options: ResolvedOptions) {
|
|
@@ -40,11 +43,3 @@ function generateSvelteMetadata(options: ResolvedOptions) {
|
|
|
40
43
|
}
|
|
41
44
|
return metadata;
|
|
42
45
|
}
|
|
43
|
-
|
|
44
|
-
function findViteMetadataPath(cacheDir: string) {
|
|
45
|
-
const metadataPaths = ['_metadata.json', 'deps/_metadata.json'];
|
|
46
|
-
for (const metadataPath of metadataPaths) {
|
|
47
|
-
const viteMetadataPath = path.resolve(cacheDir, metadataPath);
|
|
48
|
-
if (fs.existsSync(viteMetadataPath)) return viteMetadataPath;
|
|
49
|
-
}
|
|
50
|
-
}
|
package/src/utils/options.ts
CHANGED
|
@@ -207,6 +207,21 @@ export function buildExtraViteConfig(
|
|
|
207
207
|
);
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
+
if (options.experimental.prebundleSvelteLibraries) {
|
|
211
|
+
extraViteConfig.optimizeDeps = {
|
|
212
|
+
...extraViteConfig.optimizeDeps,
|
|
213
|
+
// Experimental Vite API to allow these extensions to be scanned and prebundled
|
|
214
|
+
// @ts-ignore
|
|
215
|
+
extensions: options.extensions ?? ['.svelte'],
|
|
216
|
+
// Add esbuild plugin to prebundle Svelte files.
|
|
217
|
+
// Currently a placeholder as more information is needed after Vite config is resolved,
|
|
218
|
+
// the real Svelte plugin is added in `patchResolvedViteConfig()`
|
|
219
|
+
esbuildOptions: {
|
|
220
|
+
plugins: [{ name: facadeEsbuildSveltePluginName, setup: () => {} }]
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
210
225
|
// @ts-ignore
|
|
211
226
|
extraViteConfig.ssr = buildSSROptionsForSvelte(svelteDeps, options, config, extraViteConfig);
|
|
212
227
|
|
|
@@ -242,13 +257,7 @@ function buildOptimizeDepsForSvelte(
|
|
|
242
257
|
|
|
243
258
|
// If we prebundle svelte libraries, we can skip the whole prebundling dance below
|
|
244
259
|
if (options.experimental.prebundleSvelteLibraries) {
|
|
245
|
-
return {
|
|
246
|
-
include,
|
|
247
|
-
exclude,
|
|
248
|
-
esbuildOptions: {
|
|
249
|
-
plugins: [{ name: facadeEsbuildSveltePluginName, setup: () => {} }]
|
|
250
|
-
}
|
|
251
|
-
};
|
|
260
|
+
return { include, exclude };
|
|
252
261
|
}
|
|
253
262
|
|
|
254
263
|
// only svelte component libraries needs to be processed for optimizeDeps, js libraries work fine
|
package/src/utils/preprocess.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { Preprocessor, PreprocessorGroup, Processed, ResolvedOptions } from './o
|
|
|
11
11
|
import { TransformPluginContext } from 'rollup';
|
|
12
12
|
import { log } from './log';
|
|
13
13
|
import { buildSourceMap } from './sourcemap';
|
|
14
|
+
import path from 'path';
|
|
14
15
|
|
|
15
16
|
const supportedStyleLangs = ['css', 'less', 'sass', 'scss', 'styl', 'stylus', 'postcss'];
|
|
16
17
|
|
|
@@ -57,7 +58,7 @@ function createViteStylePreprocessor(config: ResolvedConfig): Preprocessor {
|
|
|
57
58
|
)) as TransformResult;
|
|
58
59
|
// patch sourcemap source to point back to original filename
|
|
59
60
|
if (transformResult.map?.sources?.[0] === moduleId) {
|
|
60
|
-
transformResult.map.sources[0] = filename;
|
|
61
|
+
transformResult.map.sources[0] = path.basename(filename);
|
|
61
62
|
}
|
|
62
63
|
return {
|
|
63
64
|
code: transformResult.code,
|
|
@@ -94,7 +95,10 @@ function createInjectScopeEverythingRulePreprocessorGroup(): PreprocessorGroup {
|
|
|
94
95
|
s.append(' *{}');
|
|
95
96
|
return {
|
|
96
97
|
code: s.toString(),
|
|
97
|
-
map: s.generateDecodedMap({
|
|
98
|
+
map: s.generateDecodedMap({
|
|
99
|
+
source: filename ? path.basename(filename) : undefined,
|
|
100
|
+
hires: true
|
|
101
|
+
})
|
|
98
102
|
};
|
|
99
103
|
}
|
|
100
104
|
};
|