@jsenv/core 27.0.0-alpha.12 → 27.0.0-alpha.13

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 (116) hide show
  1. package/main.js +4 -0
  2. package/package.json +13 -7
  3. package/readme.md +4 -12
  4. package/src/build/build.js +438 -387
  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/dev/plugins/autoreload/babel_plugin_metadata_import_meta_hot.js +1 -1
  11. package/src/dev/plugins/autoreload/client/import_meta_hot.js +3 -1
  12. package/src/dev/plugins/autoreload/html_hot_dependencies.js +2 -2
  13. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +61 -51
  14. package/src/dev/plugins/autoreload/sse_service.js +23 -3
  15. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +2 -2
  16. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  17. package/src/dev/start_dev_server.js +10 -5
  18. package/src/execute/execute.js +10 -4
  19. package/src/execute/run.js +17 -54
  20. package/src/execute/runtimes/browsers/from_playwright.js +167 -146
  21. package/src/execute/runtimes/node/node_process.js +281 -37
  22. package/src/omega/{runtime_support/default_runtime_support.js → compat/default_runtime_compat.js} +3 -5
  23. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  24. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  25. package/src/omega/errors.js +51 -58
  26. package/src/omega/fetched_content_compliance.js +24 -0
  27. package/src/omega/kitchen.js +396 -280
  28. package/src/omega/server/file_service.js +9 -11
  29. package/src/omega/url_graph/url_graph_load.js +13 -7
  30. package/src/omega/url_graph/url_graph_report.js +7 -5
  31. package/src/omega/url_graph.js +22 -10
  32. package/src/omega/web_workers.js +42 -0
  33. package/src/plugins/bundling/css/bundle_css.js +17 -0
  34. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  35. package/src/{build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js → plugins/bundling/js_module/bundle_js_module.js} +100 -75
  36. package/src/plugins/bundling/jsenv_plugin_bundling.js +51 -0
  37. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +48 -41
  38. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +66 -0
  39. package/src/{omega/core_plugins → plugins}/filesystem_magic/jsenv_plugin_filesystem_magic.js +7 -4
  40. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  41. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  42. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_installer.js +3 -2
  43. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_setup.js +0 -0
  44. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  45. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  46. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +38 -46
  47. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  48. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +26 -8
  49. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  50. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  51. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +37 -31
  52. package/src/{omega/core_plugins → plugins}/inject_globals/jsenv_plugin_inject_globals.js +4 -6
  53. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  54. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +18 -14
  55. package/src/{omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js → plugins/inline/jsenv_plugin_html_inline_content.js} +61 -40
  56. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  57. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +6 -6
  58. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +263 -0
  59. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  60. package/src/plugins/minification/css/minify_css.js +9 -0
  61. package/src/plugins/minification/html/minify_html.js +15 -0
  62. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  63. package/src/plugins/minification/jsenv_plugin_minification.js +77 -0
  64. package/src/plugins/minification/json/minify_json.js +8 -0
  65. package/src/{omega/core_plugins → plugins}/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +15 -15
  66. package/src/{omega → plugins}/plugin_controller.js +18 -10
  67. package/src/plugins/plugins.js +50 -0
  68. package/src/plugins/transpilation/as_js_classic/client/s.js +808 -0
  69. package/src/plugins/transpilation/as_js_classic/client/s.js.md +1 -0
  70. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  71. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  72. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +178 -0
  73. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_script_type_module_as_classic.js +156 -0
  74. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_top_level_await.js +37 -0
  75. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_workers_type_module_as_classic.js +133 -0
  76. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  77. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  78. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  79. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +3 -21
  80. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  81. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +29 -27
  82. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +0 -0
  83. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/.eslintrc.cjs +0 -0
  84. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  85. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  86. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  87. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  88. package/src/{omega/core_plugins → plugins/transpilation}/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -0
  89. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +243 -0
  90. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +40 -0
  91. package/src/plugins/url_references/css/css_urls.js +49 -0
  92. package/src/plugins/url_references/html/html_urls.js +273 -0
  93. package/src/plugins/url_references/js/js_urls.js +170 -0
  94. package/src/plugins/url_references/jsenv_plugin_url_references.js +18 -0
  95. package/src/plugins/url_references/webmanifest/webmanifest_urls.js +17 -0
  96. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +12 -5
  97. package/src/{omega/core_plugins → plugins}/url_version/jsenv_plugin_url_version.js +8 -8
  98. package/src/preview/preview.js +3 -0
  99. package/src/test/execute_plan.js +18 -11
  100. package/src/test/execute_test_plan.js +5 -6
  101. package/src/test/logs_file_execution.js +8 -7
  102. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  103. package/src/execute/runtimes/node/controlled_process.js +0 -316
  104. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  105. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  106. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  107. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  108. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  109. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  110. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  111. package/src/omega/core_plugins.js +0 -42
  112. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  113. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  114. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  115. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  116. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -0,0 +1,66 @@
1
+ import { readFileSync } from "node:fs"
2
+ import { urlIsInsideOf, urlToRelativeUrl } from "@jsenv/filesystem"
3
+
4
+ import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
5
+
6
+ export const jsenvPluginFileUrls = () => {
7
+ return [jsenvPluginResolveAbsoluteFileUrls(), jsenvPluginFetchFileUrls()]
8
+ }
9
+
10
+ const jsenvPluginResolveAbsoluteFileUrls = () => {
11
+ return {
12
+ name: "jsenv:resolve_absolute_file_urls",
13
+ appliesDuring: {
14
+ // during dev and test it's a browser running the code
15
+ // so absolute file urls needs to be relativized
16
+ dev: true,
17
+ test: true,
18
+ // during build it's fine to use file:// urls
19
+ build: false,
20
+ },
21
+ resolveUrl: (reference) => {
22
+ if (!reference.specifier.startsWith("/@fs/")) {
23
+ return null
24
+ }
25
+ const fsRootRelativeUrl = reference.specifier.slice("/@fs/".length)
26
+ return `file:///${fsRootRelativeUrl}`
27
+ },
28
+ formatUrl: (reference, context) => {
29
+ if (!reference.generatedUrl.startsWith("file:")) {
30
+ return null
31
+ }
32
+ if (urlIsInsideOf(reference.generatedUrl, context.rootDirectoryUrl)) {
33
+ return `/${urlToRelativeUrl(
34
+ reference.generatedUrl,
35
+ context.rootDirectoryUrl,
36
+ )}`
37
+ }
38
+ return `/@fs/${reference.generatedUrl.slice("file:///".length)}`
39
+ },
40
+ }
41
+ }
42
+
43
+ const jsenvPluginFetchFileUrls = () => {
44
+ return {
45
+ name: "jsenv:fetch_file_urls",
46
+ appliesDuring: "*",
47
+ fetchUrlContent: (urlInfo) => {
48
+ if (!urlInfo.url.startsWith("file:")) {
49
+ return null
50
+ }
51
+ const urlObject = new URL(urlInfo.url)
52
+ const fileBuffer = readFileSync(urlObject)
53
+ const contentType = CONTENT_TYPE.fromUrlExtension(urlInfo.url)
54
+ if (CONTENT_TYPE.isTextual(contentType)) {
55
+ return {
56
+ contentType,
57
+ content: String(fileBuffer),
58
+ }
59
+ }
60
+ return {
61
+ contentType,
62
+ content: fileBuffer,
63
+ }
64
+ },
65
+ }
66
+ }
@@ -13,12 +13,12 @@ export const jsenvPluginFileSystemMagic = ({
13
13
  return {
14
14
  name: "jsenv:filesystem_magic",
15
15
  appliesDuring: "*",
16
- normalize: ({ parentUrl, url }) => {
16
+ normalizeUrl: (reference) => {
17
17
  // http, https, data, about, etc
18
- if (!url.startsWith("file:")) {
18
+ if (!reference.url.startsWith("file:")) {
19
19
  return null
20
20
  }
21
- const urlObject = new URL(url)
21
+ const urlObject = new URL(reference.url)
22
22
  const { search, hash } = urlObject
23
23
  urlObject.search = ""
24
24
  urlObject.hash = ""
@@ -26,7 +26,10 @@ export const jsenvPluginFileSystemMagic = ({
26
26
  urlObject.href,
27
27
  {
28
28
  magicDirectoryIndex,
29
- magicExtensions: getExtensionsToTry(magicExtensions, parentUrl),
29
+ magicExtensions: getExtensionsToTry(
30
+ magicExtensions,
31
+ reference.parentUrl,
32
+ ),
30
33
  },
31
34
  )
32
35
  if (!filesystemResolution.found) {
@@ -89,7 +89,6 @@ export const installHtmlSupervisor = ({ logs, measurePerf }) => {
89
89
  onExecutionSettled(src, executionResult)
90
90
  if (logs) {
91
91
  console.log(`${type} load ended`)
92
-
93
92
  console.groupEnd()
94
93
  }
95
94
  },
@@ -120,7 +119,9 @@ export const installHtmlSupervisor = ({ logs, measurePerf }) => {
120
119
  console.error(error)
121
120
  }
122
121
  }
123
- console.groupEnd()
122
+ if (logs) {
123
+ console.groupEnd()
124
+ }
124
125
  },
125
126
  )
126
127
  }
@@ -2,27 +2,21 @@
2
2
  * Things happening here
3
3
  * - html supervisor module injection
4
4
  * - scripts are wrapped to be supervised
5
- *
6
- * TODO:
7
- * - if ressource is referenced by ressource hint we should do sthing?
8
- * I think so when we inject ?js_classic
9
5
  */
10
6
 
11
- import { injectQueryParams } from "@jsenv/utils/urls/url_utils.js"
12
7
  import {
13
8
  parseHtmlString,
14
9
  stringifyHtmlAst,
15
10
  visitHtmlAst,
16
11
  getHtmlNodeAttributeByName,
17
12
  removeHtmlNodeAttributeByName,
18
- setHtmlNodeText,
19
- assignHtmlNodeAttributes,
20
13
  parseScriptNode,
21
14
  injectScriptAsEarlyAsPossible,
22
15
  createHtmlNode,
23
16
  htmlNodePosition,
24
- removeHtmlNodeText,
25
17
  getHtmlNodeTextNode,
18
+ removeHtmlNodeText,
19
+ setHtmlNodeGeneratedText,
26
20
  } from "@jsenv/utils/html_ast/html_ast.js"
27
21
  import { generateInlineContentUrl } from "@jsenv/utils/urls/inline_content_url_generator.js"
28
22
 
@@ -45,7 +39,7 @@ export const jsenvPluginHtmlSupervisor = ({
45
39
  dev: true,
46
40
  test: true,
47
41
  },
48
- transform: {
42
+ transformUrlContent: {
49
43
  html: ({ url, content }, { referenceUtils }) => {
50
44
  const htmlAst = parseHtmlString(content)
51
45
  const scriptsToSupervise = []
@@ -64,27 +58,22 @@ export const jsenvPluginHtmlSupervisor = ({
64
58
  lineEnd,
65
59
  columnEnd,
66
60
  })
67
- if (scriptCategory === "classic") {
68
- inlineScriptUrl = injectQueryParams(inlineScriptUrl, {
69
- js_classic: "",
70
- })
71
- }
72
61
  const [inlineScriptReference] = referenceUtils.foundInline({
73
62
  type: "script_src",
63
+ expectedType: { classic: "js_classic", module: "js_module" }[
64
+ scriptCategory
65
+ ],
74
66
  line: line - 1,
75
67
  column,
76
- isOriginal,
68
+ isOriginalPosition: isOriginal,
77
69
  specifier: inlineScriptUrl,
78
- contentType: "application/javascript",
70
+ contentType: "text/javascript",
79
71
  content: textNode.value,
80
72
  })
81
- assignHtmlNodeAttributes(node, {
82
- "src": inlineScriptReference.generatedSpecifier,
83
- "src-generated-from-inline-content": "",
84
- })
85
73
  removeHtmlNodeText(node)
86
74
  scriptsToSupervise.push({
87
75
  node,
76
+ isInline: true,
88
77
  type: scriptCategory,
89
78
  src: inlineScriptReference.generatedSpecifier,
90
79
  })
@@ -105,6 +94,7 @@ export const jsenvPluginHtmlSupervisor = ({
105
94
  const crossorigin = crossoriginAttribute
106
95
  ? crossoriginAttribute.value
107
96
  : undefined
97
+ removeHtmlNodeAttributeByName(node, "src")
108
98
  scriptsToSupervise.push({
109
99
  node,
110
100
  type: scriptCategory,
@@ -151,6 +141,7 @@ export const jsenvPluginHtmlSupervisor = ({
151
141
  }
152
142
  const [htmlSupervisorInstallerFileReference] = referenceUtils.inject({
153
143
  type: "js_import_export",
144
+ expectedType: "js_module",
154
145
  specifier: htmlSupervisorInstallerFileUrl,
155
146
  })
156
147
  injectScriptAsEarlyAsPossible(
@@ -159,25 +150,24 @@ export const jsenvPluginHtmlSupervisor = ({
159
150
  "tagName": "script",
160
151
  "type": "module",
161
152
  "textContent": `
162
- import { installHtmlSupervisor } from ${
163
- htmlSupervisorInstallerFileReference.generatedSpecifier
164
- }
165
- installHtmlSupervisor(${JSON.stringify(
166
- {
167
- logs,
168
- measurePerf,
169
- },
170
- null,
171
- " ",
172
- )})`,
153
+ import { installHtmlSupervisor } from ${
154
+ htmlSupervisorInstallerFileReference.generatedSpecifier
155
+ }
156
+ installHtmlSupervisor(${JSON.stringify(
157
+ {
158
+ logs,
159
+ measurePerf,
160
+ },
161
+ null,
162
+ " ",
163
+ )})`,
173
164
  "injected-by": "jsenv:html_supervisor",
174
165
  }),
175
166
  )
176
167
  const [htmlSupervisorSetupFileReference] = referenceUtils.inject({
177
168
  type: "script_src",
178
- specifier: injectQueryParams(htmlSupervisorSetupFileUrl, {
179
- js_classic: "",
180
- }),
169
+ expectedType: "js_classic",
170
+ specifier: htmlSupervisorSetupFileUrl,
181
171
  })
182
172
  injectScriptAsEarlyAsPossible(
183
173
  htmlAst,
@@ -188,14 +178,9 @@ installHtmlSupervisor(${JSON.stringify(
188
178
  }),
189
179
  )
190
180
  scriptsToSupervise.forEach(
191
- ({ node, type, src, integrity, crossorigin }) => {
192
- removeHtmlNodeAttributeByName(node, "src")
193
- assignHtmlNodeAttributes(node, {
194
- "content-src": src,
195
- })
196
- setHtmlNodeText(
197
- node,
198
- generateCodeToSuperviseScript({
181
+ ({ node, isInline, type, src, integrity, crossorigin }) => {
182
+ setHtmlNodeGeneratedText(node, {
183
+ generatedText: generateCodeToSuperviseScript({
199
184
  type,
200
185
  src,
201
186
  integrity,
@@ -203,7 +188,10 @@ installHtmlSupervisor(${JSON.stringify(
203
188
  htmlSupervisorInstallerSpecifier:
204
189
  htmlSupervisorInstallerFileReference.generatedSpecifier,
205
190
  }),
206
- )
191
+ generatedBy: "jsenv:html_supervisor",
192
+ generatedFromSrc: src,
193
+ generatedFromInlineContent: isInline,
194
+ })
207
195
  },
208
196
  )
209
197
  const htmlModified = stringifyHtmlAst(htmlAst)
@@ -226,8 +214,12 @@ const generateCodeToSuperviseScript = ({
226
214
  }) => {
227
215
  const paramsAsJson = JSON.stringify({ src, integrity, crossorigin })
228
216
  if (type === "module") {
229
- return `import { superviseScriptTypeModule } from ${htmlSupervisorInstallerSpecifier}
230
- superviseScriptTypeModule(${paramsAsJson})`
217
+ return `
218
+ import { superviseScriptTypeModule } from ${htmlSupervisorInstallerSpecifier}
219
+ superviseScriptTypeModule(${paramsAsJson})
220
+ `
231
221
  }
232
- return `window.__html_supervisor__.superviseScript(${paramsAsJson})`
222
+ return `
223
+ window.__html_supervisor__.superviseScript(${paramsAsJson})
224
+ `
233
225
  }
@@ -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
+ }
@@ -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
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
  }