Skip to content

Commit 6fc698a

Browse files
committed
refactor: replace zimmerframe+walk with regex test in preprocessor
1 parent 01b71e7 commit 6fc698a

File tree

3 files changed

+45
-35
lines changed

3 files changed

+45
-35
lines changed

packages/vite-plugin-svelte/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@
4646
"deepmerge": "^4.3.1",
4747
"kleur": "^4.1.5",
4848
"magic-string": "^0.30.17",
49-
"vitefu": "^1.0.6",
50-
"zimmerframe": "^1.1.2"
49+
"vitefu": "^1.0.6"
5150
},
5251
"peerDependencies": {
5352
"svelte": "^5.0.0",

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

+29-33
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as svelte from 'svelte/compiler';
22
import { safeBase64Hash } from './hash.js';
33
import { log } from './log.js';
4-
import { walk } from 'zimmerframe';
54

65
import {
76
checkPreprocessDependencies,
@@ -69,18 +68,31 @@ export function createCompileSvelte() {
6968
}
7069

7170
let preprocessed;
72-
let preprocessors = options.preprocess;
71+
let hasUnscopedGlobalCss = false;
72+
const preprocessors = options.preprocess
73+
? Array.isArray(options.preprocess)
74+
? [...options.preprocess]
75+
: [options.preprocess]
76+
: [];
77+
7378
if (!options.isBuild && options.emitCss && compileOptions.hmr) {
7479
// inject preprocessor that ensures css hmr works better
75-
if (!Array.isArray(preprocessors)) {
76-
preprocessors = preprocessors
77-
? [preprocessors, devStylePreprocessor]
78-
: [devStylePreprocessor];
79-
} else {
80-
preprocessors = preprocessors.concat(devStylePreprocessor);
81-
}
80+
preprocessors.push(devStylePreprocessor);
81+
}
82+
83+
if (options.emitCss) {
84+
// check if css has unscoped global rules
85+
// This is later used to decide if css output can be scoped to the js module for treeshaking
86+
preprocessors.push({
87+
name: 'test-has-global-style',
88+
style({ content }) {
89+
hasUnscopedGlobalCss =
90+
content?.length > 0 && /(?:^|,)\s*(?::global[\s{(]|@keyframes -global-)/m.test(content);
91+
}
92+
});
8293
}
83-
if (preprocessors) {
94+
95+
if (preprocessors.length > 0) {
8496
try {
8597
preprocessed = await svelte.preprocess(code, preprocessors, { filename }); // full filename here so postcss works
8698
} catch (e) {
@@ -134,29 +146,13 @@ export function createCompileSvelte() {
134146
try {
135147
compiled = svelte.compile(finalCode, { ...finalCompileOptions, filename });
136148

137-
// check if css has unscoped :global.
138-
// This is later used to decide if css output can be scoped to the js module for treeshaking
139-
if (compiled.css && compiled.ast.css && finalCode.includes(':global')) {
140-
walk(
141-
compiled.ast.css,
142-
{},
143-
{
144-
Selector(node, { stop }) {
145-
if (
146-
node.children?.[0].type === 'PseudoClassSelector' &&
147-
node.children[0].name === 'global'
148-
) {
149-
Object.defineProperty(compiled.css, '__meta', {
150-
value: { hasUnscopedGlobalCss: true },
151-
writable: false,
152-
enumerable: false,
153-
configurable: false
154-
});
155-
stop();
156-
}
157-
}
158-
}
159-
);
149+
if (compiled.css && hasUnscopedGlobalCss) {
150+
Object.defineProperty(compiled.css, '__meta', {
151+
value: { hasUnscopedGlobalCss },
152+
writable: false,
153+
enumerable: false,
154+
configurable: false
155+
});
160156
}
161157

162158
// patch output with partial accept until svelte does it

pnpm-lock.yaml

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)