@jsenv/core 27.0.0-alpha.11 → 27.0.0-alpha.14

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 (125) hide show
  1. package/main.js +4 -0
  2. package/package.json +17 -14
  3. package/readme.md +4 -12
  4. package/src/build/build.js +451 -388
  5. package/src/build/build_urls_generator.js +23 -20
  6. package/src/build/graph_utils.js +31 -0
  7. package/src/build/{inject_version_mappings.js → inject_global_version_mappings.js} +31 -14
  8. package/src/build/inject_service_worker_urls.js +66 -12
  9. package/src/build/resync_ressource_hints.js +83 -0
  10. package/src/build/start_build_server.js +193 -0
  11. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +2 -2
  12. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  13. package/src/dev/start_dev_server.js +16 -22
  14. package/src/execute/execute.js +19 -6
  15. package/src/execute/run.js +17 -54
  16. package/src/execute/runtimes/browsers/from_playwright.js +167 -146
  17. package/src/execute/runtimes/node/node_process.js +281 -37
  18. package/src/omega/{runtime_support/default_runtime_support.js → compat/default_runtime_compat.js} +3 -5
  19. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  20. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  21. package/src/omega/errors.js +51 -58
  22. package/src/omega/fetched_content_compliance.js +24 -0
  23. package/src/omega/kitchen.js +403 -283
  24. package/src/omega/server/file_service.js +9 -11
  25. package/src/omega/url_graph/url_graph_load.js +13 -7
  26. package/src/omega/url_graph/url_graph_report.js +7 -5
  27. package/src/omega/url_graph.js +22 -10
  28. package/src/omega/web_workers.js +42 -0
  29. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  30. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +2 -2
  31. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  32. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  33. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +41 -0
  34. package/src/{dev/plugins/autoreload/jsenv_plugin_autoreload.js → plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js} +25 -166
  35. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +25 -0
  36. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  37. package/src/plugins/bundling/css/bundle_css.js +17 -0
  38. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  39. package/src/{build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js → plugins/bundling/js_module/bundle_js_module.js} +100 -75
  40. package/src/plugins/bundling/jsenv_plugin_bundling.js +51 -0
  41. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +48 -41
  42. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +66 -0
  43. package/src/{omega/core_plugins → plugins}/filesystem_magic/jsenv_plugin_filesystem_magic.js +7 -4
  44. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  45. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  46. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_installer.js +3 -2
  47. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_setup.js +0 -0
  48. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  49. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  50. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +38 -46
  51. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  52. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  53. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  54. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +2 -2
  55. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +98 -0
  56. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +26 -8
  57. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  58. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  59. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +37 -31
  60. package/src/{omega/core_plugins → plugins}/inject_globals/jsenv_plugin_inject_globals.js +5 -7
  61. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  62. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +18 -14
  63. package/src/{omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js → plugins/inline/jsenv_plugin_html_inline_content.js} +61 -40
  64. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  65. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +6 -6
  66. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +263 -0
  67. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  68. package/src/plugins/minification/css/minify_css.js +9 -0
  69. package/src/plugins/minification/html/minify_html.js +15 -0
  70. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  71. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  72. package/src/plugins/minification/json/minify_json.js +8 -0
  73. package/src/{omega/core_plugins → plugins}/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +15 -15
  74. package/src/{omega → plugins}/plugin_controller.js +18 -10
  75. package/src/plugins/plugins.js +73 -0
  76. package/src/plugins/transpilation/as_js_classic/client/s.js +808 -0
  77. package/src/plugins/transpilation/as_js_classic/client/s.js.md +1 -0
  78. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  79. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  80. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +191 -0
  81. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_script_type_module_as_classic.js +156 -0
  82. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_top_level_await.js +37 -0
  83. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_workers_type_module_as_classic.js +133 -0
  84. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  85. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  86. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  87. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +3 -21
  88. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  89. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +29 -27
  90. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +0 -0
  91. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/.eslintrc.cjs +0 -0
  92. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  93. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  94. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  95. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  96. package/src/{omega/core_plugins → plugins/transpilation}/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -0
  97. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +243 -0
  98. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +40 -0
  99. package/src/plugins/url_references/css/css_urls.js +49 -0
  100. package/src/plugins/url_references/html/html_urls.js +273 -0
  101. package/src/plugins/url_references/js/js_urls.js +170 -0
  102. package/src/plugins/url_references/jsenv_plugin_url_references.js +18 -0
  103. package/src/plugins/url_references/webmanifest/webmanifest_urls.js +17 -0
  104. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +12 -5
  105. package/src/{omega/core_plugins → plugins}/url_version/jsenv_plugin_url_version.js +8 -8
  106. package/src/test/execute_plan.js +23 -11
  107. package/src/test/execute_test_plan.js +9 -6
  108. package/src/test/logs_file_execution.js +8 -7
  109. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  110. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  111. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  112. package/src/execute/runtimes/node/controlled_process.js +0 -316
  113. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  114. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  115. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  116. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  117. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  118. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  119. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  120. package/src/omega/core_plugins.js +0 -42
  121. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  122. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  123. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  124. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  125. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -0,0 +1,12 @@
1
+ export const jsenvPluginHttpUrls = () => {
2
+ return {
3
+ name: "jsenv:http_urls",
4
+ appliesDuring: "*",
5
+ fetchUrlContent: (urlInfo) => {
6
+ if (urlInfo.url.startsWith("http") || urlInfo.url.startsWith("https")) {
7
+ return { external: true }
8
+ }
9
+ return null
10
+ },
11
+ }
12
+ }
@@ -16,13 +16,12 @@ export const babelPluginMetadataImportMetaHot = () => {
16
16
  }
17
17
  }
18
18
  const collectImportMetaProperties = (programPath) => {
19
- let importMetaHotDetected = false
19
+ const importMetaHotPaths = []
20
20
  let hotDecline = false
21
21
  let hotAcceptSelf = false
22
22
  let hotAcceptDependencies = []
23
23
  programPath.traverse({
24
24
  MemberExpression(path) {
25
- if (importMetaHotDetected) return
26
25
  const { node } = path
27
26
  const { object } = node
28
27
  if (object.type !== "MetaProperty") {
@@ -35,7 +34,7 @@ const collectImportMetaProperties = (programPath) => {
35
34
  const { property } = node
36
35
  const { name } = property
37
36
  if (name === "hot") {
38
- importMetaHotDetected = true
37
+ importMetaHotPaths.push(path)
39
38
  }
40
39
  },
41
40
  CallExpression(path) {
@@ -64,7 +63,7 @@ const collectImportMetaProperties = (programPath) => {
64
63
  )
65
64
  }
66
65
  return {
67
- specifierPath: firstArgPath.get(index),
66
+ specifierPath: firstArgPath.get(String(index)),
68
67
  }
69
68
  })
70
69
  return
@@ -79,7 +78,7 @@ const collectImportMetaProperties = (programPath) => {
79
78
  },
80
79
  })
81
80
  return {
82
- importMetaHotDetected,
81
+ importMetaHotPaths,
83
82
  hotDecline,
84
83
  hotAcceptSelf,
85
84
  hotAcceptDependencies,
@@ -40,7 +40,9 @@ export const createImportMetaHot = (importMetaUrl) => {
40
40
  })
41
41
  return
42
42
  }
43
- throw new Error(`invalid call to hot.accept()`)
43
+ throw new Error(
44
+ `invalid call to import.meta.hot.accept(), received ${firstArg}`,
45
+ )
44
46
  },
45
47
  dispose: (callback) => {
46
48
  addUrlMeta(url, {
@@ -53,7 +53,7 @@ export const collectHotDataFromHtmlAst = (htmlAst) => {
53
53
  })
54
54
  visitUrlSpecifierAttribute({
55
55
  node,
56
- attributeName: "content-href",
56
+ attributeName: "generated-from-href",
57
57
  hotAccepted,
58
58
  })
59
59
  }
@@ -65,7 +65,7 @@ export const collectHotDataFromHtmlAst = (htmlAst) => {
65
65
  })
66
66
  visitUrlSpecifierAttribute({
67
67
  node,
68
- attributeName: "content-src",
68
+ attributeName: "generated-from-src",
69
69
  hotAccepted,
70
70
  })
71
71
  }
@@ -0,0 +1,98 @@
1
+ import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
2
+ import { parseHtmlString } from "@jsenv/utils/html_ast/html_ast.js"
3
+ import { applyBabelPlugins } from "@jsenv/utils/js_ast/apply_babel_plugins.js"
4
+
5
+ import { collectHotDataFromHtmlAst } from "./html_hot_dependencies.js"
6
+ import { babelPluginMetadataImportMetaHot } from "./babel_plugin_metadata_import_meta_hot.js"
7
+
8
+ const importMetaHotClientFileUrl = new URL(
9
+ "./client/import_meta_hot.js",
10
+ import.meta.url,
11
+ ).href
12
+
13
+ export const jsenvPluginImportMetaHot = () => {
14
+ return {
15
+ name: "jsenv:import_meta_hot",
16
+ appliesDuring: "*",
17
+ transformUrlContent: {
18
+ html: (htmlUrlInfo, context) => {
19
+ // during build we don't really care to parse html hot dependencies
20
+ if (context.scenario === "build") {
21
+ return
22
+ }
23
+ const htmlAst = parseHtmlString(htmlUrlInfo.content)
24
+ const { hotReferences } = collectHotDataFromHtmlAst(htmlAst)
25
+ htmlUrlInfo.data.hotDecline = false
26
+ htmlUrlInfo.data.hotAcceptSelf = false
27
+ htmlUrlInfo.data.hotAcceptDependencies = hotReferences.map(
28
+ ({ type, specifier }) => {
29
+ const [reference] = context.referenceUtils.found({
30
+ type,
31
+ specifier,
32
+ })
33
+ return reference.url
34
+ },
35
+ )
36
+ },
37
+ css: (cssUrlInfo) => {
38
+ cssUrlInfo.data.hotDecline = false
39
+ cssUrlInfo.data.hotAcceptSelf = false
40
+ cssUrlInfo.data.hotAcceptDependencies = []
41
+ },
42
+ js_module: async (urlInfo, context) => {
43
+ const { metadata } = await applyBabelPlugins({
44
+ babelPlugins: [babelPluginMetadataImportMetaHot],
45
+ urlInfo,
46
+ })
47
+ const {
48
+ importMetaHotPaths,
49
+ hotDecline,
50
+ hotAcceptSelf,
51
+ hotAcceptDependencies,
52
+ } = metadata
53
+ urlInfo.data.hotDecline = hotDecline
54
+ urlInfo.data.hotAcceptSelf = hotAcceptSelf
55
+ urlInfo.data.hotAcceptDependencies = hotAcceptDependencies
56
+ if (importMetaHotPaths.length === 0) {
57
+ return null
58
+ }
59
+ if (context.scenario === "build") {
60
+ return removeImportMetaHots(urlInfo, importMetaHotPaths)
61
+ }
62
+ return injectImportMetaHot(urlInfo, context)
63
+ },
64
+ },
65
+ }
66
+ }
67
+
68
+ const removeImportMetaHots = (urlInfo, importMetaHotPaths) => {
69
+ const magicSource = createMagicSource(urlInfo.content)
70
+ importMetaHotPaths.forEach((path) => {
71
+ magicSource.replace({
72
+ start: path.node.start,
73
+ end: path.node.end,
74
+ replacement: "undefined",
75
+ })
76
+ })
77
+ return magicSource.toContentAndSourcemap()
78
+ }
79
+
80
+ // For some reason using magic source here produce
81
+ // better sourcemap than doing the equivalent with babel
82
+ // I suspect it's because I was doing injectAstAfterImport(programPath, ast.program.body[0])
83
+ // which is likely not well supported by babel
84
+ const injectImportMetaHot = (urlInfo, context) => {
85
+ const [importMetaHotClientFileReference] = context.referenceUtils.inject({
86
+ parentUrl: urlInfo.url,
87
+ type: "js_import_export",
88
+ expectedType: "js_module",
89
+ specifier: importMetaHotClientFileUrl,
90
+ })
91
+ const magicSource = createMagicSource(urlInfo.content)
92
+ magicSource.prepend(
93
+ `import { createImportMetaHot } from ${importMetaHotClientFileReference.generatedSpecifier}
94
+ import.meta.hot = createImportMetaHot(import.meta.url)
95
+ `,
96
+ )
97
+ return magicSource.toContentAndSourcemap()
98
+ }
@@ -12,18 +12,15 @@
12
12
  import { applyBabelPlugins } from "@jsenv/utils/js_ast/apply_babel_plugins.js"
13
13
  import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
14
14
 
15
- import { collectProgramImportMetas } from "@jsenv/utils/js_ast/program_import_metas.js"
16
-
17
15
  export const jsenvPluginImportMetaScenarios = () => {
18
16
  return {
19
17
  name: "jsenv:import_meta_scenario",
20
18
  appliesDuring: "*",
21
- transform: {
22
- js_module: async ({ url, content }, { scenario }) => {
19
+ transformUrlContent: {
20
+ js_module: async (urlInfo, { scenario }) => {
23
21
  const { metadata } = await applyBabelPlugins({
24
22
  babelPlugins: [babelPluginMetadataImportMetaScenarios],
25
- url,
26
- content,
23
+ urlInfo,
27
24
  })
28
25
  const { dev = [], test = [], build = [] } = metadata.importMetaScenarios
29
26
  const replacements = []
@@ -59,7 +56,7 @@ export const jsenvPluginImportMetaScenarios = () => {
59
56
  replace(path, "true")
60
57
  })
61
58
  }
62
- const magicSource = createMagicSource(content)
59
+ const magicSource = createMagicSource(urlInfo.content)
63
60
  replacements.forEach(({ path, value }) => {
64
61
  magicSource.replace({
65
62
  start: path.node.start,
@@ -78,7 +75,28 @@ const babelPluginMetadataImportMetaScenarios = () => {
78
75
  name: "metadata-import-meta-scenarios",
79
76
  visitor: {
80
77
  Program(programPath, state) {
81
- const importMetas = collectProgramImportMetas(programPath)
78
+ const importMetas = {}
79
+ programPath.traverse({
80
+ MemberExpression(path) {
81
+ const { node } = path
82
+ const { object } = node
83
+ if (object.type !== "MetaProperty") {
84
+ return
85
+ }
86
+ const { property: objectProperty } = object
87
+ if (objectProperty.name !== "meta") {
88
+ return
89
+ }
90
+ const { property } = node
91
+ const { name } = property
92
+ const importMetaPaths = importMetas[name]
93
+ if (importMetaPaths) {
94
+ importMetaPaths.push(path)
95
+ } else {
96
+ importMetas[name] = [path]
97
+ }
98
+ },
99
+ })
82
100
  state.file.metadata.importMetaScenarios = {
83
101
  dev: importMetas.dev,
84
102
  test: importMetas.test,
@@ -0,0 +1,52 @@
1
+ const getCurrentScriptSrc = () => {
2
+ const { currentScript } = document
3
+ if (currentScript) return currentScript.src
4
+
5
+ // https://github.com/amiller-gh/currentScript-polyfill
6
+
7
+ const scripts = Array.prototype.slice.call(
8
+ document.getElementsByTagName("script"),
9
+ )
10
+
11
+ const readyScript = scripts.find((script) => {
12
+ return script.readyState === "interactive"
13
+ })
14
+ if (readyScript) return readyScript
15
+
16
+ try {
17
+ throw new Error()
18
+ } catch (err) {
19
+ // Find the second match for the "at" string to get file src url from stack.
20
+ // Specifically works with the format of stack traces in IE.
21
+ const stackDetails = /.*at [^(]*\((.*):(.+):(.+)\)$/gi.exec(err.stack)
22
+ const scriptLocation = (stackDetails || [false])[1]
23
+ const line = (stackDetails || [false])[2]
24
+ const currentLocation = document.location.href.replace(
25
+ document.location.hash,
26
+ "",
27
+ )
28
+
29
+ if (scriptLocation === currentLocation) {
30
+ const source = document.documentElement.outerHTML
31
+ const codeRegExp = new RegExp(
32
+ `(?:[^\\n]+?\\n){0,${
33
+ line - 2
34
+ }}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*`,
35
+ "i",
36
+ )
37
+ const code = source.replace(codeRegExp, "$1").trim()
38
+
39
+ return scripts.find((script) => {
40
+ return script.innerHTML && script.innerHTML.trim() === code
41
+ })
42
+ }
43
+
44
+ return scripts.find((script) => {
45
+ return script.src === scriptLocation
46
+ })
47
+ }
48
+ }
49
+
50
+ const url = getCurrentScriptSrc()
51
+
52
+ export default url
@@ -0,0 +1,9 @@
1
+ /* global __filename */
2
+
3
+ const filenameContainsBackSlashes = __filename.indexOf("\\") > -1
4
+
5
+ const url = filenameContainsBackSlashes
6
+ ? `file:///${__filename.replace(/\\/g, "/")}`
7
+ : `file://${__filename}`
8
+
9
+ export default url
@@ -30,8 +30,7 @@ import {
30
30
  getHtmlNodeAttributeByName,
31
31
  htmlNodePosition,
32
32
  removeHtmlNodeAttributeByName,
33
- setHtmlNodeText,
34
- assignHtmlNodeAttributes,
33
+ setHtmlNodeGeneratedText,
35
34
  getHtmlNodeTextNode,
36
35
  removeHtmlNode,
37
36
  } from "@jsenv/utils/html_ast/html_ast.js"
@@ -59,16 +58,16 @@ export const jsenvPluginImportmap = () => {
59
58
  return {
60
59
  name: "jsenv:importmap",
61
60
  appliesDuring: "*",
62
- resolve: {
63
- js_import_export: ({ parentUrl, specifier }) => {
61
+ resolveUrl: {
62
+ js_import_export: (reference) => {
64
63
  if (!finalImportmap) {
65
64
  return null
66
65
  }
67
66
  try {
68
67
  let fromMapping = false
69
68
  const result = resolveImport({
70
- specifier,
71
- importer: parentUrl,
69
+ specifier: reference.specifier,
70
+ importer: reference.parentUrl,
72
71
  importMap: finalImportmap,
73
72
  onImportMapping: () => {
74
73
  fromMapping = true
@@ -91,12 +90,9 @@ export const jsenvPluginImportmap = () => {
91
90
  }
92
91
  },
93
92
  },
94
- transform: {
95
- html: async (
96
- { url, content, references },
97
- { scenario, cook, urlGraph, referenceUtils },
98
- ) => {
99
- const htmlAst = parseHtmlString(content)
93
+ transformUrlContent: {
94
+ html: async (htmlUrlInfo, context) => {
95
+ const htmlAst = parseHtmlString(htmlUrlInfo.content)
100
96
  const importmap = findNode(htmlAst, (node) => {
101
97
  if (node.nodeName !== "script") {
102
98
  return false
@@ -108,7 +104,7 @@ export const jsenvPluginImportmap = () => {
108
104
  return true
109
105
  })
110
106
  if (!importmap) {
111
- onHtmlImportmapParsed(null, url)
107
+ onHtmlImportmapParsed(null, htmlUrlInfo.url)
112
108
  return null
113
109
  }
114
110
  const handleInlineImportmap = async (importmap, textNode) => {
@@ -117,7 +113,7 @@ export const jsenvPluginImportmap = () => {
117
113
  preferOriginal: true,
118
114
  })
119
115
  const inlineImportmapUrl = generateInlineContentUrl({
120
- url,
116
+ url: htmlUrlInfo.url,
121
117
  extension: ".importmap",
122
118
  line,
123
119
  column,
@@ -125,21 +121,27 @@ export const jsenvPluginImportmap = () => {
125
121
  columnEnd,
126
122
  })
127
123
  const [inlineImportmapReference, inlineImportmapUrlInfo] =
128
- referenceUtils.foundInline({
124
+ context.referenceUtils.foundInline({
129
125
  type: "script_src",
130
126
  line: line - 1,
131
127
  column,
132
- isOriginal,
128
+ isOriginalPosition: isOriginal,
133
129
  specifier: inlineImportmapUrl,
134
130
  contentType: "application/importmap+json",
135
131
  content: textNode.value,
136
132
  })
137
- await cook({
133
+ await context.cook({
138
134
  reference: inlineImportmapReference,
139
135
  urlInfo: inlineImportmapUrlInfo,
140
136
  })
141
- setHtmlNodeText(importmap, inlineImportmapUrlInfo.content)
142
- onHtmlImportmapParsed(JSON.parse(inlineImportmapUrlInfo.content), url)
137
+ setHtmlNodeGeneratedText(importmap, {
138
+ generatedText: inlineImportmapUrlInfo.content,
139
+ generatedBy: "jsenv:importmap",
140
+ })
141
+ onHtmlImportmapParsed(
142
+ JSON.parse(inlineImportmapUrlInfo.content),
143
+ htmlUrlInfo.url,
144
+ )
143
145
  }
144
146
  const handleImportmapWithSrc = async (importmap, src) => {
145
147
  // Browser would throw on remote importmap
@@ -147,35 +149,39 @@ export const jsenvPluginImportmap = () => {
147
149
  // We must precook the importmap to know its content and inline it into the HTML
148
150
  // In this situation the ref to the importmap was already discovered
149
151
  // when parsing the HTML
150
- const importmapReference = references.find(
151
- (reference) => reference.url === src,
152
+ const importmapReference =
153
+ context.referenceUtils.findByGeneratedSpecifier(src)
154
+ const importmapUrlInfo = context.urlGraph.getUrlInfo(
155
+ importmapReference.url,
152
156
  )
153
- const importmapUrlInfo = urlGraph.getUrlInfo(importmapReference.url)
154
- await cook({
157
+ await context.cook({
155
158
  reference: importmapReference,
156
159
  urlInfo: importmapUrlInfo,
157
160
  })
158
- onHtmlImportmapParsed(JSON.parse(importmapUrlInfo.content), url)
161
+ onHtmlImportmapParsed(
162
+ JSON.parse(importmapUrlInfo.content),
163
+ htmlUrlInfo.url,
164
+ )
159
165
  removeHtmlNodeAttributeByName(importmap, "src")
160
- assignHtmlNodeAttributes(importmap, {
161
- "content-src": src,
162
- "inlined-by": "jsenv:importmap",
166
+ setHtmlNodeGeneratedText(importmap, {
167
+ generatedText: importmapUrlInfo.content,
168
+ generatedBy: "jsenv:importmap",
169
+ generatedFromSrc: src,
163
170
  })
164
- setHtmlNodeText(importmap, importmapUrlInfo.content)
165
171
 
166
172
  const { line, column, lineEnd, columnEnd, isOriginal } =
167
173
  htmlNodePosition.readNodePosition(importmap, {
168
174
  preferOriginal: true,
169
175
  })
170
176
  const inlineImportmapUrl = generateInlineContentUrl({
171
- url,
177
+ url: htmlUrlInfo.url,
172
178
  extension: ".importmap",
173
179
  line,
174
180
  column,
175
181
  lineEnd,
176
182
  columnEnd,
177
183
  })
178
- referenceUtils.becomesInline(importmapReference, {
184
+ context.referenceUtils.becomesInline(importmapReference, {
179
185
  line: line - 1,
180
186
  column,
181
187
  isOriginal,
@@ -200,7 +206,7 @@ export const jsenvPluginImportmap = () => {
200
206
  // by "formatReferencedUrl" making the importmap presence useless.
201
207
  // In dev/test we keep importmap into the HTML to see it even if useless
202
208
  // Duing build we get rid of it
203
- if (scenario === "build") {
209
+ if (context.scenario === "build") {
204
210
  removeHtmlNode(importmap)
205
211
  }
206
212
  return {
@@ -1,4 +1,5 @@
1
- import { createMagicSource } from "@jsenv/core/packages/utils/sourcemap/magic_source.js"
1
+ import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
2
+ import { isWebWorkerUrlInfo } from "@jsenv/core/src/omega/web_workers.js"
2
3
 
3
4
  export const jsenvPluginInjectGlobals = (globals = {}) => {
4
5
  if (Object.keys(globals).length === 0) {
@@ -6,10 +7,7 @@ export const jsenvPluginInjectGlobals = (globals = {}) => {
6
7
  }
7
8
  const injectGlobals = (urlInfo) => {
8
9
  const magicSource = createMagicSource(urlInfo.content)
9
- const globalName =
10
- urlInfo.subtype === "worker" || urlInfo.subtype === "service_worker"
11
- ? "self"
12
- : "window"
10
+ const globalName = isWebWorkerUrlInfo(urlInfo) ? "self" : "window"
13
11
  magicSource.prepend(
14
12
  `Object.assign(${globalName}, ${JSON.stringify(globals, null, " ")});`,
15
13
  )
@@ -19,9 +17,9 @@ export const jsenvPluginInjectGlobals = (globals = {}) => {
19
17
  return {
20
18
  name: "jsenv:inject_globals",
21
19
  appliesDuring: "*",
22
- transform: {
23
- js_module: injectGlobals,
20
+ transformUrlContent: {
24
21
  js_classic: injectGlobals,
22
+ js_module: injectGlobals,
25
23
  },
26
24
  }
27
25
  }
@@ -1,42 +1,46 @@
1
1
  import { DataUrl } from "@jsenv/utils/urls/data_url.js"
2
- import { ContentType } from "@jsenv/utils/src/content_type.js"
2
+ import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
3
3
 
4
4
  export const jsenvPluginDataUrls = () => {
5
5
  return {
6
6
  name: "jsenv:data_urls",
7
7
  appliesDuring: "*",
8
- resolve: ({ specifier }) => {
9
- if (!specifier.startsWith("data:")) {
8
+ resolveUrl: (reference) => {
9
+ if (!reference.specifier.startsWith("data:")) {
10
10
  return null
11
11
  }
12
- return specifier
12
+ return reference.specifier
13
13
  },
14
- load: ({ url, data }) => {
15
- if (!url.startsWith("data:")) {
14
+ fetchUrlContent: (urlInfo) => {
15
+ if (!urlInfo.url.startsWith("data:")) {
16
16
  return null
17
17
  }
18
- const { contentType, base64Flag, data: urlData } = DataUrl.parse(url)
19
- data.base64Flag = base64Flag
18
+ const {
19
+ contentType,
20
+ base64Flag,
21
+ data: urlData,
22
+ } = DataUrl.parse(urlInfo.url)
23
+ urlInfo.data.base64Flag = base64Flag
20
24
  return {
21
25
  contentType,
22
26
  content: contentFromUrlData({ contentType, base64Flag, urlData }),
23
27
  }
24
28
  },
25
- formatReferencedUrl: (reference, { urlGraph, cook }) => {
26
- if (!reference.url.startsWith("data:")) {
29
+ formatUrl: (reference, context) => {
30
+ if (!reference.generatedUrl.startsWith("data:")) {
27
31
  return null
28
32
  }
29
33
  if (reference.type === "sourcemap_comment") {
30
34
  return null
31
35
  }
32
36
  return (async () => {
33
- const urlInfo = urlGraph.getUrlInfo(reference.url)
34
- await cook({
37
+ const urlInfo = context.urlGraph.getUrlInfo(reference.url)
38
+ await context.cook({
35
39
  reference,
36
40
  urlInfo,
37
41
  })
38
42
  if (urlInfo.originalContent === urlInfo.content) {
39
- return reference.url
43
+ return reference.generatedUrl
40
44
  }
41
45
  const specifier = DataUrl.stringify({
42
46
  contentType: urlInfo.contentType,
@@ -52,7 +56,7 @@ export const jsenvPluginDataUrls = () => {
52
56
  }
53
57
 
54
58
  const contentFromUrlData = ({ contentType, base64Flag, urlData }) => {
55
- if (ContentType.isTextual(contentType)) {
59
+ if (CONTENT_TYPE.isTextual(contentType)) {
56
60
  if (base64Flag) {
57
61
  return base64ToString(urlData)
58
62
  }