@jsenv/plugin-bundling 2.8.2 → 2.8.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/plugin-bundling",
3
- "version": "2.8.2",
3
+ "version": "2.8.4",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,7 +23,7 @@
23
23
  "sideEffects": false,
24
24
  "dependencies": {
25
25
  "@jsenv/humanize": "1.3.1",
26
- "@jsenv/url-meta": "8.5.4",
26
+ "@jsenv/url-meta": "8.5.5",
27
27
  "@jsenv/urls": "2.6.3",
28
28
  "@jsenv/sourcemap": "1.3.2",
29
29
  "lightningcss": "1.29.2",
@@ -1,9 +1,10 @@
1
1
  import { lookupPackageDirectory, readPackageAtOrNull } from "@jsenv/filesystem";
2
2
  import { createDetailedMessage } from "@jsenv/humanize";
3
+ import { applyNodeEsmResolution } from "@jsenv/node-esm-resolution";
3
4
  import { isSpecifierForNodeBuiltin } from "@jsenv/node-esm-resolution/src/node_builtin_specifiers.js";
4
5
  import { sourcemapConverter } from "@jsenv/sourcemap";
5
6
  import { URL_META } from "@jsenv/url-meta";
6
- import { fileSystemPathToUrl, isFileSystemPath } from "@jsenv/urls";
7
+ import { isFileSystemPath } from "@jsenv/urls";
7
8
  import { readFileSync } from "node:fs";
8
9
  import { fileUrlConverter } from "../file_url_converter.js";
9
10
 
@@ -192,8 +193,9 @@ const rollupPluginJsenv = ({
192
193
  buildDirectoryUrl,
193
194
  graph,
194
195
  jsModuleUrlInfos,
195
- sourcemaps,
196
196
 
197
+ runtimeCompat,
198
+ sourcemaps,
197
199
  include,
198
200
  preserveDynamicImport,
199
201
  augmentDynamicImportUrlSearchParams,
@@ -247,6 +249,94 @@ const rollupPluginJsenv = ({
247
249
  return new URL(rollupFileInfo.fileName, buildDirectoryUrl).href;
248
250
  };
249
251
 
252
+ const packageSideEffectsCacheMap = new Map();
253
+ const readClosestPackageJsonSideEffects = (url) => {
254
+ const packageDirectoryUrl = lookupPackageDirectory(url);
255
+ if (!packageDirectoryUrl) {
256
+ return undefined;
257
+ }
258
+ const fromCache = packageSideEffectsCacheMap.get(packageDirectoryUrl);
259
+ if (fromCache) {
260
+ return fromCache.value;
261
+ }
262
+ try {
263
+ const packageFileContent = readFileSync(
264
+ new URL("./package.json", packageDirectoryUrl),
265
+ "utf8",
266
+ );
267
+ const packageJSON = JSON.parse(packageFileContent);
268
+ const value = packageJSON.sideEffects;
269
+ if (Array.isArray(value)) {
270
+ const sideEffectPatterns = {};
271
+ for (const v of value) {
272
+ sideEffectPatterns[v] = true;
273
+ }
274
+ const associations = URL_META.resolveAssociations(
275
+ { sideEffects: sideEffectPatterns },
276
+ packageDirectoryUrl,
277
+ );
278
+ const isMatching = (url) => {
279
+ const meta = URL_META.applyAssociations({ url, associations });
280
+ return meta.sideEffects || false;
281
+ };
282
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, {
283
+ value: isMatching,
284
+ });
285
+ } else {
286
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, { value });
287
+ }
288
+ return value;
289
+ } catch {
290
+ packageSideEffectsCacheMap.set(packageDirectoryUrl, { value: undefined });
291
+ return undefined;
292
+ }
293
+ };
294
+ const nodeRuntimeEnabled = Object.keys(runtimeCompat).includes("node");
295
+ const packageConditions = [nodeRuntimeEnabled ? "node" : "browser", "import"];
296
+ const inferSideEffectsFromResolvedUrl = (url) => {
297
+ if (url.startsWith("ignore:")) {
298
+ // console.log(`may have side effect: ${url}`);
299
+ // double ignore we must keep the import
300
+ return null;
301
+ }
302
+ if (isSpecifierForNodeBuiltin(url)) {
303
+ return false;
304
+ }
305
+ const closestPackageJsonSideEffects =
306
+ readClosestPackageJsonSideEffects(url);
307
+ if (closestPackageJsonSideEffects === undefined) {
308
+ // console.log(`may have side effect: ${url}`);
309
+ return null;
310
+ }
311
+ if (typeof closestPackageJsonSideEffects === "function") {
312
+ const haveSideEffect = closestPackageJsonSideEffects(url);
313
+ // if (haveSideEffect) {
314
+ // console.log(`have side effect: ${url}`);
315
+ // }
316
+ return haveSideEffect;
317
+ }
318
+ return closestPackageJsonSideEffects;
319
+ };
320
+ const getModuleSideEffects = (url, importer) => {
321
+ if (!url.startsWith("ignore:")) {
322
+ return inferSideEffectsFromResolvedUrl(url);
323
+ }
324
+ url = url.slice("ignore:".length);
325
+ if (url.startsWith("file:")) {
326
+ return inferSideEffectsFromResolvedUrl(url);
327
+ }
328
+ try {
329
+ const result = applyNodeEsmResolution({
330
+ conditions: packageConditions,
331
+ parentUrl: importer,
332
+ specifier: url,
333
+ });
334
+ return inferSideEffectsFromResolvedUrl(result.url);
335
+ } catch {
336
+ return null;
337
+ }
338
+ };
339
+
250
340
  return {
251
341
  name: "jsenv",
252
342
  async buildStart() {
@@ -483,22 +573,43 @@ const rollupPluginJsenv = ({
483
573
  } else {
484
574
  url = new URL(specifier, importer).href;
485
575
  }
576
+
486
577
  if (!url.startsWith("file:")) {
487
- return { id: url, external: true };
578
+ return {
579
+ id: url,
580
+ external: true,
581
+ moduleSideEffects: getModuleSideEffects(url, importer),
582
+ };
488
583
  }
489
584
  if (!importCanBeBundled(url)) {
490
- return { id: url, external: true };
585
+ return {
586
+ id: url,
587
+ external: true,
588
+ moduleSideEffects: getModuleSideEffects(url, importer),
589
+ };
491
590
  }
492
591
  const urlInfo = graph.getUrlInfo(url);
493
592
  if (!urlInfo) {
494
593
  // happen when excluded by referenceAnalysis.include
495
- return { id: url, external: true };
594
+ return {
595
+ id: url,
596
+ external: true,
597
+ moduleSideEffects: getModuleSideEffects(url, importer),
598
+ };
496
599
  }
497
600
  if (url.startsWith("ignore:")) {
498
- return { id: url, external: true };
601
+ return {
602
+ id: url,
603
+ external: true,
604
+ moduleSideEffects: getModuleSideEffects(url, importer),
605
+ };
499
606
  }
500
607
  const filePath = fileUrlConverter.asFilePath(url);
501
- return filePath;
608
+ return {
609
+ id: filePath,
610
+ external: false,
611
+ moduleSideEffects: getModuleSideEffects(url, importer),
612
+ };
502
613
  },
503
614
  async load(rollupId) {
504
615
  const fileUrl = fileUrlConverter.asFileUrl(rollupId);
@@ -526,81 +637,10 @@ const applyRollupPlugins = async ({
526
637
  rollup = rollupModule.rollup;
527
638
  }
528
639
 
529
- const packageSideEffectsCacheMap = new Map();
530
- const readClosestPackageJsonSideEffects = (url) => {
531
- const packageDirectoryUrl = lookupPackageDirectory(url);
532
- if (!packageDirectoryUrl) {
533
- return undefined;
534
- }
535
- const fromCache = packageSideEffectsCacheMap.get(packageDirectoryUrl);
536
- if (fromCache) {
537
- return fromCache.value;
538
- }
539
- try {
540
- const packageFileContent = readFileSync(
541
- new URL("./package.json", packageDirectoryUrl),
542
- "utf8",
543
- );
544
- const packageJSON = JSON.parse(packageFileContent);
545
- const value = packageJSON.sideEffects;
546
- if (Array.isArray(value)) {
547
- const sideEffectPatterns = {};
548
- for (const v of value) {
549
- sideEffectPatterns[v] = true;
550
- }
551
- const associations = URL_META.resolveAssociations(
552
- { sideEffects: sideEffectPatterns },
553
- packageDirectoryUrl,
554
- );
555
- const isMatching = (url) => {
556
- const meta = URL_META.applyAssociations({ url, associations });
557
- return meta.sideEffects || false;
558
- };
559
- packageSideEffectsCacheMap.set(packageDirectoryUrl, {
560
- value: isMatching,
561
- });
562
- } else {
563
- packageSideEffectsCacheMap.set(packageDirectoryUrl, { value });
564
- }
565
- return value;
566
- } catch {
567
- packageSideEffectsCacheMap.set(packageDirectoryUrl, { value: undefined });
568
- return undefined;
569
- }
570
- };
571
-
572
640
  const rollupReturnValue = await rollup({
573
641
  ...rollupInput,
574
642
  treeshake: {
575
643
  ...rollupInput.treeshake,
576
- moduleSideEffects: (id, external) => {
577
- if (id.startsWith("ignore:node:")) {
578
- return false;
579
- }
580
- if (isSpecifierForNodeBuiltin(id)) {
581
- return false;
582
- }
583
- if (id.startsWith("ignore:")) {
584
- return null;
585
- }
586
- const url = id.startsWith("file:") ? id : fileSystemPathToUrl(id);
587
- const closestPackageJsonSideEffects =
588
- readClosestPackageJsonSideEffects(url);
589
- if (closestPackageJsonSideEffects !== undefined) {
590
- if (typeof closestPackageJsonSideEffects === "function") {
591
- return closestPackageJsonSideEffects(url);
592
- }
593
- return closestPackageJsonSideEffects;
594
- }
595
- const moduleSideEffects = rollupInput.treeshake?.moduleSideEffects;
596
- if (moduleSideEffects) {
597
- if (typeof moduleSideEffects === "function") {
598
- return moduleSideEffects(id, external);
599
- }
600
- return moduleSideEffects;
601
- }
602
- return null;
603
- },
604
644
  },
605
645
  plugins: rollupPlugins,
606
646
  });