@jsenv/core 36.2.1 → 36.3.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.
Files changed (124) hide show
  1. package/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +45 -35
  2. package/dist/babel_helpers/AwaitValue/AwaitValue.js +3 -3
  3. package/dist/babel_helpers/applyDecoratedDescriptor/applyDecoratedDescriptor.js +13 -13
  4. package/dist/babel_helpers/applyDecs/applyDecs.js +227 -42
  5. package/dist/babel_helpers/applyDecs2203/applyDecs2203.js +559 -418
  6. package/dist/babel_helpers/applyDecs2203R/applyDecs2203R.js +235 -87
  7. package/dist/babel_helpers/applyDecs2301/applyDecs2301.js +591 -456
  8. package/dist/babel_helpers/applyDecs2305/applyDecs2305.js +681 -0
  9. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +5 -5
  10. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +3 -3
  11. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +4 -4
  12. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +4 -4
  13. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +12 -4
  14. package/dist/babel_helpers/asyncIterator/asyncIterator.js +13 -11
  15. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +18 -17
  16. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +2 -1
  17. package/dist/babel_helpers/checkInRHS/checkInRHS.js +8 -5
  18. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +7 -7
  19. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +3 -3
  20. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +4 -4
  21. package/dist/babel_helpers/classCallCheck/classCallCheck.js +2 -2
  22. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +2 -2
  23. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +2 -2
  24. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +3 -3
  25. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +2 -2
  26. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -5
  27. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -5
  28. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +3 -3
  29. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +3 -3
  30. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -6
  31. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +3 -3
  32. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +2 -2
  33. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -7
  34. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +15 -9
  35. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -4
  36. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +2 -2
  37. package/dist/babel_helpers/construct/construct.js +10 -9
  38. package/dist/babel_helpers/createClass/createClass.js +2 -3
  39. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +30 -29
  40. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +18 -16
  41. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +23 -17
  42. package/dist/babel_helpers/createSuper/createSuper.js +14 -12
  43. package/dist/babel_helpers/decorate/decorate.js +242 -210
  44. package/dist/babel_helpers/defaults/defaults.js +6 -6
  45. package/dist/babel_helpers/defineAccessor/defineAccessor.js +1 -4
  46. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +12 -12
  47. package/dist/babel_helpers/defineProperty/defineProperty.js +7 -6
  48. package/dist/babel_helpers/extends/extends.js +5 -4
  49. package/dist/babel_helpers/get/get.js +2 -1
  50. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +4 -3
  51. package/dist/babel_helpers/inherits/inherits.js +3 -4
  52. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -5
  53. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +4 -4
  54. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +5 -2
  55. package/dist/babel_helpers/instanceof/instanceof.js +3 -3
  56. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +2 -4
  57. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +19 -21
  58. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +2 -2
  59. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +7 -7
  60. package/dist/babel_helpers/iterableToArray/iterableToArray.js +6 -2
  61. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +6 -1
  62. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +6 -2
  63. package/dist/babel_helpers/jsx/jsx.js +14 -7
  64. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +6 -5
  65. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +2 -2
  66. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +5 -3
  67. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +5 -3
  68. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +2 -2
  69. package/dist/babel_helpers/objectSpread/objectSpread.js +15 -12
  70. package/dist/babel_helpers/objectSpread2/objectSpread2.js +7 -2
  71. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +15 -13
  72. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +11 -11
  73. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +7 -6
  74. package/dist/babel_helpers/readOnlyError/readOnlyError.js +2 -2
  75. package/dist/babel_helpers/regeneratorRuntime/regeneratorRuntime.js +124 -73
  76. package/dist/babel_helpers/set/set.js +23 -20
  77. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +6 -5
  78. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +5 -5
  79. package/dist/babel_helpers/slicedToArray/slicedToArray.js +10 -5
  80. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +12 -6
  81. package/dist/babel_helpers/superPropBase/superPropBase.js +6 -5
  82. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +7 -7
  83. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +4 -4
  84. package/dist/babel_helpers/tdz/tdz.js +2 -2
  85. package/dist/babel_helpers/temporalRef/temporalRef.js +5 -4
  86. package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +1 -1
  87. package/dist/babel_helpers/toArray/toArray.js +10 -5
  88. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +10 -5
  89. package/dist/babel_helpers/toPrimitive/toPrimitive.js +7 -7
  90. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -4
  91. package/dist/babel_helpers/typeof/typeof.js +14 -5
  92. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -8
  93. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +5 -4
  94. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +17 -15
  95. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +19 -8
  96. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +2 -2
  97. package/dist/js/autoreload.js +148 -133
  98. package/dist/js/import_meta_hot.js +19 -13
  99. package/dist/js/inline_content.js +1 -3
  100. package/dist/js/new_stylesheet.js +119 -60
  101. package/dist/js/regenerator_runtime.js +204 -102
  102. package/dist/js/ribbon.js +11 -6
  103. package/dist/js/server_events_client.js +122 -98
  104. package/dist/js/ws.js +968 -265
  105. package/dist/jsenv_core.js +8513 -6162
  106. package/package.json +13 -12
  107. package/src/build/build.js +497 -486
  108. package/src/build/version_mappings_injection.js +21 -44
  109. package/src/kitchen/errors.js +2 -2
  110. package/src/kitchen/fetched_content_compliance.js +6 -2
  111. package/src/kitchen/kitchen.js +285 -80
  112. package/src/kitchen/prepend_content.js +135 -0
  113. package/src/kitchen/url_graph/url_graph_visitor.js +99 -0
  114. package/src/kitchen/url_graph/url_info_transformations.js +140 -21
  115. package/src/kitchen/url_graph.js +59 -29
  116. package/src/plugins/autoreload/jsenv_plugin_hmr.js +1 -2
  117. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +2 -2
  118. package/src/plugins/importmap/jsenv_plugin_importmap.js +2 -2
  119. package/src/plugins/inlining/jsenv_plugin_inlining_as_data_url.js +1 -1
  120. package/src/plugins/reference_analysis/html/jsenv_plugin_html_reference_analysis.js +44 -23
  121. package/src/plugins/reference_analysis/js/jsenv_plugin_js_reference_analysis.js +2 -1
  122. package/dist/js/global_this_js_classic.js +0 -24
  123. package/dist/js/global_this_js_module.js +0 -20
  124. package/src/build/graph_utils.js +0 -34
@@ -57,6 +57,7 @@ import { jsenvPluginJsModuleFallback } from "@jsenv/plugin-transpilation";
57
57
 
58
58
  import { lookupPackageDirectory } from "../helpers/lookup_package_directory.js";
59
59
  import { watchSourceFiles } from "../helpers/watch_source_files.js";
60
+ import { GRAPH_VISITOR } from "../kitchen/url_graph/url_graph_visitor.js";
60
61
  import { createUrlGraph } from "../kitchen/url_graph.js";
61
62
  import { createKitchen } from "../kitchen/kitchen.js";
62
63
  import { createUrlGraphLoader } from "../kitchen/url_graph/url_graph_loader.js";
@@ -70,7 +71,6 @@ import { jsenvPluginReferenceAnalysis } from "../plugins/reference_analysis/jsen
70
71
  import { jsenvPluginInlining } from "../plugins/inlining/jsenv_plugin_inlining.js";
71
72
  import { jsenvPluginLineBreakNormalization } from "./jsenv_plugin_line_break_normalization.js";
72
73
 
73
- import { GRAPH } from "./graph_utils.js";
74
74
  import { createBuildUrlsGenerator } from "./build_urls_generator.js";
75
75
  import {
76
76
  injectVersionMappingsAsGlobal,
@@ -266,6 +266,13 @@ export const build = async ({
266
266
 
267
267
  const runBuild = async ({ signal, logLevel }) => {
268
268
  const logger = createLogger({ logLevel });
269
+ const createBuildTask = (label) => {
270
+ return createTaskLog(label, {
271
+ disabled: !logger.levels.debug && !logger.levels.info,
272
+ animated: !logger.levels.debug,
273
+ });
274
+ };
275
+
269
276
  const buildOperation = Abort.startOperation();
270
277
  buildOperation.addAbortSignal(signal);
271
278
  const entryPointKeys = Object.keys(entryPoints);
@@ -379,331 +386,11 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
379
386
  const bundleUrlInfos = {};
380
387
  const bundlers = {};
381
388
  const finalGraph = createUrlGraph();
382
- const finalGraphKitchen = createKitchen({
383
- logLevel,
384
- rootDirectoryUrl: buildDirectoryUrl,
385
- // here most plugins are not there
386
- // - no external plugin
387
- // - no plugin putting reference.mustIgnore on https urls
388
- // At this stage it's only about redirecting urls to the build directory
389
- // consequently only a subset or urls are supported
390
- supportedProtocols: ["file:", "data:", "virtual:", "ignore:"],
391
- ignore,
392
- ignoreProtocol: versioning ? "keep" : "remove",
393
- urlGraph: finalGraph,
394
- build: true,
395
- runtimeCompat,
396
- ...contextSharedDuringBuild,
397
- plugins: [
398
- jsenvPluginReferenceAnalysis({
399
- ...referenceAnalysis,
400
- fetchInlineUrls: false,
401
- }),
402
- ...(lineBreakNormalization
403
- ? [jsenvPluginLineBreakNormalization()]
404
- : []),
405
- jsenvPluginJsModuleFallback({
406
- systemJsInjection: true,
407
- }),
408
- jsenvPluginInlining(),
409
- {
410
- name: "jsenv:build_shape",
411
- appliesDuring: "build",
412
- resolveReference: (reference) => {
413
- const getUrl = () => {
414
- if (reference.type === "filesystem") {
415
- const parentRawUrl = buildDirectoryRedirections.get(
416
- reference.parentUrl,
417
- );
418
- const parentUrl = ensurePathnameTrailingSlash(parentRawUrl);
419
- return new URL(reference.specifier, parentUrl).href;
420
- }
421
- if (reference.specifier[0] === "/") {
422
- return new URL(reference.specifier.slice(1), buildDirectoryUrl)
423
- .href;
424
- }
425
- return new URL(
426
- reference.specifier,
427
- reference.baseUrl || reference.parentUrl,
428
- ).href;
429
- };
430
- let url = getUrl();
431
- // url = rawRedirections.get(url) || url
432
- url = bundleRedirections.get(url) || url;
433
- url = bundleInternalRedirections.get(url) || url;
434
- return url;
435
- },
436
- // redirecting references into the build directory
437
- redirectReference: (reference) => {
438
- if (!reference.url.startsWith("file:")) {
439
- return null;
440
- }
441
- // referenced by resource hint
442
- // -> keep it untouched, it will be handled by "resync_resource_hints"
443
- if (reference.isResourceHint) {
444
- return reference.original ? reference.original.url : null;
445
- }
446
- // already a build url
447
- const rawUrl = buildDirectoryRedirections.get(reference.url);
448
- if (rawUrl) {
449
- return reference.url;
450
- }
451
- if (reference.isInline) {
452
- const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl);
453
- const parentRawUrl = parentUrlInfo.originalUrl;
454
- const rawUrlInfo = GRAPH.find(rawGraph, (rawUrlInfo) => {
455
- const { inlineUrlSite } = rawUrlInfo;
456
- // not inline
457
- if (!inlineUrlSite) return false;
458
- if (
459
- inlineUrlSite.url === parentRawUrl &&
460
- inlineUrlSite.line === reference.specifierLine &&
461
- inlineUrlSite.column === reference.specifierColumn
462
- ) {
463
- return true;
464
- }
465
- if (rawUrlInfo.content === reference.content) {
466
- return true;
467
- }
468
- if (rawUrlInfo.originalContent === reference.content) {
469
- return true;
470
- }
471
- return false;
472
- });
473
-
474
- if (!rawUrlInfo) {
475
- // generated during final graph
476
- // (happens for JSON.parse injected for import assertions for instance)
477
- // throw new Error(`cannot find raw url for "${reference.url}"`)
478
- return reference.url;
479
- }
480
- const buildUrl = buildUrlsGenerator.generate(reference.url, {
481
- urlInfo: rawUrlInfo,
482
- parentUrlInfo,
483
- });
484
- associateBuildUrlAndRawUrl(
485
- buildUrl,
486
- rawUrlInfo.url,
487
- "inline content",
488
- );
489
- return buildUrl;
490
- }
491
- // from "js_module_fallback":
492
- // - injecting "?js_module_fallback" for the first time
493
- // - injecting "?js_module_fallback" because the parentUrl has it
494
- if (reference.original) {
495
- const urlBeforeRedirect = reference.original.url;
496
- const urlAfterRedirect = reference.url;
497
- const isEntryPoint =
498
- reference.isEntryPoint ||
499
- isWebWorkerEntryPointReference(reference);
500
- // the url info do not exists yet (it will be created after this "redirectReference" hook)
501
- // And the content will be generated when url is cooked by url graph loader.
502
- // Here we just want to reserve an url for that file
503
- const urlInfo = {
504
- data: reference.data,
505
- isEntryPoint,
506
- type: reference.expectedType,
507
- subtype: reference.expectedSubtype,
508
- filename: reference.filename,
509
- };
510
- if (urlIsInsideOf(urlBeforeRedirect, buildDirectoryUrl)) {
511
- // the redirection happened on a build url, happens due to:
512
- // 1. bundling
513
- const buildUrl = buildUrlsGenerator.generate(urlAfterRedirect, {
514
- urlInfo,
515
- });
516
- finalRedirections.set(urlBeforeRedirect, buildUrl);
517
- return buildUrl;
518
- }
519
- const rawUrl = urlAfterRedirect;
520
- const buildUrl = buildUrlsGenerator.generate(rawUrl, {
521
- urlInfo,
522
- });
523
- finalRedirections.set(urlBeforeRedirect, buildUrl);
524
- associateBuildUrlAndRawUrl(
525
- buildUrl,
526
- rawUrl,
527
- "redirected during postbuild",
528
- );
529
- return buildUrl;
530
- }
531
- // from "js_module_fallback":
532
- // - to inject "s.js"
533
- if (reference.injected) {
534
- const buildUrl = buildUrlsGenerator.generate(reference.url, {
535
- urlInfo: {
536
- data: {},
537
- type: "js_classic",
538
- },
539
- });
540
- associateBuildUrlAndRawUrl(
541
- buildUrl,
542
- reference.url,
543
- "injected during postbuild",
544
- );
545
- finalRedirections.set(buildUrl, buildUrl);
546
- return buildUrl;
547
- }
548
- const rawUrlInfo = rawGraph.getUrlInfo(reference.url);
549
- const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl);
550
- // files from root directory but not given to rollup nor postcss
551
- if (rawUrlInfo) {
552
- const referencedUrlObject = new URL(reference.url);
553
- referencedUrlObject.searchParams.delete("as_js_classic");
554
- const buildUrl = buildUrlsGenerator.generate(
555
- referencedUrlObject.href,
556
- {
557
- urlInfo: rawUrlInfo,
558
- parentUrlInfo,
559
- },
560
- );
561
- associateBuildUrlAndRawUrl(buildUrl, rawUrlInfo.url, "raw file");
562
- if (buildUrl.includes("?")) {
563
- associateBuildUrlAndRawUrl(
564
- asUrlWithoutSearch(buildUrl),
565
- rawUrlInfo.url,
566
- "raw file",
567
- );
568
- }
569
- return buildUrl;
570
- }
571
- if (reference.type === "sourcemap_comment") {
572
- // inherit parent build url
573
- return generateSourcemapFileUrl(reference.parentUrl);
574
- }
575
- // files generated during the final graph:
576
- // - sourcemaps
577
- // const finalUrlInfo = finalGraph.getUrlInfo(url)
578
- const buildUrl = buildUrlsGenerator.generate(reference.url, {
579
- urlInfo: {
580
- data: {},
581
- type: "asset",
582
- },
583
- });
584
- return buildUrl;
585
- },
586
- formatReference: (reference) => {
587
- if (!reference.generatedUrl.startsWith("file:")) {
588
- return null;
589
- }
590
- if (reference.isResourceHint) {
591
- return null;
592
- }
593
- if (!urlIsInsideOf(reference.generatedUrl, buildDirectoryUrl)) {
594
- throw new Error(
595
- `urls should be inside build directory at this stage, found "${reference.url}"`,
596
- );
597
- }
598
- const generatedUrlObject = new URL(reference.generatedUrl);
599
- generatedUrlObject.searchParams.delete("js_classic");
600
- generatedUrlObject.searchParams.delete("js_module");
601
- generatedUrlObject.searchParams.delete("js_module_fallback");
602
- generatedUrlObject.searchParams.delete("as_js_classic");
603
- generatedUrlObject.searchParams.delete("as_js_module");
604
- generatedUrlObject.searchParams.delete("as_json_module");
605
- generatedUrlObject.searchParams.delete("as_css_module");
606
- generatedUrlObject.searchParams.delete("as_text_module");
607
- generatedUrlObject.hash = "";
608
- const generatedUrl = generatedUrlObject.href;
609
- const specifier = asFormattedBuildUrl(generatedUrl, reference);
610
- buildUrls.set(specifier, reference.generatedUrl);
611
- return specifier;
612
- },
613
- fetchUrlContent: async (finalUrlInfo, context) => {
614
- const fromBundleOrRawGraph = (url) => {
615
- const bundleUrlInfo = bundleUrlInfos[url];
616
- if (bundleUrlInfo) {
617
- // logger.debug(`fetching from bundle ${url}`)
618
- return bundleUrlInfo;
619
- }
620
- const rawUrl = buildDirectoryRedirections.get(url) || url;
621
- const rawUrlInfo = rawGraph.getUrlInfo(rawUrl);
622
- if (!rawUrlInfo) {
623
- throw new Error(
624
- createDetailedMessage(`Cannot find url`, {
625
- url,
626
- "raw urls": Array.from(buildDirectoryRedirections.values()),
627
- "build urls": Array.from(buildDirectoryRedirections.keys()),
628
- }),
629
- );
630
- }
631
- // logger.debug(`fetching from raw graph ${url}`)
632
- if (rawUrlInfo.isInline) {
633
- // Inline content, such as <script> inside html, is transformed during the previous phase.
634
- // If we read the inline content it would be considered as the original content.
635
- // - It could be "fixed" by taking into account sourcemap and consider sourcemap sources
636
- // as the original content.
637
- // - But it would not work when sourcemap are not generated
638
- // - would be a bit slower
639
- // - So instead of reading the inline content directly, we search into raw graph
640
- // to get "originalContent" and "sourcemap"
641
- finalUrlInfo.type = rawUrlInfo.type;
642
- finalUrlInfo.subtype = rawUrlInfo.subtype;
643
- return rawUrlInfo;
644
- }
645
- return rawUrlInfo;
646
- };
647
- const { reference } = context;
648
- // reference injected during "postbuild":
649
- // - happens for "js_module_fallback" injecting "s.js"
650
- if (reference.injected) {
651
- const [ref, rawUrlInfo] = rawGraphKitchen.injectReference({
652
- ...reference,
653
- parentUrl: buildDirectoryRedirections.get(reference.parentUrl),
654
- });
655
- await rawGraphKitchen.cook(rawUrlInfo, { reference: ref });
656
- return rawUrlInfo;
657
- }
658
- if (reference.isInline) {
659
- if (reference.prev && !reference.prev.isInline) {
660
- const urlBeforeRedirect = findKey(
661
- finalRedirections,
662
- reference.prev.url,
663
- );
664
- return fromBundleOrRawGraph(urlBeforeRedirect);
665
- }
666
- return fromBundleOrRawGraph(reference.url);
667
- }
668
- // reference updated during "postbuild":
669
- // - happens for "js_module_fallback"
670
- if (reference.original) {
671
- return fromBundleOrRawGraph(reference.original.url);
672
- }
673
- return fromBundleOrRawGraph(finalUrlInfo.url);
674
- },
675
- },
676
- {
677
- name: "jsenv:optimize",
678
- appliesDuring: "build",
679
- transformUrlContent: async (urlInfo, context) => {
680
- await rawGraphKitchen.pluginController.callAsyncHooks(
681
- "optimizeUrlContent",
682
- urlInfo,
683
- context,
684
- async (optimizeReturnValue) => {
685
- await finalGraphKitchen.urlInfoTransformer.applyFinalTransformations(
686
- urlInfo,
687
- optimizeReturnValue,
688
- );
689
- },
690
- );
691
- },
692
- },
693
- ],
694
- sourcemaps,
695
- sourcemapsSourcesContent,
696
- sourcemapsSourcesRelative: !versioning,
697
- outDirectoryUrl: outDirectoryUrl
698
- ? new URL("postbuild/", outDirectoryUrl)
699
- : undefined,
700
- });
701
- const finalEntryUrls = [];
389
+ let finalGraphKitchen;
390
+ let finalEntryUrls = [];
702
391
 
703
392
  craft: {
704
- const generateSourceGraph = createTaskLog("generate source graph", {
705
- disabled: logger.levels.debug || !logger.levels.info,
706
- });
393
+ const generateSourceGraph = createBuildTask("generate source graph");
707
394
  try {
708
395
  if (outDirectoryUrl) {
709
396
  await ensureEmptyDirectory(new URL(`build/`, outDirectoryUrl));
@@ -725,6 +412,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
725
412
  rawUrlGraphLoader.load(entryUrlInfo, { reference: entryReference });
726
413
  });
727
414
  await rawUrlGraphLoader.getAllLoadDonePromise(buildOperation);
415
+ await rawGraphKitchen.injectForwardedSideEffectFiles();
728
416
  } catch (e) {
729
417
  generateSourceGraph.fail();
730
418
  throw e;
@@ -733,6 +421,341 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
733
421
  }
734
422
 
735
423
  shape: {
424
+ finalGraphKitchen = createKitchen({
425
+ logLevel,
426
+ rootDirectoryUrl: buildDirectoryUrl,
427
+ // here most plugins are not there
428
+ // - no external plugin
429
+ // - no plugin putting reference.mustIgnore on https urls
430
+ // At this stage it's only about redirecting urls to the build directory
431
+ // consequently only a subset or urls are supported
432
+ supportedProtocols: ["file:", "data:", "virtual:", "ignore:"],
433
+ ignore,
434
+ ignoreProtocol: versioning ? "keep" : "remove",
435
+ urlGraph: finalGraph,
436
+ build: true,
437
+ runtimeCompat,
438
+ ...contextSharedDuringBuild,
439
+ plugins: [
440
+ jsenvPluginReferenceAnalysis({
441
+ ...referenceAnalysis,
442
+ fetchInlineUrls: false,
443
+ }),
444
+ ...(lineBreakNormalization
445
+ ? [jsenvPluginLineBreakNormalization()]
446
+ : []),
447
+ jsenvPluginJsModuleFallback(),
448
+ jsenvPluginInlining(),
449
+ {
450
+ name: "jsenv:build_shape",
451
+ appliesDuring: "build",
452
+ resolveReference: (reference) => {
453
+ const getUrl = () => {
454
+ if (reference.type === "filesystem") {
455
+ const parentRawUrl = buildDirectoryRedirections.get(
456
+ reference.parentUrl,
457
+ );
458
+ const parentUrl = ensurePathnameTrailingSlash(parentRawUrl);
459
+ return new URL(reference.specifier, parentUrl).href;
460
+ }
461
+ if (reference.specifier[0] === "/") {
462
+ return new URL(
463
+ reference.specifier.slice(1),
464
+ buildDirectoryUrl,
465
+ ).href;
466
+ }
467
+ return new URL(
468
+ reference.specifier,
469
+ reference.baseUrl || reference.parentUrl,
470
+ ).href;
471
+ };
472
+ let url = getUrl();
473
+ // url = rawRedirections.get(url) || url
474
+ url = bundleRedirections.get(url) || url;
475
+ url = bundleInternalRedirections.get(url) || url;
476
+ return url;
477
+ },
478
+ // redirecting references into the build directory
479
+ redirectReference: (reference) => {
480
+ if (!reference.url.startsWith("file:")) {
481
+ return null;
482
+ }
483
+ // referenced by resource hint
484
+ // -> keep it untouched, it will be handled by "resync_resource_hints"
485
+ if (reference.isResourceHint) {
486
+ return reference.original ? reference.original.url : null;
487
+ }
488
+ // already a build url
489
+ const rawUrl = buildDirectoryRedirections.get(reference.url);
490
+ if (rawUrl) {
491
+ return reference.url;
492
+ }
493
+ if (reference.isInline) {
494
+ const parentUrlInfo = finalGraph.getUrlInfo(
495
+ reference.parentUrl,
496
+ );
497
+ const parentRawUrl = parentUrlInfo.originalUrl;
498
+ const rawUrlInfo = GRAPH_VISITOR.find(
499
+ rawGraph,
500
+ (rawUrlInfo) => {
501
+ const { inlineUrlSite } = rawUrlInfo;
502
+ // not inline
503
+ if (!inlineUrlSite) return false;
504
+ if (
505
+ inlineUrlSite.url === parentRawUrl &&
506
+ inlineUrlSite.line === reference.specifierLine &&
507
+ inlineUrlSite.column === reference.specifierColumn
508
+ ) {
509
+ return true;
510
+ }
511
+ if (rawUrlInfo.content === reference.content) {
512
+ return true;
513
+ }
514
+ if (rawUrlInfo.originalContent === reference.content) {
515
+ return true;
516
+ }
517
+ return false;
518
+ },
519
+ );
520
+
521
+ if (!rawUrlInfo) {
522
+ // generated during final graph
523
+ // (happens for JSON.parse injected for import assertions for instance)
524
+ // throw new Error(`cannot find raw url for "${reference.url}"`)
525
+ return reference.url;
526
+ }
527
+ const buildUrl = buildUrlsGenerator.generate(reference.url, {
528
+ urlInfo: rawUrlInfo,
529
+ parentUrlInfo,
530
+ });
531
+ associateBuildUrlAndRawUrl(
532
+ buildUrl,
533
+ rawUrlInfo.url,
534
+ "inline content",
535
+ );
536
+ return buildUrl;
537
+ }
538
+ // from "js_module_fallback":
539
+ // - injecting "?js_module_fallback" for the first time
540
+ // - injecting "?js_module_fallback" because the parentUrl has it
541
+ if (reference.original) {
542
+ const urlBeforeRedirect = reference.original.url;
543
+ const urlAfterRedirect = reference.url;
544
+ const isEntryPoint =
545
+ reference.isEntryPoint ||
546
+ isWebWorkerEntryPointReference(reference);
547
+ // the url info do not exists yet (it will be created after this "redirectReference" hook)
548
+ // And the content will be generated when url is cooked by url graph loader.
549
+ // Here we just want to reserve an url for that file
550
+ const urlInfo = {
551
+ data: reference.data,
552
+ isEntryPoint,
553
+ type: reference.expectedType,
554
+ subtype: reference.expectedSubtype,
555
+ filename: reference.filename,
556
+ };
557
+ if (urlIsInsideOf(urlBeforeRedirect, buildDirectoryUrl)) {
558
+ // the redirection happened on a build url, happens due to:
559
+ // 1. bundling
560
+ const buildUrl = buildUrlsGenerator.generate(
561
+ urlAfterRedirect,
562
+ {
563
+ urlInfo,
564
+ },
565
+ );
566
+ finalRedirections.set(urlBeforeRedirect, buildUrl);
567
+ return buildUrl;
568
+ }
569
+ const rawUrl = urlAfterRedirect;
570
+ const buildUrl = buildUrlsGenerator.generate(rawUrl, {
571
+ urlInfo,
572
+ });
573
+ finalRedirections.set(urlBeforeRedirect, buildUrl);
574
+ associateBuildUrlAndRawUrl(
575
+ buildUrl,
576
+ rawUrl,
577
+ "redirected during postbuild",
578
+ );
579
+ return buildUrl;
580
+ }
581
+ // from "js_module_fallback":
582
+ // - to inject "s.js"
583
+ if (reference.injected) {
584
+ const buildUrl = buildUrlsGenerator.generate(reference.url, {
585
+ urlInfo: {
586
+ data: {},
587
+ type: "js_classic",
588
+ },
589
+ });
590
+ associateBuildUrlAndRawUrl(
591
+ buildUrl,
592
+ reference.url,
593
+ "injected during postbuild",
594
+ );
595
+ finalRedirections.set(buildUrl, buildUrl);
596
+ return buildUrl;
597
+ }
598
+ const rawUrlInfo = rawGraph.getUrlInfo(reference.url);
599
+ const parentUrlInfo = finalGraph.getUrlInfo(reference.parentUrl);
600
+ // files from root directory but not given to rollup nor postcss
601
+ if (rawUrlInfo) {
602
+ const referencedUrlObject = new URL(reference.url);
603
+ referencedUrlObject.searchParams.delete("as_js_classic");
604
+ const buildUrl = buildUrlsGenerator.generate(
605
+ referencedUrlObject.href,
606
+ {
607
+ urlInfo: rawUrlInfo,
608
+ parentUrlInfo,
609
+ },
610
+ );
611
+ associateBuildUrlAndRawUrl(
612
+ buildUrl,
613
+ rawUrlInfo.url,
614
+ "raw file",
615
+ );
616
+ if (buildUrl.includes("?")) {
617
+ associateBuildUrlAndRawUrl(
618
+ asUrlWithoutSearch(buildUrl),
619
+ rawUrlInfo.url,
620
+ "raw file",
621
+ );
622
+ }
623
+ return buildUrl;
624
+ }
625
+ if (reference.type === "sourcemap_comment") {
626
+ // inherit parent build url
627
+ return generateSourcemapFileUrl(reference.parentUrl);
628
+ }
629
+ // files generated during the final graph:
630
+ // - sourcemaps
631
+ // const finalUrlInfo = finalGraph.getUrlInfo(url)
632
+ const buildUrl = buildUrlsGenerator.generate(reference.url, {
633
+ urlInfo: {
634
+ data: {},
635
+ type: "asset",
636
+ },
637
+ });
638
+ return buildUrl;
639
+ },
640
+ formatReference: (reference) => {
641
+ if (!reference.generatedUrl.startsWith("file:")) {
642
+ return null;
643
+ }
644
+ if (reference.isResourceHint) {
645
+ return null;
646
+ }
647
+ if (!urlIsInsideOf(reference.generatedUrl, buildDirectoryUrl)) {
648
+ throw new Error(
649
+ `urls should be inside build directory at this stage, found "${reference.url}"`,
650
+ );
651
+ }
652
+ const generatedUrlObject = new URL(reference.generatedUrl);
653
+ generatedUrlObject.searchParams.delete("js_classic");
654
+ generatedUrlObject.searchParams.delete("js_module");
655
+ generatedUrlObject.searchParams.delete("js_module_fallback");
656
+ generatedUrlObject.searchParams.delete("as_js_classic");
657
+ generatedUrlObject.searchParams.delete("as_js_module");
658
+ generatedUrlObject.searchParams.delete("as_json_module");
659
+ generatedUrlObject.searchParams.delete("as_css_module");
660
+ generatedUrlObject.searchParams.delete("as_text_module");
661
+ generatedUrlObject.hash = "";
662
+ const generatedUrl = generatedUrlObject.href;
663
+ const specifier = asFormattedBuildUrl(generatedUrl, reference);
664
+ buildUrls.set(specifier, reference.generatedUrl);
665
+ return specifier;
666
+ },
667
+ fetchUrlContent: async (finalUrlInfo, context) => {
668
+ const fromBundleOrRawGraph = (url) => {
669
+ const bundleUrlInfo = bundleUrlInfos[url];
670
+ if (bundleUrlInfo) {
671
+ return bundleUrlInfo;
672
+ }
673
+ const rawUrl = buildDirectoryRedirections.get(url) || url;
674
+ const rawUrlInfo = rawGraph.getUrlInfo(rawUrl);
675
+ if (!rawUrlInfo) {
676
+ throw new Error(
677
+ createDetailedMessage(`Cannot find url`, {
678
+ url,
679
+ "raw urls": Array.from(
680
+ buildDirectoryRedirections.values(),
681
+ ),
682
+ "build urls": Array.from(
683
+ buildDirectoryRedirections.keys(),
684
+ ),
685
+ }),
686
+ );
687
+ }
688
+ // logger.debug(`fetching from raw graph ${url}`)
689
+ if (rawUrlInfo.isInline) {
690
+ // Inline content, such as <script> inside html, is transformed during the previous phase.
691
+ // If we read the inline content it would be considered as the original content.
692
+ // - It could be "fixed" by taking into account sourcemap and consider sourcemap sources
693
+ // as the original content.
694
+ // - But it would not work when sourcemap are not generated
695
+ // - would be a bit slower
696
+ // - So instead of reading the inline content directly, we search into raw graph
697
+ // to get "originalContent" and "sourcemap"
698
+ finalUrlInfo.type = rawUrlInfo.type;
699
+ finalUrlInfo.subtype = rawUrlInfo.subtype;
700
+ return rawUrlInfo;
701
+ }
702
+ return rawUrlInfo;
703
+ };
704
+ const { reference } = context;
705
+ // reference injected during "postbuild":
706
+ // - happens for "js_module_fallback" injecting "s.js"
707
+ if (reference.injected) {
708
+ const [ref, rawUrlInfo] = rawGraphKitchen.injectReference({
709
+ ...reference,
710
+ parentUrl: buildDirectoryRedirections.get(
711
+ reference.parentUrl,
712
+ ),
713
+ });
714
+ await rawGraphKitchen.cook(rawUrlInfo, { reference: ref });
715
+ return rawUrlInfo;
716
+ }
717
+ if (reference.isInline) {
718
+ if (reference.prev && !reference.prev.isInline) {
719
+ const urlBeforeRedirect =
720
+ findKey(finalRedirections, reference.prev.url) ||
721
+ reference.prev.url;
722
+ return fromBundleOrRawGraph(urlBeforeRedirect);
723
+ }
724
+ return fromBundleOrRawGraph(reference.url);
725
+ }
726
+ // reference updated during "postbuild":
727
+ // - happens for "js_module_fallback"
728
+ if (reference.original) {
729
+ return fromBundleOrRawGraph(reference.original.url);
730
+ }
731
+ return fromBundleOrRawGraph(finalUrlInfo.url);
732
+ },
733
+ },
734
+ {
735
+ name: "jsenv:optimize",
736
+ appliesDuring: "build",
737
+ transformUrlContent: async (urlInfo, context) => {
738
+ await rawGraphKitchen.pluginController.callAsyncHooks(
739
+ "optimizeUrlContent",
740
+ urlInfo,
741
+ context,
742
+ (optimizeReturnValue) => {
743
+ finalGraphKitchen.urlInfoTransformer.applyTransformations(
744
+ urlInfo,
745
+ optimizeReturnValue,
746
+ );
747
+ },
748
+ );
749
+ },
750
+ },
751
+ ],
752
+ sourcemaps,
753
+ sourcemapsSourcesContent,
754
+ sourcemapsSourcesRelative: !versioning,
755
+ outDirectoryUrl: outDirectoryUrl
756
+ ? new URL("postbuild/", outDirectoryUrl)
757
+ : undefined,
758
+ });
736
759
  bundle: {
737
760
  rawGraphKitchen.pluginController.plugins.forEach((plugin) => {
738
761
  const bundle = plugin.bundle;
@@ -767,12 +790,12 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
767
790
  bundler.urlInfos.push(rawUrlInfo);
768
791
  }
769
792
  };
770
- GRAPH.forEach(rawGraph, (rawUrlInfo) => {
793
+ GRAPH_VISITOR.forEach(rawGraph, (rawUrlInfo) => {
771
794
  // cleanup unused urls (avoid bundling things that are not actually used)
772
795
  // happens for:
773
796
  // - js import assertions
774
- // - as_js_classic
775
- if (!isUsed(rawUrlInfo)) {
797
+ // - conversion to js classic using ?as_js_classic or ?js_module_fallback
798
+ if (!rawGraph.isUsed(rawUrlInfo)) {
776
799
  rawGraph.deleteUrlInfo(rawUrlInfo.url);
777
800
  return;
778
801
  }
@@ -854,9 +877,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
854
877
  if (urlInfosToBundle.length === 0) {
855
878
  return;
856
879
  }
857
- const bundleTask = createTaskLog(`bundle "${type}"`, {
858
- disabled: logger.levels.debug || !logger.levels.info,
859
- });
880
+ const bundleTask = createBuildTask(`bundle "${type}"`);
860
881
  try {
861
882
  const bundlerGeneratedUrlInfos =
862
883
  await rawGraphKitchen.pluginController.callAsyncHook(
@@ -946,9 +967,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
946
967
  }, Promise.resolve());
947
968
  }
948
969
  reload_in_build_directory: {
949
- const generateBuildGraph = createTaskLog("generate build graph", {
950
- disabled: logger.levels.debug || !logger.levels.info,
951
- });
970
+ const generateBuildGraph = createBuildTask("generate build graph");
952
971
  try {
953
972
  if (outDirectoryUrl) {
954
973
  await ensureEmptyDirectory(new URL(`postbuild/`, outDirectoryUrl));
@@ -970,6 +989,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
970
989
  });
971
990
  });
972
991
  await finalUrlGraphLoader.getAllLoadDonePromise(buildOperation);
992
+ await finalGraphKitchen.injectForwardedSideEffectFiles();
973
993
  } catch (e) {
974
994
  generateBuildGraph.fail();
975
995
  throw e;
@@ -985,10 +1005,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
985
1005
  if (!versioning) {
986
1006
  break inject_version_in_urls;
987
1007
  }
988
- logger.debug("versioning start");
989
- const versioningTask = createTaskLog("inject version in urls", {
990
- disabled: logger.levels.debug || !logger.levels.info,
991
- });
1008
+ const versioningTask = createBuildTask("inject version in urls");
992
1009
  try {
993
1010
  const canUseImportmap =
994
1011
  versioningViaImportmap &&
@@ -1005,7 +1022,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1005
1022
  return true;
1006
1023
  }
1007
1024
  const urlInfo = graph.getUrlInfo(reference.url);
1008
- const dependentWorker = graph.findDependent(
1025
+ const dependentWorker = GRAPH_VISITOR.findDependent(
1026
+ graph,
1009
1027
  urlInfo,
1010
1028
  (dependentUrlInfo) => {
1011
1029
  return isWebWorkerUrlInfo(dependentUrlInfo);
@@ -1062,7 +1080,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1062
1080
  // see also https://github.com/rollup/rollup/pull/4543
1063
1081
  const contentVersionMap = new Map();
1064
1082
  const hashCallbacks = [];
1065
- GRAPH.forEach(finalGraph, (urlInfo) => {
1083
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1066
1084
  if (urlInfo.type === "sourcemap") {
1067
1085
  return;
1068
1086
  }
@@ -1079,6 +1097,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1079
1097
  if (urlInfo.isInline) {
1080
1098
  return;
1081
1099
  }
1100
+ // urlInfo became inline and is not referenced by something else
1082
1101
  if (urlInfo.url.startsWith("data:")) {
1083
1102
  return;
1084
1103
  }
@@ -1096,6 +1115,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1096
1115
  }),
1097
1116
  {
1098
1117
  cleanupJsenvAttributes: true,
1118
+ cleanupPositionAttributes: true,
1099
1119
  },
1100
1120
  )
1101
1121
  : urlInfo.content;
@@ -1255,7 +1275,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1255
1275
  }
1256
1276
  const versionedUrl = versionedUrlMap.get(reference.url);
1257
1277
  if (!versionedUrl) {
1258
- // happens for sourcemap
1278
+ // happens for inline content and sourcemaps
1259
1279
  return urlToRelativeUrl(
1260
1280
  referencedUrlInfo.url,
1261
1281
  reference.parentUrl,
@@ -1282,12 +1302,10 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1282
1302
  },
1283
1303
  fetchUrlContent: (versionedUrlInfo) => {
1284
1304
  if (versionedUrlInfo.isInline) {
1285
- const rawUrlInfo = rawGraph.getUrlInfo(
1286
- buildDirectoryRedirections.get(versionedUrlInfo.url),
1287
- );
1288
- const finalUrlInfo = finalGraph.getUrlInfo(
1289
- versionedUrlInfo.url,
1290
- );
1305
+ const versionedUrl = versionedUrlInfo.url;
1306
+ const rawUrl = buildDirectoryRedirections.get(versionedUrl);
1307
+ const rawUrlInfo = rawGraph.getUrlInfo(rawUrl);
1308
+ const finalUrlInfo = finalGraph.getUrlInfo(versionedUrl);
1291
1309
  return {
1292
1310
  content: versionedUrlInfo.content,
1293
1311
  contentType: versionedUrlInfo.contentType,
@@ -1338,8 +1356,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1338
1356
  if (urlInfo.type === "html" && urlInfo.isEntryPoint) {
1339
1357
  actions.push(async () => {
1340
1358
  await injectVersionMappingsAsImportmap({
1341
- urlInfo,
1342
1359
  kitchen: finalGraphKitchen,
1360
+ urlInfo,
1343
1361
  versionMappings: versionMappingsNeeded,
1344
1362
  });
1345
1363
  });
@@ -1355,8 +1373,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1355
1373
  if (urlInfo.isEntryPoint) {
1356
1374
  actions.push(async () => {
1357
1375
  await injectVersionMappingsAsGlobal({
1358
- urlInfo,
1359
1376
  kitchen: finalGraphKitchen,
1377
+ urlInfo,
1360
1378
  versionMappings: versionMappingsNeeded,
1361
1379
  });
1362
1380
  });
@@ -1364,7 +1382,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1364
1382
  });
1365
1383
  }
1366
1384
  if (visitors.length) {
1367
- GRAPH.forEach(finalGraph, (urlInfo) => {
1385
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1368
1386
  visitors.forEach((visitor) => visitor(urlInfo));
1369
1387
  });
1370
1388
  if (actions.length) {
@@ -1378,7 +1396,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1378
1396
  versioningTask.done();
1379
1397
  }
1380
1398
  cleanup_jsenv_attributes_from_html: {
1381
- GRAPH.forEach(finalGraph, (urlInfo) => {
1399
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1382
1400
  if (!urlInfo.url.startsWith("file:")) {
1383
1401
  return;
1384
1402
  }
@@ -1388,6 +1406,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1388
1406
  });
1389
1407
  urlInfo.content = stringifyHtmlAst(htmlAst, {
1390
1408
  cleanupJsenvAttributes: true,
1409
+ cleanupPositionAttributes: true,
1391
1410
  });
1392
1411
  }
1393
1412
  });
@@ -1400,147 +1419,149 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1400
1419
  */
1401
1420
  resync_resource_hints: {
1402
1421
  const actions = [];
1403
- GRAPH.forEach(finalGraph, (urlInfo) => {
1422
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1404
1423
  if (urlInfo.type !== "html") {
1405
1424
  return;
1406
1425
  }
1407
- actions.push(async () => {
1408
- const htmlAst = parseHtmlString(urlInfo.content, {
1409
- storeOriginalPositions: false,
1410
- });
1411
- const mutations = [];
1412
- const hintsToInject = {};
1413
- visitHtmlNodes(htmlAst, {
1414
- link: (node) => {
1415
- const href = getHtmlNodeAttribute(node, "href");
1416
- if (href === undefined || href.startsWith("data:")) {
1417
- return;
1418
- }
1419
- const rel = getHtmlNodeAttribute(node, "rel");
1420
- const isResourceHint = [
1421
- "preconnect",
1422
- "dns-prefetch",
1423
- "prefetch",
1424
- "preload",
1425
- "modulepreload",
1426
- ].includes(rel);
1427
- if (!isResourceHint) {
1426
+ const htmlAst = parseHtmlString(urlInfo.content, {
1427
+ storeOriginalPositions: false,
1428
+ });
1429
+ const mutations = [];
1430
+ const hintsToInject = {};
1431
+ visitHtmlNodes(htmlAst, {
1432
+ link: (node) => {
1433
+ const href = getHtmlNodeAttribute(node, "href");
1434
+ if (href === undefined || href.startsWith("data:")) {
1435
+ return;
1436
+ }
1437
+ const rel = getHtmlNodeAttribute(node, "rel");
1438
+ const isResourceHint = [
1439
+ "preconnect",
1440
+ "dns-prefetch",
1441
+ "prefetch",
1442
+ "preload",
1443
+ "modulepreload",
1444
+ ].includes(rel);
1445
+ if (!isResourceHint) {
1446
+ return;
1447
+ }
1448
+ const onBuildUrl = (buildUrl) => {
1449
+ const buildUrlInfo = buildUrl
1450
+ ? finalGraph.getUrlInfo(buildUrl)
1451
+ : null;
1452
+ if (!buildUrlInfo) {
1453
+ logger.warn(
1454
+ `remove resource hint because cannot find "${href}" in the graph`,
1455
+ );
1456
+ mutations.push(() => {
1457
+ removeHtmlNode(node);
1458
+ });
1428
1459
  return;
1429
1460
  }
1430
- const onBuildUrl = (buildUrl) => {
1431
- const buildUrlInfo = buildUrl
1432
- ? finalGraph.getUrlInfo(buildUrl)
1433
- : null;
1434
- if (!buildUrlInfo) {
1435
- logger.warn(
1436
- `remove resource hint because cannot find "${href}" in the graph`,
1437
- );
1438
- mutations.push(() => {
1439
- removeHtmlNode(node);
1440
- });
1441
- return;
1442
- }
1443
- if (buildUrlInfo.dependents.size === 0) {
1444
- logger.warn(
1445
- `remove resource hint because "${href}" not used anymore`,
1446
- );
1447
- mutations.push(() => {
1448
- removeHtmlNode(node);
1449
- });
1450
- return;
1451
- }
1452
- const buildUrlFormatted =
1453
- versioningRedirections.get(buildUrlInfo.url) ||
1454
- buildUrlInfo.url;
1455
- const buildSpecifierBeforeRedirect = findKey(
1456
- buildUrls,
1457
- buildUrlFormatted,
1461
+ if (buildUrlInfo.dependents.size === 0) {
1462
+ logger.warn(
1463
+ `remove resource hint because "${href}" not used anymore`,
1458
1464
  );
1459
1465
  mutations.push(() => {
1460
- setHtmlNodeAttributes(node, {
1461
- href: buildSpecifierBeforeRedirect,
1462
- ...(buildUrlInfo.type === "js_classic"
1463
- ? { crossorigin: undefined }
1464
- : {}),
1465
- });
1466
+ removeHtmlNode(node);
1466
1467
  });
1467
- for (const dependencyUrl of buildUrlInfo.dependencies) {
1468
- const dependencyUrlInfo =
1469
- finalGraph.urlInfoMap.get(dependencyUrl);
1470
- if (dependencyUrlInfo.data.generatedToShareCode) {
1471
- hintsToInject[dependencyUrl] = node;
1472
- }
1473
- }
1474
- };
1475
- if (href.startsWith("file:")) {
1476
- let url = href;
1477
- url = rawRedirections.get(url) || url;
1478
- const rawUrlInfo = rawGraph.getUrlInfo(url);
1479
- if (rawUrlInfo && rawUrlInfo.data.bundled) {
1480
- logger.warn(
1481
- `remove resource hint on "${href}" because it was bundled`,
1482
- );
1483
- mutations.push(() => {
1484
- removeHtmlNode(node);
1485
- });
1486
- } else {
1487
- url = bundleRedirections.get(url) || url;
1488
- url = bundleInternalRedirections.get(url) || url;
1489
- url = finalRedirections.get(url) || url;
1490
- url = findKey(buildDirectoryRedirections, url) || url;
1491
- onBuildUrl(url);
1492
- }
1493
- } else {
1494
- onBuildUrl(null);
1468
+ return;
1495
1469
  }
1496
- },
1497
- });
1498
- Object.keys(hintsToInject).forEach((urlToHint) => {
1499
- const hintNode = hintsToInject[urlToHint];
1500
- const urlFormatted =
1501
- versioningRedirections.get(urlToHint) || urlToHint;
1502
- const specifierBeforeRedirect = findKey(buildUrls, urlFormatted);
1503
- const found = findHtmlNode(htmlAst, (htmlNode) => {
1504
- return (
1505
- htmlNode.nodeName === "link" &&
1506
- getHtmlNodeAttribute(htmlNode, "href") ===
1507
- specifierBeforeRedirect
1470
+ const buildUrlFormatted =
1471
+ versioningRedirections.get(buildUrlInfo.url) ||
1472
+ buildUrlInfo.url;
1473
+ const buildSpecifierBeforeRedirect = findKey(
1474
+ buildUrls,
1475
+ buildUrlFormatted,
1508
1476
  );
1509
- });
1510
- if (!found) {
1511
1477
  mutations.push(() => {
1512
- const nodeToInsert = createHtmlNode({
1513
- tagName: "link",
1514
- href: specifierBeforeRedirect,
1515
- rel: getHtmlNodeAttribute(hintNode, "rel"),
1516
- as: getHtmlNodeAttribute(hintNode, "as"),
1517
- type: getHtmlNodeAttribute(hintNode, "type"),
1518
- crossorigin: getHtmlNodeAttribute(hintNode, "crossorigin"),
1478
+ setHtmlNodeAttributes(node, {
1479
+ href: buildSpecifierBeforeRedirect,
1480
+ ...(buildUrlInfo.type === "js_classic"
1481
+ ? { crossorigin: undefined }
1482
+ : {}),
1519
1483
  });
1520
- insertHtmlNodeAfter(nodeToInsert, hintNode);
1521
1484
  });
1485
+ for (const dependencyUrl of buildUrlInfo.dependencies) {
1486
+ const dependencyUrlInfo =
1487
+ finalGraph.urlInfoMap.get(dependencyUrl);
1488
+ if (dependencyUrlInfo.data.generatedToShareCode) {
1489
+ hintsToInject[dependencyUrl] = node;
1490
+ }
1491
+ }
1492
+ };
1493
+ if (href.startsWith("file:")) {
1494
+ let url = href;
1495
+ url = rawRedirections.get(url) || url;
1496
+ const rawUrlInfo = rawGraph.getUrlInfo(url);
1497
+ if (rawUrlInfo && rawUrlInfo.data.bundled) {
1498
+ logger.warn(
1499
+ `remove resource hint on "${href}" because it was bundled`,
1500
+ );
1501
+ mutations.push(() => {
1502
+ removeHtmlNode(node);
1503
+ });
1504
+ } else {
1505
+ url = bundleRedirections.get(url) || url;
1506
+ url = bundleInternalRedirections.get(url) || url;
1507
+ url = finalRedirections.get(url) || url;
1508
+ url = findKey(buildDirectoryRedirections, url) || url;
1509
+ onBuildUrl(url);
1510
+ }
1511
+ } else {
1512
+ onBuildUrl(null);
1522
1513
  }
1514
+ },
1515
+ });
1516
+ Object.keys(hintsToInject).forEach((urlToHint) => {
1517
+ const hintNode = hintsToInject[urlToHint];
1518
+ const urlFormatted =
1519
+ versioningRedirections.get(urlToHint) || urlToHint;
1520
+ const specifierBeforeRedirect = findKey(buildUrls, urlFormatted);
1521
+ const found = findHtmlNode(htmlAst, (htmlNode) => {
1522
+ return (
1523
+ htmlNode.nodeName === "link" &&
1524
+ getHtmlNodeAttribute(htmlNode, "href") ===
1525
+ specifierBeforeRedirect
1526
+ );
1523
1527
  });
1524
- if (mutations.length > 0) {
1528
+ if (!found) {
1529
+ mutations.push(() => {
1530
+ const nodeToInsert = createHtmlNode({
1531
+ tagName: "link",
1532
+ href: specifierBeforeRedirect,
1533
+ rel: getHtmlNodeAttribute(hintNode, "rel"),
1534
+ as: getHtmlNodeAttribute(hintNode, "as"),
1535
+ type: getHtmlNodeAttribute(hintNode, "type"),
1536
+ crossorigin: getHtmlNodeAttribute(hintNode, "crossorigin"),
1537
+ });
1538
+ insertHtmlNodeAfter(nodeToInsert, hintNode);
1539
+ });
1540
+ }
1541
+ });
1542
+ if (mutations.length > 0) {
1543
+ actions.push(() => {
1525
1544
  mutations.forEach((mutation) => mutation());
1526
- await finalGraphKitchen.urlInfoTransformer.applyFinalTransformations(
1545
+ finalGraphKitchen.urlInfoTransformer.applyTransformations(
1527
1546
  urlInfo,
1528
1547
  {
1529
1548
  content: stringifyHtmlAst(htmlAst),
1530
1549
  },
1531
1550
  );
1532
- }
1533
- });
1551
+ });
1552
+ }
1534
1553
  });
1535
- await Promise.all(
1536
- actions.map((resourceHintAction) => resourceHintAction()),
1537
- );
1538
- buildOperation.throwIfAborted();
1554
+ if (actions.length > 0) {
1555
+ const resyncTask = createBuildTask("resync resource hints");
1556
+ actions.map((resourceHintAction) => resourceHintAction());
1557
+ buildOperation.throwIfAborted();
1558
+ resyncTask.done();
1559
+ }
1539
1560
  }
1540
1561
  delete_unused_urls: {
1541
1562
  const actions = [];
1542
- GRAPH.forEach(finalGraph, (urlInfo) => {
1543
- if (!isUsed(urlInfo)) {
1563
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1564
+ if (!finalGraph.isUsed(urlInfo)) {
1544
1565
  actions.push(() => {
1545
1566
  finalGraph.deleteUrlInfo(urlInfo.url);
1546
1567
  });
@@ -1549,7 +1570,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1549
1570
  actions.forEach((action) => action());
1550
1571
  }
1551
1572
  inject_urls_in_service_workers: {
1552
- const serviceWorkerEntryUrlInfos = GRAPH.filter(
1573
+ const serviceWorkerEntryUrlInfos = GRAPH_VISITOR.filter(
1553
1574
  finalGraph,
1554
1575
  (finalUrlInfo) => {
1555
1576
  return (
@@ -1559,8 +1580,11 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1559
1580
  },
1560
1581
  );
1561
1582
  if (serviceWorkerEntryUrlInfos.length > 0) {
1583
+ const urlsInjectionInSw = createBuildTask(
1584
+ "inject urls in service worker",
1585
+ );
1562
1586
  const serviceWorkerResources = {};
1563
- GRAPH.forEach(finalGraph, (urlInfo) => {
1587
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1564
1588
  if (!urlInfo.url.startsWith("file:")) {
1565
1589
  return;
1566
1590
  }
@@ -1607,7 +1631,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1607
1631
  )};\n`,
1608
1632
  );
1609
1633
  const { content, sourcemap } = magicSource.toContentAndSourcemap();
1610
- finalGraphKitchen.urlInfoTransformer.applyFinalTransformations(
1634
+ finalGraphKitchen.urlInfoTransformer.applyTransformations(
1611
1635
  serviceWorkerEntryUrlInfo,
1612
1636
  {
1613
1637
  content,
@@ -1615,6 +1639,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1615
1639
  },
1616
1640
  );
1617
1641
  });
1642
+ urlsInjectionInSw.done();
1618
1643
  }
1619
1644
  buildOperation.throwIfAborted();
1620
1645
  }
@@ -1633,7 +1658,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1633
1658
  const buildRelativeUrl = urlToRelativeUrl(url, buildDirectoryUrl);
1634
1659
  return buildRelativeUrl;
1635
1660
  };
1636
- GRAPH.forEach(finalGraph, (urlInfo) => {
1661
+ GRAPH_VISITOR.forEach(finalGraph, (urlInfo) => {
1637
1662
  if (!urlInfo.url.startsWith("file:")) {
1638
1663
  return;
1639
1664
  }
@@ -1675,6 +1700,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1675
1700
  });
1676
1701
 
1677
1702
  if (writeOnFileSystem) {
1703
+ const writingFiles = createBuildTask("write files in build directory");
1678
1704
  if (directoryToClean) {
1679
1705
  await ensureEmptyDirectory(directoryToClean);
1680
1706
  }
@@ -1691,6 +1717,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1691
1717
  JSON.stringify(buildManifest, null, " "),
1692
1718
  );
1693
1719
  }
1720
+ writingFiles.done();
1694
1721
  }
1695
1722
  logger.info(createUrlGraphSummary(finalGraph, { title: "build files" }));
1696
1723
  return {
@@ -1791,22 +1818,6 @@ const injectVersionIntoBuildUrl = ({ buildUrl, version, versioningMethod }) => {
1791
1818
  return versionedUrl;
1792
1819
  };
1793
1820
 
1794
- const isUsed = (urlInfo) => {
1795
- // nothing uses this url anymore
1796
- // - versioning update inline content
1797
- // - file converted for import assertion or js_classic conversion
1798
- if (urlInfo.isEntryPoint) {
1799
- return true;
1800
- }
1801
- if (urlInfo.type === "sourcemap") {
1802
- return true;
1803
- }
1804
- if (urlInfo.injected) {
1805
- return true;
1806
- }
1807
- return urlInfo.dependents.size > 0;
1808
- };
1809
-
1810
1821
  const canUseVersionedUrl = (urlInfo) => {
1811
1822
  if (urlInfo.isEntryPoint) {
1812
1823
  return false;