@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.
@@ -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 !== true && /\.module\./.test(asset.filePath),
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
- for (let dep of asset.getDependencies()) {
270
- if (dep.priority === 'sync') {
271
- // TODO: Figure out how to treeshake this
272
- let d = `dep_$${c++}`;
273
- depjs += `import * as ${d} from ${JSON.stringify(dep.specifier)};\n`;
274
- depjs += `for (let key in ${d}) { if (key in module.exports) module.exports[key] += ' ' + ${d}[key]; else module.exports[key] = ${d}[key]; }\n`;
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: asset.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.0",
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.0"
20
+ "parcel": "^2.4.1"
21
21
  },
22
22
  "dependencies": {
23
- "@parcel/css": "^1.7.2",
24
- "@parcel/diagnostic": "2.4.0",
25
- "@parcel/plugin": "2.4.0",
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.0",
27
+ "@parcel/utils": "2.4.1",
28
28
  "browserslist": "^4.6.6",
29
29
  "nullthrows": "^1.1.1"
30
30
  },
31
- "gitHead": "b1bbfdab2e902d33c0b6ff75bfba2d22283a8de6"
31
+ "gitHead": "80c728ceffdc0829eca568a6ec66c07e07a0b87b"
32
32
  }
@@ -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 !== true &&
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
- for (let dep of asset.getDependencies()) {
194
- if (dep.priority === 'sync') {
195
- // TODO: Figure out how to treeshake this
196
- let d = `dep_$${c++}`;
197
- depjs += `import * as ${d} from ${JSON.stringify(dep.specifier)};\n`;
198
- depjs += `for (let key in ${d}) { if (key in module.exports) module.exports[key] += ' ' + ${d}[key]; else module.exports[key] = ${d}[key]; }\n`;
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: asset.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);