@parcel/transformer-css 2.4.0 → 2.4.1
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/lib/CSSTransformer.js +33 -49
- package/package.json +7 -7
- package/src/CSSTransformer.js +32 -47
package/lib/CSSTransformer.js
CHANGED
|
@@ -107,6 +107,18 @@ var _default = new (_plugin().Transformer)({
|
|
|
107
107
|
config,
|
|
108
108
|
options
|
|
109
109
|
}) {
|
|
110
|
+
// Normalize the asset's environment so that properties that only affect JS don't cause CSS to be duplicated.
|
|
111
|
+
// For example, with ESModule and CommonJS targets, only a single shared CSS bundle should be produced.
|
|
112
|
+
let env = asset.env;
|
|
113
|
+
asset.setEnvironment({
|
|
114
|
+
context: 'browser',
|
|
115
|
+
engines: {
|
|
116
|
+
browsers: asset.env.engines.browsers
|
|
117
|
+
},
|
|
118
|
+
shouldOptimize: asset.env.shouldOptimize,
|
|
119
|
+
shouldScopeHoist: asset.env.shouldScopeHoist,
|
|
120
|
+
sourceMap: asset.env.sourceMap
|
|
121
|
+
});
|
|
110
122
|
let [code, originalMap] = await Promise.all([asset.getBuffer(), asset.getMap()]);
|
|
111
123
|
let targets = getTargets(asset.env.engines.browsers);
|
|
112
124
|
let res;
|
|
@@ -124,7 +136,7 @@ var _default = new (_plugin().Transformer)({
|
|
|
124
136
|
res = (0, _css().transform)({
|
|
125
137
|
filename: _path().default.relative(options.projectRoot, asset.filePath),
|
|
126
138
|
code,
|
|
127
|
-
cssModules: (_config$cssModules = config === null || config === void 0 ? void 0 : config.cssModules) !== null && _config$cssModules !== void 0 ? _config$cssModules : asset.meta.cssModulesCompiled
|
|
139
|
+
cssModules: (_config$cssModules = config === null || config === void 0 ? void 0 : config.cssModules) !== null && _config$cssModules !== void 0 ? _config$cssModules : asset.meta.cssModulesCompiled == null && /\.module\./.test(asset.filePath),
|
|
128
140
|
analyzeDependencies: asset.meta.hasDependencies !== false,
|
|
129
141
|
sourceMap: !!asset.env.sourceMap,
|
|
130
142
|
drafts: config === null || config === void 0 ? void 0 : config.drafts,
|
|
@@ -173,7 +185,7 @@ var _default = new (_plugin().Transformer)({
|
|
|
173
185
|
loc = (0, _utils().remapSourceLocation)(loc, originalMap);
|
|
174
186
|
}
|
|
175
187
|
|
|
176
|
-
if (dep.type === 'import') {
|
|
188
|
+
if (dep.type === 'import' && !res.exports) {
|
|
177
189
|
asset.addDependency({
|
|
178
190
|
specifier: dep.url,
|
|
179
191
|
specifierType: 'url',
|
|
@@ -182,12 +194,7 @@ var _default = new (_plugin().Transformer)({
|
|
|
182
194
|
// For the glob resolver to distinguish between `@import` and other URL dependencies.
|
|
183
195
|
isCSSImport: true,
|
|
184
196
|
media: dep.media
|
|
185
|
-
}
|
|
186
|
-
symbols: new Map([['*', {
|
|
187
|
-
local: '*',
|
|
188
|
-
isWeak: true,
|
|
189
|
-
loc
|
|
190
|
-
}]])
|
|
197
|
+
}
|
|
191
198
|
});
|
|
192
199
|
} else if (dep.type === 'url') {
|
|
193
200
|
asset.addURLDependency(dep.url, {
|
|
@@ -207,7 +214,6 @@ var _default = new (_plugin().Transformer)({
|
|
|
207
214
|
asset.symbols.ensure();
|
|
208
215
|
asset.symbols.set('default', 'default');
|
|
209
216
|
let dependencies = new Map();
|
|
210
|
-
let selfReferences = new Set();
|
|
211
217
|
let locals = new Map();
|
|
212
218
|
let c = 0;
|
|
213
219
|
let depjs = '';
|
|
@@ -228,10 +234,6 @@ var _default = new (_plugin().Transformer)({
|
|
|
228
234
|
let e = exports[key];
|
|
229
235
|
let s = `module.exports[${JSON.stringify(key)}] = \`${e.name}`;
|
|
230
236
|
|
|
231
|
-
if (e.isReferenced) {
|
|
232
|
-
selfReferences.add(e.name);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
237
|
for (let ref of e.composes) {
|
|
236
238
|
s += ' ';
|
|
237
239
|
|
|
@@ -247,17 +249,19 @@ var _default = new (_plugin().Transformer)({
|
|
|
247
249
|
d = `dep_${c++}`;
|
|
248
250
|
depjs += `import * as ${d} from ${JSON.stringify(ref.specifier)};\n`;
|
|
249
251
|
dependencies.set(ref.specifier, d);
|
|
250
|
-
asset.addDependency({
|
|
251
|
-
specifier: ref.specifier,
|
|
252
|
-
specifierType: 'url'
|
|
253
|
-
});
|
|
254
252
|
}
|
|
255
253
|
|
|
256
254
|
s += '${' + `${d}[${JSON.stringify(ref.name)}]` + '}';
|
|
257
255
|
}
|
|
258
256
|
}
|
|
259
257
|
|
|
260
|
-
s += '`;\n';
|
|
258
|
+
s += '`;\n'; // If the export is referenced internally (e.g. used @keyframes), add a self-reference
|
|
259
|
+
// to the JS so the symbol is retained during tree-shaking.
|
|
260
|
+
|
|
261
|
+
if (e.isReferenced) {
|
|
262
|
+
s += `module.exports[${JSON.stringify(key)}];\n`;
|
|
263
|
+
}
|
|
264
|
+
|
|
261
265
|
js += s;
|
|
262
266
|
};
|
|
263
267
|
|
|
@@ -266,12 +270,15 @@ var _default = new (_plugin().Transformer)({
|
|
|
266
270
|
add(key);
|
|
267
271
|
}
|
|
268
272
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
273
|
+
if (res.dependencies) {
|
|
274
|
+
for (let dep of res.dependencies) {
|
|
275
|
+
if (dep.type === 'import') {
|
|
276
|
+
// TODO: Figure out how to treeshake this
|
|
277
|
+
let d = `dep_$${c++}`;
|
|
278
|
+
depjs += `import * as ${d} from ${JSON.stringify(dep.url)};\n`;
|
|
279
|
+
js += `for (let key in ${d}) { if (key in module.exports) module.exports[key] += ' ' + ${d}[key]; else module.exports[key] = ${d}[key]; }\n`;
|
|
280
|
+
asset.symbols.set('*', '*');
|
|
281
|
+
}
|
|
275
282
|
}
|
|
276
283
|
}
|
|
277
284
|
|
|
@@ -279,33 +286,10 @@ var _default = new (_plugin().Transformer)({
|
|
|
279
286
|
type: 'js',
|
|
280
287
|
content: depjs + js,
|
|
281
288
|
dependencies: [],
|
|
282
|
-
env
|
|
289
|
+
env
|
|
283
290
|
});
|
|
291
|
+
}
|
|
284
292
|
|
|
285
|
-
if (selfReferences.size > 0) {
|
|
286
|
-
asset.addDependency({
|
|
287
|
-
specifier: `./${_path().default.basename(asset.filePath)}`,
|
|
288
|
-
specifierType: 'url',
|
|
289
|
-
symbols: new Map([...locals].filter(([local]) => selfReferences.has(local)).map(([local, exported]) => [exported, {
|
|
290
|
-
local,
|
|
291
|
-
isWeak: false,
|
|
292
|
-
loc: null
|
|
293
|
-
}]))
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
} // Normalize the asset's environment so that properties that only affect JS don't cause CSS to be duplicated.
|
|
297
|
-
// For example, with ESModule and CommonJS targets, only a single shared CSS bundle should be produced.
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
asset.setEnvironment({
|
|
301
|
-
context: 'browser',
|
|
302
|
-
engines: {
|
|
303
|
-
browsers: asset.env.engines.browsers
|
|
304
|
-
},
|
|
305
|
-
shouldOptimize: asset.env.shouldOptimize,
|
|
306
|
-
shouldScopeHoist: asset.env.shouldScopeHoist,
|
|
307
|
-
sourceMap: asset.env.sourceMap
|
|
308
|
-
});
|
|
309
293
|
return assets;
|
|
310
294
|
}
|
|
311
295
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parcel/transformer-css",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
"source": "src/CSSTransformer.js",
|
|
18
18
|
"engines": {
|
|
19
19
|
"node": ">= 12.0.0",
|
|
20
|
-
"parcel": "^2.4.
|
|
20
|
+
"parcel": "^2.4.1"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@parcel/css": "^1.7.
|
|
24
|
-
"@parcel/diagnostic": "2.4.
|
|
25
|
-
"@parcel/plugin": "2.4.
|
|
23
|
+
"@parcel/css": "^1.7.4",
|
|
24
|
+
"@parcel/diagnostic": "2.4.1",
|
|
25
|
+
"@parcel/plugin": "2.4.1",
|
|
26
26
|
"@parcel/source-map": "^2.0.0",
|
|
27
|
-
"@parcel/utils": "2.4.
|
|
27
|
+
"@parcel/utils": "2.4.1",
|
|
28
28
|
"browserslist": "^4.6.6",
|
|
29
29
|
"nullthrows": "^1.1.1"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "80c728ceffdc0829eca568a6ec66c07e07a0b87b"
|
|
32
32
|
}
|
package/src/CSSTransformer.js
CHANGED
|
@@ -21,6 +21,19 @@ export default (new Transformer({
|
|
|
21
21
|
return conf?.contents;
|
|
22
22
|
},
|
|
23
23
|
async transform({asset, config, options}) {
|
|
24
|
+
// Normalize the asset's environment so that properties that only affect JS don't cause CSS to be duplicated.
|
|
25
|
+
// For example, with ESModule and CommonJS targets, only a single shared CSS bundle should be produced.
|
|
26
|
+
let env = asset.env;
|
|
27
|
+
asset.setEnvironment({
|
|
28
|
+
context: 'browser',
|
|
29
|
+
engines: {
|
|
30
|
+
browsers: asset.env.engines.browsers,
|
|
31
|
+
},
|
|
32
|
+
shouldOptimize: asset.env.shouldOptimize,
|
|
33
|
+
shouldScopeHoist: asset.env.shouldScopeHoist,
|
|
34
|
+
sourceMap: asset.env.sourceMap,
|
|
35
|
+
});
|
|
36
|
+
|
|
24
37
|
let [code, originalMap] = await Promise.all([
|
|
25
38
|
asset.getBuffer(),
|
|
26
39
|
asset.getMap(),
|
|
@@ -41,7 +54,7 @@ export default (new Transformer({
|
|
|
41
54
|
code,
|
|
42
55
|
cssModules:
|
|
43
56
|
config?.cssModules ??
|
|
44
|
-
(asset.meta.cssModulesCompiled
|
|
57
|
+
(asset.meta.cssModulesCompiled == null &&
|
|
45
58
|
/\.module\./.test(asset.filePath)),
|
|
46
59
|
analyzeDependencies: asset.meta.hasDependencies !== false,
|
|
47
60
|
sourceMap: !!asset.env.sourceMap,
|
|
@@ -94,7 +107,7 @@ export default (new Transformer({
|
|
|
94
107
|
loc = remapSourceLocation(loc, originalMap);
|
|
95
108
|
}
|
|
96
109
|
|
|
97
|
-
if (dep.type === 'import') {
|
|
110
|
+
if (dep.type === 'import' && !res.exports) {
|
|
98
111
|
asset.addDependency({
|
|
99
112
|
specifier: dep.url,
|
|
100
113
|
specifierType: 'url',
|
|
@@ -104,7 +117,6 @@ export default (new Transformer({
|
|
|
104
117
|
isCSSImport: true,
|
|
105
118
|
media: dep.media,
|
|
106
119
|
},
|
|
107
|
-
symbols: new Map([['*', {local: '*', isWeak: true, loc}]]),
|
|
108
120
|
});
|
|
109
121
|
} else if (dep.type === 'url') {
|
|
110
122
|
asset.addURLDependency(dep.url, {
|
|
@@ -125,7 +137,6 @@ export default (new Transformer({
|
|
|
125
137
|
asset.symbols.set('default', 'default');
|
|
126
138
|
|
|
127
139
|
let dependencies = new Map();
|
|
128
|
-
let selfReferences = new Set();
|
|
129
140
|
let locals = new Map();
|
|
130
141
|
let c = 0;
|
|
131
142
|
let depjs = '';
|
|
@@ -147,10 +158,6 @@ export default (new Transformer({
|
|
|
147
158
|
let e = exports[key];
|
|
148
159
|
let s = `module.exports[${JSON.stringify(key)}] = \`${e.name}`;
|
|
149
160
|
|
|
150
|
-
if (e.isReferenced) {
|
|
151
|
-
selfReferences.add(e.name);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
161
|
for (let ref of e.composes) {
|
|
155
162
|
s += ' ';
|
|
156
163
|
if (ref.type === 'local') {
|
|
@@ -171,17 +178,19 @@ export default (new Transformer({
|
|
|
171
178
|
ref.specifier,
|
|
172
179
|
)};\n`;
|
|
173
180
|
dependencies.set(ref.specifier, d);
|
|
174
|
-
|
|
175
|
-
asset.addDependency({
|
|
176
|
-
specifier: ref.specifier,
|
|
177
|
-
specifierType: 'url',
|
|
178
|
-
});
|
|
179
181
|
}
|
|
180
182
|
s += '${' + `${d}[${JSON.stringify(ref.name)}]` + '}';
|
|
181
183
|
}
|
|
182
184
|
}
|
|
183
185
|
|
|
184
186
|
s += '`;\n';
|
|
187
|
+
|
|
188
|
+
// If the export is referenced internally (e.g. used @keyframes), add a self-reference
|
|
189
|
+
// to the JS so the symbol is retained during tree-shaking.
|
|
190
|
+
if (e.isReferenced) {
|
|
191
|
+
s += `module.exports[${JSON.stringify(key)}];\n`;
|
|
192
|
+
}
|
|
193
|
+
|
|
185
194
|
js += s;
|
|
186
195
|
};
|
|
187
196
|
|
|
@@ -190,12 +199,15 @@ export default (new Transformer({
|
|
|
190
199
|
add(key);
|
|
191
200
|
}
|
|
192
201
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
202
|
+
if (res.dependencies) {
|
|
203
|
+
for (let dep of res.dependencies) {
|
|
204
|
+
if (dep.type === 'import') {
|
|
205
|
+
// TODO: Figure out how to treeshake this
|
|
206
|
+
let d = `dep_$${c++}`;
|
|
207
|
+
depjs += `import * as ${d} from ${JSON.stringify(dep.url)};\n`;
|
|
208
|
+
js += `for (let key in ${d}) { if (key in module.exports) module.exports[key] += ' ' + ${d}[key]; else module.exports[key] = ${d}[key]; }\n`;
|
|
209
|
+
asset.symbols.set('*', '*');
|
|
210
|
+
}
|
|
199
211
|
}
|
|
200
212
|
}
|
|
201
213
|
|
|
@@ -203,37 +215,10 @@ export default (new Transformer({
|
|
|
203
215
|
type: 'js',
|
|
204
216
|
content: depjs + js,
|
|
205
217
|
dependencies: jsDeps,
|
|
206
|
-
env
|
|
218
|
+
env,
|
|
207
219
|
});
|
|
208
|
-
|
|
209
|
-
if (selfReferences.size > 0) {
|
|
210
|
-
asset.addDependency({
|
|
211
|
-
specifier: `./${path.basename(asset.filePath)}`,
|
|
212
|
-
specifierType: 'url',
|
|
213
|
-
symbols: new Map(
|
|
214
|
-
[...locals]
|
|
215
|
-
.filter(([local]) => selfReferences.has(local))
|
|
216
|
-
.map(([local, exported]) => [
|
|
217
|
-
exported,
|
|
218
|
-
{local, isWeak: false, loc: null},
|
|
219
|
-
]),
|
|
220
|
-
),
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
220
|
}
|
|
224
221
|
|
|
225
|
-
// Normalize the asset's environment so that properties that only affect JS don't cause CSS to be duplicated.
|
|
226
|
-
// For example, with ESModule and CommonJS targets, only a single shared CSS bundle should be produced.
|
|
227
|
-
asset.setEnvironment({
|
|
228
|
-
context: 'browser',
|
|
229
|
-
engines: {
|
|
230
|
-
browsers: asset.env.engines.browsers,
|
|
231
|
-
},
|
|
232
|
-
shouldOptimize: asset.env.shouldOptimize,
|
|
233
|
-
shouldScopeHoist: asset.env.shouldScopeHoist,
|
|
234
|
-
sourceMap: asset.env.sourceMap,
|
|
235
|
-
});
|
|
236
|
-
|
|
237
222
|
return assets;
|
|
238
223
|
},
|
|
239
224
|
}): Transformer);
|