@jsenv/plugin-bundling 2.8.2 → 2.8.3
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 +1 -1
- package/src/js_module/bundle_js_modules.js +118 -78
package/package.json
CHANGED
|
@@ -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 {
|
|
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 {
|
|
578
|
+
return {
|
|
579
|
+
id: url,
|
|
580
|
+
external: true,
|
|
581
|
+
moduleSideEffects: getModuleSideEffects(url, importer),
|
|
582
|
+
};
|
|
488
583
|
}
|
|
489
584
|
if (!importCanBeBundled(url)) {
|
|
490
|
-
return {
|
|
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 {
|
|
594
|
+
return {
|
|
595
|
+
id: url,
|
|
596
|
+
external: true,
|
|
597
|
+
moduleSideEffects: getModuleSideEffects(url, importer),
|
|
598
|
+
};
|
|
496
599
|
}
|
|
497
600
|
if (url.startsWith("ignore:")) {
|
|
498
|
-
return {
|
|
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
|
|
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
|
});
|