@jsenv/core 34.1.5 → 34.2.0

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 (24) hide show
  1. package/dist/js/s.js.map +2 -2
  2. package/dist/jsenv.js +77 -178
  3. package/package.json +2 -2
  4. package/src/build/build.js +18 -20
  5. package/src/dev/file_service.js +1 -1
  6. package/src/kitchen/url_graph/url_info_transformations.js +1 -1
  7. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +1 -1
  8. package/src/plugins/ribbon/jsenv_plugin_ribbon.js +3 -3
  9. package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/convert_js_module_to_js_classic.js +6 -2
  10. package/src/plugins/transpilation/{as_js_classic/jsenv_plugin_as_js_classic_conversion.js → js_module_fallback/jsenv_plugin_js_module_conversion.js} +13 -12
  11. package/src/plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_fallback.js +45 -0
  12. package/src/plugins/transpilation/{as_js_classic/jsenv_plugin_as_js_classic_html.js → js_module_fallback/jsenv_plugin_js_module_fallback_inside_html.js} +7 -7
  13. package/src/plugins/transpilation/{as_js_classic/jsenv_plugin_as_js_classic_workers.js → js_module_fallback/jsenv_plugin_js_module_fallback_on_workers.js} +3 -3
  14. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +10 -11
  15. package/src/plugins/url_analysis/jsenv_plugin_reference_expected_types.js +2 -2
  16. package/src/test/execute_steps.js +1 -1
  17. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +0 -61
  18. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_library.js +0 -91
  19. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/async-to-promises.js +0 -0
  20. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/client/s.js +0 -0
  21. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/helpers/babel_plugin_transform_import_meta_resolve.js +0 -0
  22. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/helpers/babel_plugin_transform_import_meta_url.js +0 -0
  23. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/helpers/systemjs_old.js +0 -0
  24. /package/src/plugins/transpilation/{as_js_classic → js_module_fallback}/helpers-string.js +0 -0
package/dist/js/s.js.map CHANGED
@@ -3,13 +3,13 @@
3
3
  "sources": [
4
4
  "../../packages/babel-plugins/src/babel_helpers/arrayWithHoles/arrayWithHoles.js",
5
5
  "../../packages/babel-plugins/src/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js",
6
- "../../src/plugins/transpilation/as_js_classic/client/s.js",
6
+ "../../src/plugins/transpilation/js_module_fallback/client/s.js",
7
7
  "../../packages/babel-plugins/src/babel_helpers/arrayLikeToArray/arrayLikeToArray.js",
8
8
  "../../packages/babel-plugins/src/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js",
9
9
  "../../packages/babel-plugins/src/babel_helpers/nonIterableRest/nonIterableRest.js",
10
10
  "../../packages/babel-plugins/src/babel_helpers/slicedToArray/slicedToArray.js",
11
11
  "../../packages/babel-plugins/src/babel_helpers/typeof/typeof.js",
12
- "../../src/plugins/transpilation/as_js_classic/client/s.js?as_js_classic_library"
12
+ "../../src/plugins/transpilation/js_module_fallback/client/s.js?as_js_classic"
13
13
  ],
14
14
  "names": [
15
15
  "arr",
package/dist/jsenv.js CHANGED
@@ -18,7 +18,6 @@ import { SOURCEMAP, generateSourcemapFileUrl, composeTwoSourcemaps, generateSour
18
18
  import { parseHtmlString, stringifyHtmlAst, getHtmlNodeAttribute, visitHtmlNodes, analyzeScriptNode, setHtmlNodeAttributes, parseSrcSet, getHtmlNodePosition, getHtmlNodeAttributePosition, parseCssUrls, parseJsUrls, getHtmlNodeText, setHtmlNodeText, removeHtmlNodeText, applyBabelPlugins, injectScriptNodeAsEarlyAsPossible, createHtmlNode, findHtmlNode, removeHtmlNode, injectJsImport, analyzeLinkNode, injectHtmlNode, insertHtmlNodeAfter } from "@jsenv/ast";
19
19
  import { createRequire } from "node:module";
20
20
  import babelParser from "@babel/parser";
21
- import { bundleJsModules } from "@jsenv/plugin-bundling";
22
21
  import v8, { takeCoverage } from "node:v8";
23
22
  import stripAnsi from "strip-ansi";
24
23
  import { createId } from "@paralleldrive/cuid2";
@@ -7872,9 +7871,9 @@ const createUrlInfoTransformer = ({
7872
7871
  // during build it's urlInfo.url to be inside the build
7873
7872
  // but otherwise it's generatedUrl to be inside .jsenv/ directory
7874
7873
  const generatedUrlObject = new URL(urlInfo.generatedUrl);
7874
+ generatedUrlObject.searchParams.delete("js_module_fallback");
7875
7875
  generatedUrlObject.searchParams.delete("as_js_module");
7876
7876
  generatedUrlObject.searchParams.delete("as_js_classic");
7877
- generatedUrlObject.searchParams.delete("as_js_classic_library");
7878
7877
  const urlForSourcemap = generatedUrlObject.href;
7879
7878
  urlInfo.sourcemapGeneratedUrl = generateSourcemapFileUrl(urlForSourcemap);
7880
7879
 
@@ -9880,7 +9879,7 @@ const jsenvPluginReferenceExpectedTypes = () => {
9880
9879
  }
9881
9880
  if (searchParams.has("js_classic")) {
9882
9881
  reference.expectedType = "js_classic";
9883
- } else if (searchParams.has("as_js_classic") || searchParams.has("as_js_classic_library")) {
9882
+ } else if (searchParams.has("js_module_fallback") || searchParams.has("as_js_classic")) {
9884
9883
  reference.expectedType = "js_classic";
9885
9884
  } else if (searchParams.has("as_js_module")) {
9886
9885
  reference.expectedType = "js_module";
@@ -10526,7 +10525,7 @@ ${e.traceMessage}`);
10526
10525
  // If the inline script was already handled by an other plugin, ignore it
10527
10526
  // - we want to preserve inline scripts generated by html supervisor during dev
10528
10527
  // - we want to avoid cooking twice a script during build
10529
- if (!analyzeConvertedScripts && getHtmlNodeAttribute(scriptNode, "jsenv-injected-by") === "jsenv:as_js_classic_html") {
10528
+ if (!analyzeConvertedScripts && getHtmlNodeAttribute(scriptNode, "jsenv-injected-by") === "jsenv:js_module_fallback") {
10530
10529
  return;
10531
10530
  }
10532
10531
  const hotAccept = getHtmlNodeAttribute(scriptNode, "hot-accept") !== undefined;
@@ -14766,9 +14765,10 @@ function default_1({
14766
14765
  };
14767
14766
  }
14768
14767
 
14768
+ const systemJsClientFileUrlDefault = new URL("./js/s.js", import.meta.url).href;
14769
14769
  const convertJsModuleToJsClassic = async ({
14770
14770
  systemJsInjection,
14771
- systemJsClientFileUrl,
14771
+ systemJsClientFileUrl = systemJsClientFileUrlDefault,
14772
14772
  urlInfo,
14773
14773
  jsModuleUrlInfo
14774
14774
  }) => {
@@ -14903,10 +14903,10 @@ const babelPluginRelativeImports = babel => {
14903
14903
  };
14904
14904
 
14905
14905
  /*
14906
- * - propagate ?as_js_classic to urls
14907
- * - perform conversion from js module to js classic when url uses ?as_js_classic
14906
+ * - propagate "?js_module_fallback" query string param on urls
14907
+ * - perform conversion from js module to js classic when url uses "?js_module_fallback"
14908
14908
  */
14909
- const jsenvPluginAsJsClassicConversion = ({
14909
+ const jsenvPluginJsModuleConversion = ({
14910
14910
  systemJsInjection,
14911
14911
  systemJsClientFileUrl,
14912
14912
  generateJsClassicFilename
@@ -14920,13 +14920,13 @@ const jsenvPluginAsJsClassicConversion = ({
14920
14920
  }
14921
14921
  return false;
14922
14922
  };
14923
- const shouldPropagateJsClassic = (reference, context) => {
14923
+ const shouldPropagateJsModuleConversion = (reference, context) => {
14924
14924
  if (isReferencingJsModule(reference)) {
14925
14925
  const parentUrlInfo = context.urlGraph.getUrlInfo(reference.parentUrl);
14926
14926
  if (!parentUrlInfo) {
14927
14927
  return false;
14928
14928
  }
14929
- const parentGotAsJsClassic = new URL(parentUrlInfo.url).searchParams.has("as_js_classic");
14929
+ const parentGotAsJsClassic = new URL(parentUrlInfo.url).searchParams.has("js_module_fallback");
14930
14930
  return parentGotAsJsClassic;
14931
14931
  }
14932
14932
  return false;
@@ -14937,16 +14937,16 @@ const jsenvPluginAsJsClassicConversion = ({
14937
14937
  };
14938
14938
  const turnIntoJsClassicProxy = reference => {
14939
14939
  const urlTransformed = injectQueryParams(reference.url, {
14940
- as_js_classic: ""
14940
+ js_module_fallback: ""
14941
14941
  });
14942
14942
  markAsJsClassicProxy(reference);
14943
14943
  return urlTransformed;
14944
14944
  };
14945
14945
  return {
14946
- name: "jsenv:as_js_classic_conversion",
14946
+ name: "jsenv:js_module_conversion",
14947
14947
  appliesDuring: "*",
14948
14948
  redirectUrl: (reference, context) => {
14949
- if (reference.searchParams.has("as_js_classic")) {
14949
+ if (reference.searchParams.has("js_module_fallback")) {
14950
14950
  markAsJsClassicProxy(reference);
14951
14951
  return null;
14952
14952
  }
@@ -14956,7 +14956,7 @@ const jsenvPluginAsJsClassicConversion = ({
14956
14956
  // (because it's the transpiled equivalent of static and dynamic imports)
14957
14957
  // And not other references otherwise we could try to transform inline resources
14958
14958
  // or specifiers inside new URL()...
14959
- if (shouldPropagateJsClassic(reference, context)) {
14959
+ if (shouldPropagateJsModuleConversion(reference, context)) {
14960
14960
  return turnIntoJsClassicProxy(reference);
14961
14961
  }
14962
14962
  return null;
@@ -14965,9 +14965,9 @@ const jsenvPluginAsJsClassicConversion = ({
14965
14965
  const [jsModuleReference, jsModuleUrlInfo] = context.getWithoutSearchParam({
14966
14966
  urlInfo,
14967
14967
  context,
14968
- searchParam: "as_js_classic",
14968
+ searchParam: "js_module_fallback",
14969
14969
  // override the expectedType to "js_module"
14970
- // because when there is ?as_js_classic it means the underlying resource
14970
+ // because when there is ?js_module_fallback it means the underlying resource
14971
14971
  // is a js_module
14972
14972
  expectedType: "js_module"
14973
14973
  });
@@ -15012,21 +15012,21 @@ const jsenvPluginAsJsClassicConversion = ({
15012
15012
 
15013
15013
  /*
15014
15014
  * when <script type="module"> cannot be used:
15015
- * - ?as_js_classic is injected into the src of <script type="module">
15015
+ * - ?js_module_fallback is injected into the src of <script type="module">
15016
15016
  * - js inside <script type="module"> is transformed into classic js
15017
15017
  * - <link rel="modulepreload"> are converted to <link rel="preload">
15018
15018
  */
15019
- const jsenvPluginAsJsClassicHtml = ({
15019
+ const jsenvPluginJsModuleFallbackInsideHtml = ({
15020
15020
  systemJsInjection,
15021
15021
  systemJsClientFileUrl
15022
15022
  }) => {
15023
15023
  const turnIntoJsClassicProxy = reference => {
15024
15024
  return injectQueryParams(reference.url, {
15025
- as_js_classic: ""
15025
+ js_module_fallback: ""
15026
15026
  });
15027
15027
  };
15028
15028
  return {
15029
- name: "jsenv:as_js_classic_html",
15029
+ name: "jsenv:js_module_fallback_inside_html",
15030
15030
  appliesDuring: "*",
15031
15031
  redirectUrl: {
15032
15032
  link_href: (reference, context) => {
@@ -15179,7 +15179,7 @@ const jsenvPluginAsJsClassicHtml = ({
15179
15179
  injectScriptNodeAsEarlyAsPossible(htmlAst, createHtmlNode({
15180
15180
  tagName: "script",
15181
15181
  textContent: systemJsUrlInfo.content
15182
- }), "jsenv:as_js_classic_html");
15182
+ }), "jsenv:js_module_fallback");
15183
15183
  });
15184
15184
  }
15185
15185
  }
@@ -15202,7 +15202,7 @@ const isOrWasExpectingJsModule = reference => {
15202
15202
  return false;
15203
15203
  };
15204
15204
  const isExpectingJsModule = reference => {
15205
- return reference.expectedType === "js_module" || reference.searchParams.has("as_js_classic") || reference.searchParams.has("as_js_classic_library");
15205
+ return reference.expectedType === "js_module" || reference.searchParams.has("js_module_fallback") || reference.searchParams.has("as_js_classic");
15206
15206
  };
15207
15207
 
15208
15208
  /*
@@ -15217,7 +15217,7 @@ const isExpectingJsModule = reference => {
15217
15217
  * transformed into
15218
15218
  * new SharedWorker("shared_worker.js?as_js_classic", { type: "classic" })
15219
15219
  */
15220
- const jsenvPluginAsJsClassicWorkers = () => {
15220
+ const jsenvPluginJsModuleFallbackOnWorkers = () => {
15221
15221
  const turnIntoJsClassicProxy = reference => {
15222
15222
  reference.mutation = magicSource => {
15223
15223
  magicSource.replace({
@@ -15227,11 +15227,11 @@ const jsenvPluginAsJsClassicWorkers = () => {
15227
15227
  });
15228
15228
  };
15229
15229
  return injectQueryParams(reference.url, {
15230
- as_js_classic: ""
15230
+ js_module_fallback: ""
15231
15231
  });
15232
15232
  };
15233
15233
  return {
15234
- name: "jsenv:as_js_classic_workers",
15234
+ name: "jsenv:js_module_fallback_on_workers",
15235
15235
  appliesDuring: "*",
15236
15236
  redirectUrl: {
15237
15237
  js_url: (reference, context) => {
@@ -15262,132 +15262,36 @@ const jsenvPluginAsJsClassicWorkers = () => {
15262
15262
  };
15263
15263
  };
15264
15264
 
15265
- const jsenvPluginAsJsClassicLibrary = ({
15266
- systemJsInjection,
15267
- systemJsClientFileUrl,
15268
- generateJsClassicFilename
15269
- }) => {
15270
- const markAsJsClassicLibraryProxy = reference => {
15271
- reference.expectedType = "js_classic";
15272
- reference.filename = generateJsClassicFilename(reference.url);
15273
- };
15274
- return {
15275
- name: "jsenv:as_js_classic_library",
15276
- appliesDuring: "*",
15277
- redirectUrl: reference => {
15278
- if (reference.searchParams.has("as_js_classic_library")) {
15279
- markAsJsClassicLibraryProxy(reference);
15280
- }
15281
- },
15282
- fetchUrlContent: async (urlInfo, context) => {
15283
- const [jsModuleReference, jsModuleUrlInfo] = context.getWithoutSearchParam({
15284
- urlInfo,
15285
- context,
15286
- searchParam: "as_js_classic_library",
15287
- // override the expectedType to "js_module"
15288
- // because when there is ?as_js_classic_library it means the underlying resource
15289
- // is a js_module
15290
- expectedType: "js_module"
15291
- });
15292
- if (!jsModuleReference) {
15293
- return null;
15294
- }
15295
- // cook it to get content + dependencies
15296
- await context.cook(jsModuleUrlInfo, {
15297
- reference: jsModuleReference
15298
- });
15299
- const loader = createUrlGraphLoader(context);
15300
- loader.loadReferencedUrlInfos(jsModuleUrlInfo, {
15301
- // we ignore dynamic import to cook lazyly (as browser request the server)
15302
- // these dynamic imports must inherit "?as_js_classic_library"
15303
- // This is done inside rollup for convenience
15304
- ignoreDynamicImport: true
15305
- });
15306
- await loader.getAllLoadDonePromise();
15307
- const bundleUrlInfos = await bundleJsModules({
15308
- jsModuleUrlInfos: [jsModuleUrlInfo],
15309
- context: {
15310
- ...context,
15311
- buildDirectoryUrl: new URL("./", import.meta.url)
15312
- },
15313
- preserveDynamicImport: true
15314
- });
15315
- const jsModuleBundledUrlInfo = bundleUrlInfos[jsModuleUrlInfo.url];
15316
- if (context.dev) {
15317
- jsModuleBundledUrlInfo.sourceUrls.forEach(sourceUrl => {
15318
- context.referenceUtils.inject({
15319
- type: "js_url",
15320
- specifier: sourceUrl,
15321
- isImplicit: true
15322
- });
15323
- });
15324
- } else if (context.build) {
15325
- jsModuleBundledUrlInfo.sourceUrls.forEach(sourceUrl => {
15326
- const sourceUrlInfo = context.urlGraph.getUrlInfo(sourceUrl);
15327
- if (sourceUrlInfo && sourceUrlInfo.dependents.size === 0) {
15328
- context.urlGraph.deleteUrlInfo(sourceUrl);
15329
- }
15330
- });
15331
- }
15332
- const {
15333
- content,
15334
- sourcemap
15335
- } = await convertJsModuleToJsClassic({
15336
- rootDirectoryUrl: context.rootDirectoryUrl,
15337
- systemJsInjection,
15338
- systemJsClientFileUrl,
15339
- urlInfo,
15340
- jsModuleUrlInfo: jsModuleBundledUrlInfo
15341
- });
15342
- return {
15343
- content,
15344
- contentType: "text/javascript",
15345
- type: "js_classic",
15346
- originalUrl: urlInfo.originalUrl,
15347
- originalContent: jsModuleUrlInfo.originalContent,
15348
- sourcemap,
15349
- data: jsModuleUrlInfo.data
15350
- };
15351
- }
15352
- };
15353
- };
15354
-
15355
- const jsenvPluginAsJsClassic = ({
15356
- jsClassicLibrary,
15357
- jsClassicFallback,
15358
- systemJsInjection
15265
+ const jsenvPluginJsModuleFallback = ({
15266
+ systemJsInjection = true,
15267
+ systemJsClientFileUrl = systemJsClientFileUrlDefault
15359
15268
  }) => {
15360
- const systemJsClientFileUrl = new URL("./js/s.js", import.meta.url).href;
15361
- const generateJsClassicFilename = url => {
15362
- const filename = urlToFilename$1(url);
15363
- let [basename, extension] = splitFileExtension(filename);
15364
- const {
15365
- searchParams
15366
- } = new URL(url);
15367
- if (searchParams.has("as_json_module") || searchParams.has("as_css_module") || searchParams.has("as_text_module")) {
15368
- extension = ".js";
15369
- }
15370
- return `${basename}.nomodule${extension}`;
15371
- };
15372
- const splitFileExtension = filename => {
15373
- const dotLastIndex = filename.lastIndexOf(".");
15374
- if (dotLastIndex === -1) {
15375
- return [filename, ""];
15376
- }
15377
- return [filename.slice(0, dotLastIndex), filename.slice(dotLastIndex)];
15378
- };
15379
- return [...(jsClassicLibrary ? [jsenvPluginAsJsClassicLibrary({
15380
- systemJsInjection,
15381
- systemJsClientFileUrl,
15382
- generateJsClassicFilename
15383
- })] : []), ...(jsClassicFallback ? [jsenvPluginAsJsClassicHtml({
15269
+ return [jsenvPluginJsModuleFallbackInsideHtml({
15384
15270
  systemJsInjection,
15385
15271
  systemJsClientFileUrl
15386
- }), jsenvPluginAsJsClassicWorkers(), jsenvPluginAsJsClassicConversion({
15272
+ }), jsenvPluginJsModuleFallbackOnWorkers(), jsenvPluginJsModuleConversion({
15387
15273
  systemJsInjection,
15388
15274
  systemJsClientFileUrl,
15389
15275
  generateJsClassicFilename
15390
- })] : [])];
15276
+ })];
15277
+ };
15278
+ const generateJsClassicFilename = url => {
15279
+ const filename = urlToFilename$1(url);
15280
+ let [basename, extension] = splitFileExtension$2(filename);
15281
+ const {
15282
+ searchParams
15283
+ } = new URL(url);
15284
+ if (searchParams.has("as_json_module") || searchParams.has("as_css_module") || searchParams.has("as_text_module")) {
15285
+ extension = ".js";
15286
+ }
15287
+ return `${basename}.nomodule${extension}`;
15288
+ };
15289
+ const splitFileExtension$2 = filename => {
15290
+ const dotLastIndex = filename.lastIndexOf(".");
15291
+ if (dotLastIndex === -1) {
15292
+ return [filename, ""];
15293
+ }
15294
+ return [filename.slice(0, dotLastIndex), filename.slice(dotLastIndex)];
15391
15295
  };
15392
15296
 
15393
15297
  // duplicated from @jsenv/log to avoid the dependency
@@ -19953,12 +19857,10 @@ const jsenvPluginImportMetaResolve = () => {
19953
19857
  const jsenvPluginTranspilation = ({
19954
19858
  importAssertions = true,
19955
19859
  css = true,
19956
- jsClassicLibrary = true,
19957
- // build sets jsClassicFallback: false during first step of the build
19860
+ // build sets jsModuleFallbackOnJsClassic: false during first step of the build
19958
19861
  // and re-enable it in the second phase (when performing the bundling)
19959
19862
  // so that bundling is applied on js modules THEN it is converted to js classic if needed
19960
- jsClassicFallback = true,
19961
- systemJsInjection = true,
19863
+ jsModuleFallbackOnJsClassic = true,
19962
19864
  topLevelAwait = true,
19963
19865
  importMetaResolve = true,
19964
19866
  babelHelpersAsImport = true,
@@ -19967,18 +19869,17 @@ const jsenvPluginTranspilation = ({
19967
19869
  if (importAssertions === true) {
19968
19870
  importAssertions = {};
19969
19871
  }
19872
+ if (jsModuleFallbackOnJsClassic === true) {
19873
+ jsModuleFallbackOnJsClassic = {};
19874
+ }
19970
19875
  return [...(importMetaResolve ? [jsenvPluginImportMetaResolve()] : []), ...(importAssertions ? [jsenvPluginImportAssertions(importAssertions)] : []),
19971
19876
  // babel also so that rollup can bundle babel helpers for instance
19972
19877
  jsenvPluginBabel({
19973
19878
  topLevelAwait,
19974
19879
  getCustomBabelPlugins,
19975
19880
  babelHelpersAsImport
19976
- }), jsenvPluginAsJsClassic({
19977
- jsClassicLibrary,
19978
- jsClassicFallback,
19979
- systemJsInjection
19980
- }), jsenvPluginAsJsModule(),
19981
- // topLevelAwait must come after jsenvPluginAsJsClassic because it's related to the module format
19881
+ }), ...(jsModuleFallbackOnJsClassic ? [jsenvPluginJsModuleFallback(jsModuleFallbackOnJsClassic)] : []), jsenvPluginAsJsModule(),
19882
+ // topLevelAwait must come after jsModuleFallback because it's related to the module format
19982
19883
  // so we want to wait to know the module format before transforming things related to top level await
19983
19884
  ...(topLevelAwait ? [jsenvPluginTopLevelAwait()] : []), ...(css ? [jsenvPluginCssTranspilation()] : [])];
19984
19885
  };
@@ -20771,9 +20672,9 @@ const jsenvPluginRibbon = ({
20771
20672
  tagName: "script",
20772
20673
  type: "module",
20773
20674
  textContent: `
20774
- import { injectRibbon } from "${ribbonClientFileReference.generatedSpecifier}"
20775
-
20776
- injectRibbon(${paramsJson})
20675
+ import { injectRibbon } from "${ribbonClientFileReference.generatedSpecifier}"
20676
+
20677
+ injectRibbon(${paramsJson})
20777
20678
  `
20778
20679
  });
20779
20680
  injectHtmlNode(htmlAst, scriptNode, "jsenv:ribbon");
@@ -21350,7 +21251,7 @@ build "${entryPointKeys[0]}"`);
21350
21251
  logger.info(`
21351
21252
  build ${entryPointKeys.length} entry points`);
21352
21253
  }
21353
- const useExplicitJsClassicConversion = entryPointKeys.some(key => entryPoints[key].includes("?as_js_classic"));
21254
+ const explicitJsModuleFallback = entryPointKeys.some(key => entryPoints[key].includes("?js_module_fallback"));
21354
21255
  const rawRedirections = new Map();
21355
21256
  const bundleRedirections = new Map();
21356
21257
  const bundleInternalRedirections = new Map();
@@ -21401,8 +21302,8 @@ build ${entryPointKeys.length} entry points`);
21401
21302
  directoryReferenceAllowed,
21402
21303
  transpilation: {
21403
21304
  ...transpilation,
21404
- babelHelpersAsImport: !useExplicitJsClassicConversion,
21405
- jsClassicFallback: false
21305
+ babelHelpersAsImport: !explicitJsModuleFallback,
21306
+ jsModuleFallbackOnJsClassic: false
21406
21307
  },
21407
21308
  scenarioPlaceholders
21408
21309
  })],
@@ -21440,9 +21341,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21440
21341
  build: true,
21441
21342
  runtimeCompat,
21442
21343
  ...contextSharedDuringBuild,
21443
- plugins: [urlAnalysisPlugin, ...(lineBreakNormalization ? [jsenvPluginLineBreakNormalization()] : []), jsenvPluginAsJsClassic({
21444
- jsClassicLibrary: false,
21445
- jsClassicFallback: true,
21344
+ plugins: [urlAnalysisPlugin, ...(lineBreakNormalization ? [jsenvPluginLineBreakNormalization()] : []), jsenvPluginJsModuleFallback({
21446
21345
  systemJsInjection: true
21447
21346
  }), jsenvPluginInline({
21448
21347
  fetchInlineUrls: false
@@ -21506,9 +21405,9 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21506
21405
  associateBuildUrlAndRawUrl(buildUrl, rawUrlInfo.url, "inline content");
21507
21406
  return buildUrl;
21508
21407
  }
21509
- // from "js_module_as_js_classic":
21510
- // - injecting "?as_js_classic" for the first time
21511
- // - injecting "?as_js_classic" because the parentUrl has it
21408
+ // from "js_module_fallback":
21409
+ // - injecting "?js_module_fallback" for the first time
21410
+ // - injecting "?js_module_fallback" because the parentUrl has it
21512
21411
  if (reference.original) {
21513
21412
  const urlBeforeRedirect = reference.original.url;
21514
21413
  const urlAfterRedirect = reference.url;
@@ -21540,7 +21439,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21540
21439
  associateBuildUrlAndRawUrl(buildUrl, rawUrl, "redirected during postbuild");
21541
21440
  return buildUrl;
21542
21441
  }
21543
- // from "js_module_as_js_classic":
21442
+ // from "js_module_fallback":
21544
21443
  // - to inject "s.js"
21545
21444
  if (reference.injected) {
21546
21445
  const buildUrl = buildUrlsGenerator.generate(reference.url, {
@@ -21558,7 +21457,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21558
21457
  // files from root directory but not given to rollup nor postcss
21559
21458
  if (rawUrlInfo) {
21560
21459
  const referencedUrlObject = new URL(reference.url);
21561
- referencedUrlObject.searchParams.delete("as_js_classic_library");
21460
+ referencedUrlObject.searchParams.delete("as_js_classic");
21562
21461
  const buildUrl = buildUrlsGenerator.generate(referencedUrlObject.href, {
21563
21462
  urlInfo: rawUrlInfo,
21564
21463
  parentUrlInfo
@@ -21600,8 +21499,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21600
21499
  const generatedUrlObject = new URL(reference.generatedUrl);
21601
21500
  generatedUrlObject.searchParams.delete("js_classic");
21602
21501
  generatedUrlObject.searchParams.delete("js_module");
21502
+ generatedUrlObject.searchParams.delete("js_module_fallback");
21603
21503
  generatedUrlObject.searchParams.delete("as_js_classic");
21604
- generatedUrlObject.searchParams.delete("as_js_classic_library");
21605
21504
  generatedUrlObject.searchParams.delete("as_js_module");
21606
21505
  generatedUrlObject.searchParams.delete("as_json_module");
21607
21506
  generatedUrlObject.searchParams.delete("as_css_module");
@@ -21648,7 +21547,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21648
21547
  reference
21649
21548
  } = context;
21650
21549
  // reference injected during "postbuild":
21651
- // - happens for "as_js_classic" injecting "s.js"
21550
+ // - happens for "js_module_fallback" injecting "s.js"
21652
21551
  if (reference.injected) {
21653
21552
  const [ref, rawUrlInfo] = rawGraphKitchen.injectReference({
21654
21553
  ...reference,
@@ -21663,7 +21562,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21663
21562
  return fromBundleOrRawGraph(reference.url);
21664
21563
  }
21665
21564
  // reference updated during "postbuild":
21666
- // - happens for "as_js_classic"
21565
+ // - happens for "js_module_fallback"
21667
21566
  if (reference.original) {
21668
21567
  return fromBundleOrRawGraph(reference.original.url);
21669
21568
  }
@@ -21753,7 +21652,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21753
21652
  // cleanup unused urls (avoid bundling things that are not actually used)
21754
21653
  // happens for:
21755
21654
  // - js import assertions
21756
- // - as_js_classic_library
21655
+ // - as_js_classic
21757
21656
  if (!isUsed(rawUrlInfo)) {
21758
21657
  rawGraph.deleteUrlInfo(rawUrlInfo.url);
21759
21658
  return;
@@ -22078,10 +21977,10 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
22078
21977
  }
22079
21978
  versionMap.set(urlInfo.url, version);
22080
21979
  const buildUrlObject = new URL(urlInfo.url);
22081
- // remove ?as_js_classic as
21980
+ // remove ?js_module_fallback
22082
21981
  // this information is already hold into ".nomodule"
21982
+ buildUrlObject.searchParams.delete("js_module_fallback");
22083
21983
  buildUrlObject.searchParams.delete("as_js_classic");
22084
- buildUrlObject.searchParams.delete("as_js_classic_library");
22085
21984
  buildUrlObject.searchParams.delete("as_js_module");
22086
21985
  buildUrlObject.searchParams.delete("as_json_module");
22087
21986
  buildUrlObject.searchParams.delete("as_css_module");
@@ -22464,7 +22363,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
22464
22363
  const buildInlineRelativeUrls = [];
22465
22364
  const getBuildRelativeUrl = url => {
22466
22365
  const urlObject = new URL(url);
22467
- urlObject.searchParams.delete("as_js_classic");
22366
+ urlObject.searchParams.delete("js_module_fallback");
22468
22367
  urlObject.searchParams.delete("as_css_module");
22469
22368
  urlObject.searchParams.delete("as_json_module");
22470
22369
  urlObject.searchParams.delete("as_text_module");
@@ -23054,7 +22953,7 @@ const createFileService = ({
23054
22953
  if (code === "PARSE_ERROR") {
23055
22954
  // when possible let browser re-throw the syntax error
23056
22955
  // it's not possible to do that when url info content is not available
23057
- // (happens for as_js_classic library for instance)
22956
+ // (happens for as_js_classic for instance)
23058
22957
  if (urlInfo.content !== undefined) {
23059
22958
  return {
23060
22959
  url: reference.url,
@@ -24975,7 +24874,7 @@ const executeSteps = async (executionSteps, {
24975
24874
  }
24976
24875
  const isLastExecutionLog = executionIndex === executionSteps.length - 1;
24977
24876
  const cancelRemaining = failFast && executionResult.status !== "completed" && counters.done < counters.total;
24978
- if (isLastExecutionLog) {
24877
+ if (isLastExecutionLog && logger.levels.info) {
24979
24878
  executionLog.write("\n");
24980
24879
  }
24981
24880
  if (cancelRemaining) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "34.1.5",
3
+ "version": "34.2.0",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -72,7 +72,6 @@
72
72
  "@jsenv/integrity": "0.0.1",
73
73
  "@jsenv/log": "3.3.4",
74
74
  "@jsenv/node-esm-resolution": "1.0.1",
75
- "@jsenv/plugin-bundling": "2.1.5",
76
75
  "@jsenv/server": "15.0.2",
77
76
  "@jsenv/sourcemap": "1.0.10",
78
77
  "@jsenv/uneval": "1.6.0",
@@ -106,6 +105,7 @@
106
105
  "@jsenv/plugin-globals": "./packages/jsenv-plugin-globals/",
107
106
  "@jsenv/plugin-minification": "./packages/jsenv-plugin-minification/",
108
107
  "@jsenv/plugin-placeholders": "./packages/jsenv-plugin-placeholders/",
108
+ "@jsenv/plugin-as-js-classic": "./packages/jsenv-plugin-as-js-classic/",
109
109
  "eslint": "8.38.0",
110
110
  "eslint-plugin-html": "7.1.0",
111
111
  "eslint-plugin-import": "2.27.5",
@@ -66,7 +66,7 @@ import {
66
66
  } from "../kitchen/web_workers.js"
67
67
  import { jsenvPluginUrlAnalysis } from "../plugins/url_analysis/jsenv_plugin_url_analysis.js"
68
68
  import { jsenvPluginInline } from "../plugins/inline/jsenv_plugin_inline.js"
69
- import { jsenvPluginAsJsClassic } from "../plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js"
69
+ import { jsenvPluginJsModuleFallback } from "../plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_fallback.js"
70
70
  import { getCorePlugins } from "../plugins/plugins.js"
71
71
  import { jsenvPluginLineBreakNormalization } from "./jsenv_plugin_line_break_normalization.js"
72
72
 
@@ -274,8 +274,8 @@ build "${entryPointKeys[0]}"`)
274
274
  logger.info(`
275
275
  build ${entryPointKeys.length} entry points`)
276
276
  }
277
- const useExplicitJsClassicConversion = entryPointKeys.some((key) =>
278
- entryPoints[key].includes("?as_js_classic"),
277
+ const explicitJsModuleFallback = entryPointKeys.some((key) =>
278
+ entryPoints[key].includes("?js_module_fallback"),
279
279
  )
280
280
  const rawRedirections = new Map()
281
281
  const bundleRedirections = new Map()
@@ -344,8 +344,8 @@ build ${entryPointKeys.length} entry points`)
344
344
  directoryReferenceAllowed,
345
345
  transpilation: {
346
346
  ...transpilation,
347
- babelHelpersAsImport: !useExplicitJsClassicConversion,
348
- jsClassicFallback: false,
347
+ babelHelpersAsImport: !explicitJsModuleFallback,
348
+ jsModuleFallbackOnJsClassic: false,
349
349
  },
350
350
  scenarioPlaceholders,
351
351
  }),
@@ -393,9 +393,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
393
393
  ...(lineBreakNormalization
394
394
  ? [jsenvPluginLineBreakNormalization()]
395
395
  : []),
396
- jsenvPluginAsJsClassic({
397
- jsClassicLibrary: false,
398
- jsClassicFallback: true,
396
+ jsenvPluginJsModuleFallback({
399
397
  systemJsInjection: true,
400
398
  }),
401
399
  jsenvPluginInline({
@@ -471,9 +469,9 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
471
469
  )
472
470
  return buildUrl
473
471
  }
474
- // from "js_module_as_js_classic":
475
- // - injecting "?as_js_classic" for the first time
476
- // - injecting "?as_js_classic" because the parentUrl has it
472
+ // from "js_module_fallback":
473
+ // - injecting "?js_module_fallback" for the first time
474
+ // - injecting "?js_module_fallback" because the parentUrl has it
477
475
  if (reference.original) {
478
476
  const urlBeforeRedirect = reference.original.url
479
477
  const urlAfterRedirect = reference.url
@@ -511,7 +509,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
511
509
  )
512
510
  return buildUrl
513
511
  }
514
- // from "js_module_as_js_classic":
512
+ // from "js_module_fallback":
515
513
  // - to inject "s.js"
516
514
  if (reference.injected) {
517
515
  const buildUrl = buildUrlsGenerator.generate(reference.url, {
@@ -533,7 +531,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
533
531
  // files from root directory but not given to rollup nor postcss
534
532
  if (rawUrlInfo) {
535
533
  const referencedUrlObject = new URL(reference.url)
536
- referencedUrlObject.searchParams.delete("as_js_classic_library")
534
+ referencedUrlObject.searchParams.delete("as_js_classic")
537
535
  const buildUrl = buildUrlsGenerator.generate(
538
536
  referencedUrlObject.href,
539
537
  {
@@ -584,8 +582,8 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
584
582
  const generatedUrlObject = new URL(reference.generatedUrl)
585
583
  generatedUrlObject.searchParams.delete("js_classic")
586
584
  generatedUrlObject.searchParams.delete("js_module")
585
+ generatedUrlObject.searchParams.delete("js_module_fallback")
587
586
  generatedUrlObject.searchParams.delete("as_js_classic")
588
- generatedUrlObject.searchParams.delete("as_js_classic_library")
589
587
  generatedUrlObject.searchParams.delete("as_js_module")
590
588
  generatedUrlObject.searchParams.delete("as_json_module")
591
589
  generatedUrlObject.searchParams.delete("as_css_module")
@@ -632,7 +630,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
632
630
  }
633
631
  const { reference } = context
634
632
  // reference injected during "postbuild":
635
- // - happens for "as_js_classic" injecting "s.js"
633
+ // - happens for "js_module_fallback" injecting "s.js"
636
634
  if (reference.injected) {
637
635
  const [ref, rawUrlInfo] = rawGraphKitchen.injectReference({
638
636
  ...reference,
@@ -645,7 +643,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
645
643
  return fromBundleOrRawGraph(reference.url)
646
644
  }
647
645
  // reference updated during "postbuild":
648
- // - happens for "as_js_classic"
646
+ // - happens for "js_module_fallback"
649
647
  if (reference.original) {
650
648
  return fromBundleOrRawGraph(reference.original.url)
651
649
  }
@@ -750,7 +748,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
750
748
  // cleanup unused urls (avoid bundling things that are not actually used)
751
749
  // happens for:
752
750
  // - js import assertions
753
- // - as_js_classic_library
751
+ // - as_js_classic
754
752
  if (!isUsed(rawUrlInfo)) {
755
753
  rawGraph.deleteUrlInfo(rawUrlInfo.url)
756
754
  return
@@ -1126,10 +1124,10 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1126
1124
  }
1127
1125
  versionMap.set(urlInfo.url, version)
1128
1126
  const buildUrlObject = new URL(urlInfo.url)
1129
- // remove ?as_js_classic as
1127
+ // remove ?js_module_fallback
1130
1128
  // this information is already hold into ".nomodule"
1129
+ buildUrlObject.searchParams.delete("js_module_fallback")
1131
1130
  buildUrlObject.searchParams.delete("as_js_classic")
1132
- buildUrlObject.searchParams.delete("as_js_classic_library")
1133
1131
  buildUrlObject.searchParams.delete("as_js_module")
1134
1132
  buildUrlObject.searchParams.delete("as_json_module")
1135
1133
  buildUrlObject.searchParams.delete("as_css_module")
@@ -1599,7 +1597,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1599
1597
  const buildInlineRelativeUrls = []
1600
1598
  const getBuildRelativeUrl = (url) => {
1601
1599
  const urlObject = new URL(url)
1602
- urlObject.searchParams.delete("as_js_classic")
1600
+ urlObject.searchParams.delete("js_module_fallback")
1603
1601
  urlObject.searchParams.delete("as_css_module")
1604
1602
  urlObject.searchParams.delete("as_json_module")
1605
1603
  urlObject.searchParams.delete("as_text_module")
@@ -370,7 +370,7 @@ export const createFileService = ({
370
370
  if (code === "PARSE_ERROR") {
371
371
  // when possible let browser re-throw the syntax error
372
372
  // it's not possible to do that when url info content is not available
373
- // (happens for as_js_classic library for instance)
373
+ // (happens for as_js_classic for instance)
374
374
  if (urlInfo.content !== undefined) {
375
375
  return {
376
376
  url: reference.url,
@@ -87,9 +87,9 @@ export const createUrlInfoTransformer = ({
87
87
  // during build it's urlInfo.url to be inside the build
88
88
  // but otherwise it's generatedUrl to be inside .jsenv/ directory
89
89
  const generatedUrlObject = new URL(urlInfo.generatedUrl)
90
+ generatedUrlObject.searchParams.delete("js_module_fallback")
90
91
  generatedUrlObject.searchParams.delete("as_js_module")
91
92
  generatedUrlObject.searchParams.delete("as_js_classic")
92
- generatedUrlObject.searchParams.delete("as_js_classic_library")
93
93
  const urlForSourcemap = generatedUrlObject.href
94
94
  urlInfo.sourcemapGeneratedUrl = generateSourcemapFileUrl(urlForSourcemap)
95
95
 
@@ -116,7 +116,7 @@ ${e.traceMessage}`)
116
116
  if (
117
117
  !analyzeConvertedScripts &&
118
118
  getHtmlNodeAttribute(scriptNode, "jsenv-injected-by") ===
119
- "jsenv:as_js_classic_html"
119
+ "jsenv:js_module_fallback"
120
120
  ) {
121
121
  return
122
122
  }
@@ -51,9 +51,9 @@ export const jsenvPluginRibbon = ({
51
51
  tagName: "script",
52
52
  type: "module",
53
53
  textContent: `
54
- import { injectRibbon } from "${ribbonClientFileReference.generatedSpecifier}"
55
-
56
- injectRibbon(${paramsJson})
54
+ import { injectRibbon } from "${ribbonClientFileReference.generatedSpecifier}"
55
+
56
+ injectRibbon(${paramsJson})
57
57
  `,
58
58
  })
59
59
  injectHtmlNode(htmlAst, scriptNode, "jsenv:ribbon")
@@ -12,13 +12,17 @@ import { requireBabelPlugin } from "../babel/require_babel_plugin.js"
12
12
  import { babelPluginTransformImportMetaUrl } from "./helpers/babel_plugin_transform_import_meta_url.js"
13
13
  import { babelPluginTransformImportMetaResolve } from "./helpers/babel_plugin_transform_import_meta_resolve.js"
14
14
 
15
- // import { jsenvPluginAsJsClassicLibrary } from "./jsenv_plugin_as_js_classic_library.js"
16
15
  // because of https://github.com/rpetrich/babel-plugin-transform-async-to-promises/issues/84
17
16
  import customAsyncToPromises from "./async-to-promises.js"
18
17
 
18
+ export const systemJsClientFileUrlDefault = new URL(
19
+ "./client/s.js",
20
+ import.meta.url,
21
+ ).href
22
+
19
23
  export const convertJsModuleToJsClassic = async ({
20
24
  systemJsInjection,
21
- systemJsClientFileUrl,
25
+ systemJsClientFileUrl = systemJsClientFileUrlDefault,
22
26
  urlInfo,
23
27
  jsModuleUrlInfo,
24
28
  }) => {
@@ -1,12 +1,12 @@
1
1
  /*
2
- * - propagate ?as_js_classic to urls
3
- * - perform conversion from js module to js classic when url uses ?as_js_classic
2
+ * - propagate "?js_module_fallback" query string param on urls
3
+ * - perform conversion from js module to js classic when url uses "?js_module_fallback"
4
4
  */
5
5
 
6
6
  import { injectQueryParams } from "@jsenv/urls"
7
7
  import { convertJsModuleToJsClassic } from "./convert_js_module_to_js_classic.js"
8
8
 
9
- export const jsenvPluginAsJsClassicConversion = ({
9
+ export const jsenvPluginJsModuleConversion = ({
10
10
  systemJsInjection,
11
11
  systemJsClientFileUrl,
12
12
  generateJsClassicFilename,
@@ -25,37 +25,38 @@ export const jsenvPluginAsJsClassicConversion = ({
25
25
  return false
26
26
  }
27
27
 
28
- const shouldPropagateJsClassic = (reference, context) => {
28
+ const shouldPropagateJsModuleConversion = (reference, context) => {
29
29
  if (isReferencingJsModule(reference, context)) {
30
30
  const parentUrlInfo = context.urlGraph.getUrlInfo(reference.parentUrl)
31
31
  if (!parentUrlInfo) {
32
32
  return false
33
33
  }
34
34
  const parentGotAsJsClassic = new URL(parentUrlInfo.url).searchParams.has(
35
- "as_js_classic",
35
+ "js_module_fallback",
36
36
  )
37
37
  return parentGotAsJsClassic
38
38
  }
39
-
40
39
  return false
41
40
  }
41
+
42
42
  const markAsJsClassicProxy = (reference) => {
43
43
  reference.expectedType = "js_classic"
44
44
  reference.filename = generateJsClassicFilename(reference.url)
45
45
  }
46
+
46
47
  const turnIntoJsClassicProxy = (reference) => {
47
48
  const urlTransformed = injectQueryParams(reference.url, {
48
- as_js_classic: "",
49
+ js_module_fallback: "",
49
50
  })
50
51
  markAsJsClassicProxy(reference)
51
52
  return urlTransformed
52
53
  }
53
54
 
54
55
  return {
55
- name: "jsenv:as_js_classic_conversion",
56
+ name: "jsenv:js_module_conversion",
56
57
  appliesDuring: "*",
57
58
  redirectUrl: (reference, context) => {
58
- if (reference.searchParams.has("as_js_classic")) {
59
+ if (reference.searchParams.has("js_module_fallback")) {
59
60
  markAsJsClassicProxy(reference)
60
61
  return null
61
62
  }
@@ -65,7 +66,7 @@ export const jsenvPluginAsJsClassicConversion = ({
65
66
  // (because it's the transpiled equivalent of static and dynamic imports)
66
67
  // And not other references otherwise we could try to transform inline resources
67
68
  // or specifiers inside new URL()...
68
- if (shouldPropagateJsClassic(reference, context)) {
69
+ if (shouldPropagateJsModuleConversion(reference, context)) {
69
70
  return turnIntoJsClassicProxy(reference, context)
70
71
  }
71
72
  return null
@@ -75,9 +76,9 @@ export const jsenvPluginAsJsClassicConversion = ({
75
76
  context.getWithoutSearchParam({
76
77
  urlInfo,
77
78
  context,
78
- searchParam: "as_js_classic",
79
+ searchParam: "js_module_fallback",
79
80
  // override the expectedType to "js_module"
80
- // because when there is ?as_js_classic it means the underlying resource
81
+ // because when there is ?js_module_fallback it means the underlying resource
81
82
  // is a js_module
82
83
  expectedType: "js_module",
83
84
  })
@@ -0,0 +1,45 @@
1
+ import { urlToFilename } from "@jsenv/urls"
2
+ import { systemJsClientFileUrlDefault } from "./convert_js_module_to_js_classic.js"
3
+ import { jsenvPluginJsModuleConversion } from "./jsenv_plugin_js_module_conversion.js"
4
+ import { jsenvPluginJsModuleFallbackInsideHtml } from "./jsenv_plugin_js_module_fallback_inside_html.js"
5
+ import { jsenvPluginJsModuleFallbackOnWorkers } from "./jsenv_plugin_js_module_fallback_on_workers.js"
6
+
7
+ export const jsenvPluginJsModuleFallback = ({
8
+ systemJsInjection = true,
9
+ systemJsClientFileUrl = systemJsClientFileUrlDefault,
10
+ }) => {
11
+ return [
12
+ jsenvPluginJsModuleFallbackInsideHtml({
13
+ systemJsInjection,
14
+ systemJsClientFileUrl,
15
+ }),
16
+ jsenvPluginJsModuleFallbackOnWorkers(),
17
+ jsenvPluginJsModuleConversion({
18
+ systemJsInjection,
19
+ systemJsClientFileUrl,
20
+ generateJsClassicFilename,
21
+ }),
22
+ ]
23
+ }
24
+
25
+ const generateJsClassicFilename = (url) => {
26
+ const filename = urlToFilename(url)
27
+ let [basename, extension] = splitFileExtension(filename)
28
+ const { searchParams } = new URL(url)
29
+ if (
30
+ searchParams.has("as_json_module") ||
31
+ searchParams.has("as_css_module") ||
32
+ searchParams.has("as_text_module")
33
+ ) {
34
+ extension = ".js"
35
+ }
36
+ return `${basename}.nomodule${extension}`
37
+ }
38
+
39
+ const splitFileExtension = (filename) => {
40
+ const dotLastIndex = filename.lastIndexOf(".")
41
+ if (dotLastIndex === -1) {
42
+ return [filename, ""]
43
+ }
44
+ return [filename.slice(0, dotLastIndex), filename.slice(dotLastIndex)]
45
+ }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * when <script type="module"> cannot be used:
3
- * - ?as_js_classic is injected into the src of <script type="module">
3
+ * - ?js_module_fallback is injected into the src of <script type="module">
4
4
  * - js inside <script type="module"> is transformed into classic js
5
5
  * - <link rel="modulepreload"> are converted to <link rel="preload">
6
6
  */
@@ -19,16 +19,16 @@ import {
19
19
  import { injectQueryParams, urlToRelativeUrl } from "@jsenv/urls"
20
20
  import { SOURCEMAP } from "@jsenv/sourcemap"
21
21
 
22
- export const jsenvPluginAsJsClassicHtml = ({
22
+ export const jsenvPluginJsModuleFallbackInsideHtml = ({
23
23
  systemJsInjection,
24
24
  systemJsClientFileUrl,
25
25
  }) => {
26
26
  const turnIntoJsClassicProxy = (reference) => {
27
- return injectQueryParams(reference.url, { as_js_classic: "" })
27
+ return injectQueryParams(reference.url, { js_module_fallback: "" })
28
28
  }
29
29
 
30
30
  return {
31
- name: "jsenv:as_js_classic_html",
31
+ name: "jsenv:js_module_fallback_inside_html",
32
32
  appliesDuring: "*",
33
33
  redirectUrl: {
34
34
  link_href: (reference, context) => {
@@ -208,7 +208,7 @@ export const jsenvPluginAsJsClassicHtml = ({
208
208
  tagName: "script",
209
209
  textContent: systemJsUrlInfo.content,
210
210
  }),
211
- "jsenv:as_js_classic_html",
211
+ "jsenv:js_module_fallback",
212
212
  )
213
213
  })
214
214
  }
@@ -236,7 +236,7 @@ const isOrWasExpectingJsModule = (reference) => {
236
236
  const isExpectingJsModule = (reference) => {
237
237
  return (
238
238
  reference.expectedType === "js_module" ||
239
- reference.searchParams.has("as_js_classic") ||
240
- reference.searchParams.has("as_js_classic_library")
239
+ reference.searchParams.has("js_module_fallback") ||
240
+ reference.searchParams.has("as_js_classic")
241
241
  )
242
242
  }
@@ -13,7 +13,7 @@
13
13
 
14
14
  import { injectQueryParams } from "@jsenv/urls"
15
15
 
16
- export const jsenvPluginAsJsClassicWorkers = () => {
16
+ export const jsenvPluginJsModuleFallbackOnWorkers = () => {
17
17
  const turnIntoJsClassicProxy = (reference) => {
18
18
  reference.mutation = (magicSource) => {
19
19
  magicSource.replace({
@@ -22,11 +22,11 @@ export const jsenvPluginAsJsClassicWorkers = () => {
22
22
  replacement: JSON.stringify("classic"),
23
23
  })
24
24
  }
25
- return injectQueryParams(reference.url, { as_js_classic: "" })
25
+ return injectQueryParams(reference.url, { js_module_fallback: "" })
26
26
  }
27
27
 
28
28
  return {
29
- name: "jsenv:as_js_classic_workers",
29
+ name: "jsenv:js_module_fallback_on_workers",
30
30
  appliesDuring: "*",
31
31
  redirectUrl: {
32
32
  js_url: (reference, context) => {
@@ -9,7 +9,7 @@
9
9
 
10
10
  import { jsenvPluginCssTranspilation } from "./css/jsenv_plugin_css_transpilation.js"
11
11
  import { jsenvPluginImportAssertions } from "./import_assertions/jsenv_plugin_import_assertions.js"
12
- import { jsenvPluginAsJsClassic } from "./as_js_classic/jsenv_plugin_as_js_classic.js"
12
+ import { jsenvPluginJsModuleFallback } from "./js_module_fallback/jsenv_plugin_js_module_fallback.js"
13
13
  import { jsenvPluginAsJsModule } from "./as_js_module/jsenv_plugin_as_js_module.js"
14
14
  import { jsenvPluginBabel } from "./babel/jsenv_plugin_babel.js"
15
15
  import { jsenvPluginTopLevelAwait } from "./jsenv_plugin_top_level_await.js"
@@ -18,12 +18,10 @@ import { jsenvPluginImportMetaResolve } from "./jsenv_plugin_import_meta_resolve
18
18
  export const jsenvPluginTranspilation = ({
19
19
  importAssertions = true,
20
20
  css = true,
21
- jsClassicLibrary = true,
22
- // build sets jsClassicFallback: false during first step of the build
21
+ // build sets jsModuleFallbackOnJsClassic: false during first step of the build
23
22
  // and re-enable it in the second phase (when performing the bundling)
24
23
  // so that bundling is applied on js modules THEN it is converted to js classic if needed
25
- jsClassicFallback = true,
26
- systemJsInjection = true,
24
+ jsModuleFallbackOnJsClassic = true,
27
25
  topLevelAwait = true,
28
26
  importMetaResolve = true,
29
27
  babelHelpersAsImport = true,
@@ -32,6 +30,9 @@ export const jsenvPluginTranspilation = ({
32
30
  if (importAssertions === true) {
33
31
  importAssertions = {}
34
32
  }
33
+ if (jsModuleFallbackOnJsClassic === true) {
34
+ jsModuleFallbackOnJsClassic = {}
35
+ }
35
36
  return [
36
37
  ...(importMetaResolve ? [jsenvPluginImportMetaResolve()] : []),
37
38
  ...(importAssertions
@@ -43,13 +44,11 @@ export const jsenvPluginTranspilation = ({
43
44
  getCustomBabelPlugins,
44
45
  babelHelpersAsImport,
45
46
  }),
46
- jsenvPluginAsJsClassic({
47
- jsClassicLibrary,
48
- jsClassicFallback,
49
- systemJsInjection,
50
- }),
47
+ ...(jsModuleFallbackOnJsClassic
48
+ ? [jsenvPluginJsModuleFallback(jsModuleFallbackOnJsClassic)]
49
+ : []),
51
50
  jsenvPluginAsJsModule(),
52
- // topLevelAwait must come after jsenvPluginAsJsClassic because it's related to the module format
51
+ // topLevelAwait must come after jsModuleFallback because it's related to the module format
53
52
  // so we want to wait to know the module format before transforming things related to top level await
54
53
  ...(topLevelAwait ? [jsenvPluginTopLevelAwait(topLevelAwait)] : []),
55
54
  ...(css ? [jsenvPluginCssTranspilation()] : []),
@@ -11,8 +11,8 @@ export const jsenvPluginReferenceExpectedTypes = () => {
11
11
  if (searchParams.has("js_classic")) {
12
12
  reference.expectedType = "js_classic"
13
13
  } else if (
14
- searchParams.has("as_js_classic") ||
15
- searchParams.has("as_js_classic_library")
14
+ searchParams.has("js_module_fallback") ||
15
+ searchParams.has("as_js_classic")
16
16
  ) {
17
17
  reference.expectedType = "js_classic"
18
18
  } else if (searchParams.has("as_js_module")) {
@@ -309,7 +309,7 @@ export const executeSteps = async (
309
309
  failFast &&
310
310
  executionResult.status !== "completed" &&
311
311
  counters.done < counters.total
312
- if (isLastExecutionLog) {
312
+ if (isLastExecutionLog && logger.levels.info) {
313
313
  executionLog.write("\n")
314
314
  }
315
315
 
@@ -1,61 +0,0 @@
1
- import { urlToFilename } from "@jsenv/urls"
2
- import { jsenvPluginAsJsClassicConversion } from "./jsenv_plugin_as_js_classic_conversion.js"
3
- import { jsenvPluginAsJsClassicHtml } from "./jsenv_plugin_as_js_classic_html.js"
4
- import { jsenvPluginAsJsClassicWorkers } from "./jsenv_plugin_as_js_classic_workers.js"
5
- import { jsenvPluginAsJsClassicLibrary } from "./jsenv_plugin_as_js_classic_library.js"
6
-
7
- export const jsenvPluginAsJsClassic = ({
8
- jsClassicLibrary,
9
- jsClassicFallback,
10
- systemJsInjection,
11
- }) => {
12
- const systemJsClientFileUrl = new URL("./client/s.js", import.meta.url).href
13
-
14
- const generateJsClassicFilename = (url) => {
15
- const filename = urlToFilename(url)
16
- let [basename, extension] = splitFileExtension(filename)
17
- const { searchParams } = new URL(url)
18
- if (
19
- searchParams.has("as_json_module") ||
20
- searchParams.has("as_css_module") ||
21
- searchParams.has("as_text_module")
22
- ) {
23
- extension = ".js"
24
- }
25
- return `${basename}.nomodule${extension}`
26
- }
27
-
28
- const splitFileExtension = (filename) => {
29
- const dotLastIndex = filename.lastIndexOf(".")
30
- if (dotLastIndex === -1) {
31
- return [filename, ""]
32
- }
33
- return [filename.slice(0, dotLastIndex), filename.slice(dotLastIndex)]
34
- }
35
-
36
- return [
37
- ...(jsClassicLibrary
38
- ? [
39
- jsenvPluginAsJsClassicLibrary({
40
- systemJsInjection,
41
- systemJsClientFileUrl,
42
- generateJsClassicFilename,
43
- }),
44
- ]
45
- : []),
46
- ...(jsClassicFallback
47
- ? [
48
- jsenvPluginAsJsClassicHtml({
49
- systemJsInjection,
50
- systemJsClientFileUrl,
51
- }),
52
- jsenvPluginAsJsClassicWorkers(),
53
- jsenvPluginAsJsClassicConversion({
54
- systemJsInjection,
55
- systemJsClientFileUrl,
56
- generateJsClassicFilename,
57
- }),
58
- ]
59
- : []),
60
- ]
61
- }
@@ -1,91 +0,0 @@
1
- import { bundleJsModules } from "@jsenv/plugin-bundling"
2
-
3
- import { createUrlGraphLoader } from "@jsenv/core/src/kitchen/url_graph/url_graph_loader.js"
4
- import { convertJsModuleToJsClassic } from "./convert_js_module_to_js_classic.js"
5
-
6
- export const jsenvPluginAsJsClassicLibrary = ({
7
- systemJsInjection,
8
- systemJsClientFileUrl,
9
- generateJsClassicFilename,
10
- }) => {
11
- const markAsJsClassicLibraryProxy = (reference) => {
12
- reference.expectedType = "js_classic"
13
- reference.filename = generateJsClassicFilename(reference.url)
14
- }
15
-
16
- return {
17
- name: "jsenv:as_js_classic_library",
18
- appliesDuring: "*",
19
- redirectUrl: (reference) => {
20
- if (reference.searchParams.has("as_js_classic_library")) {
21
- markAsJsClassicLibraryProxy(reference)
22
- }
23
- },
24
- fetchUrlContent: async (urlInfo, context) => {
25
- const [jsModuleReference, jsModuleUrlInfo] =
26
- context.getWithoutSearchParam({
27
- urlInfo,
28
- context,
29
- searchParam: "as_js_classic_library",
30
- // override the expectedType to "js_module"
31
- // because when there is ?as_js_classic_library it means the underlying resource
32
- // is a js_module
33
- expectedType: "js_module",
34
- })
35
- if (!jsModuleReference) {
36
- return null
37
- }
38
- // cook it to get content + dependencies
39
- await context.cook(jsModuleUrlInfo, { reference: jsModuleReference })
40
- const loader = createUrlGraphLoader(context)
41
- loader.loadReferencedUrlInfos(jsModuleUrlInfo, {
42
- // we ignore dynamic import to cook lazyly (as browser request the server)
43
- // these dynamic imports must inherit "?as_js_classic_library"
44
- // This is done inside rollup for convenience
45
- ignoreDynamicImport: true,
46
- })
47
- await loader.getAllLoadDonePromise()
48
- const bundleUrlInfos = await bundleJsModules({
49
- jsModuleUrlInfos: [jsModuleUrlInfo],
50
- context: {
51
- ...context,
52
- buildDirectoryUrl: new URL("./", import.meta.url),
53
- },
54
- preserveDynamicImport: true,
55
- })
56
- const jsModuleBundledUrlInfo = bundleUrlInfos[jsModuleUrlInfo.url]
57
- if (context.dev) {
58
- jsModuleBundledUrlInfo.sourceUrls.forEach((sourceUrl) => {
59
- context.referenceUtils.inject({
60
- type: "js_url",
61
- specifier: sourceUrl,
62
- isImplicit: true,
63
- })
64
- })
65
- } else if (context.build) {
66
- jsModuleBundledUrlInfo.sourceUrls.forEach((sourceUrl) => {
67
- const sourceUrlInfo = context.urlGraph.getUrlInfo(sourceUrl)
68
- if (sourceUrlInfo && sourceUrlInfo.dependents.size === 0) {
69
- context.urlGraph.deleteUrlInfo(sourceUrl)
70
- }
71
- })
72
- }
73
- const { content, sourcemap } = await convertJsModuleToJsClassic({
74
- rootDirectoryUrl: context.rootDirectoryUrl,
75
- systemJsInjection,
76
- systemJsClientFileUrl,
77
- urlInfo,
78
- jsModuleUrlInfo: jsModuleBundledUrlInfo,
79
- })
80
- return {
81
- content,
82
- contentType: "text/javascript",
83
- type: "js_classic",
84
- originalUrl: urlInfo.originalUrl,
85
- originalContent: jsModuleUrlInfo.originalContent,
86
- sourcemap,
87
- data: jsModuleUrlInfo.data,
88
- }
89
- },
90
- }
91
- }