@jsenv/core 25.3.0-alpha.0 → 25.4.2

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 (107) hide show
  1. package/dist/browser_runtime/asset-manifest.json +2 -2
  2. package/dist/browser_runtime/{browser_runtime_91c5a3b8.js → browser_runtime_0e3396a1.js} +15 -16
  3. package/dist/browser_runtime/{browser_runtime_91c5a3b8.js.map → browser_runtime_0e3396a1.js.map} +13 -13
  4. package/dist/build_manifest.js +5 -5
  5. package/dist/compile_proxy/asset-manifest.json +2 -2
  6. package/dist/compile_proxy/compile_proxy.html__inline__20_f4285042.js.map +343 -0
  7. package/dist/compile_proxy/{compile_proxy_8dfaee51.html → compile_proxy_ab528227.html} +358 -397
  8. package/dist/redirector/asset-manifest.json +2 -2
  9. package/dist/redirector/redirector.html__inline__12_404b8295.js.map +349 -0
  10. package/dist/redirector/{redirector_3e9a97b9.html → redirector_6df2620a.html} +369 -407
  11. package/dist/toolbar/asset-manifest.json +2 -2
  12. package/dist/toolbar/toolbar.main_279b3a68.js.map +764 -0
  13. package/dist/toolbar/{toolbar_361afb84.html → toolbar_0a91ca3b.html} +1509 -1583
  14. package/dist/toolbar_injector/asset-manifest.json +2 -2
  15. package/dist/toolbar_injector/{toolbar_injector_fac1e995.js → toolbar_injector_34f6ad8e.js} +18 -15
  16. package/dist/toolbar_injector/{toolbar_injector_fac1e995.js.map → toolbar_injector_34f6ad8e.js.map} +15 -15
  17. package/package.json +10 -10
  18. package/src/buildProject.js +31 -26
  19. package/src/dev_server.js +111 -92
  20. package/src/execute.js +3 -8
  21. package/src/importUsingChildProcess.js +1 -0
  22. package/src/internal/browser_launcher/{browser_runtime_report.js → browser_runtime_profile.js} +21 -15
  23. package/src/internal/browser_launcher/executeHtmlFile.js +22 -14
  24. package/src/internal/browser_launcher/from_playwright.js +6 -4
  25. package/src/internal/browser_runtime/browser_runtime.js +12 -14
  26. package/src/internal/browser_runtime/createBrowserRuntime.js +7 -6
  27. package/src/internal/browser_utils/fetchAndEvalUsingFetch.js +1 -1
  28. package/src/internal/browser_utils/fetchJson.js +1 -1
  29. package/src/internal/browser_utils/{fetch-browser.js → fetch_browser.js} +0 -2
  30. package/src/internal/building/buildUsingRollup.js +41 -57
  31. package/src/internal/building/rollup_plugin_jsenv.js +28 -8
  32. package/src/internal/compiling/babel_parse_error.js +9 -0
  33. package/src/internal/{babel_plugin_transform_import_meta.js → compiling/babel_plugin_transform_import_meta.js} +53 -36
  34. package/src/internal/compiling/compileFile.js +2 -2
  35. package/src/internal/compiling/compileHtml.js +1 -1
  36. package/src/internal/compiling/createCompiledFileService.js +25 -74
  37. package/src/internal/compiling/js-compilation-service/transformJs.js +151 -23
  38. package/src/internal/compiling/jsenvCompilerForHtml.js +29 -32
  39. package/src/internal/compiling/jsenvCompilerForImportmap.js +2 -2
  40. package/src/internal/compiling/jsenvCompilerForJavaScript.js +2 -4
  41. package/src/internal/compiling/jsenv_directory/comparison_utils.js +24 -0
  42. package/src/internal/compiling/{compile-directory/compile-asset.js → jsenv_directory/compile_asset.js} +0 -0
  43. package/src/internal/compiling/jsenv_directory/compile_context.js +68 -0
  44. package/src/internal/compiling/jsenv_directory/compile_profile.js +218 -0
  45. package/src/internal/compiling/{compile-directory/createLockRegistry.js → jsenv_directory/file_lock_registry.js} +0 -0
  46. package/src/internal/compiling/{compile-directory/createLockRegistry.test.js → jsenv_directory/file_lock_registry.test.js} +2 -1
  47. package/src/internal/compiling/{compile-directory → jsenv_directory}/fs-optimized-for-cache.js +0 -0
  48. package/src/internal/compiling/{compile-directory → jsenv_directory}/getOrGenerateCompiledFile.js +2 -2
  49. package/src/internal/compiling/jsenv_directory/jsenv_directory.js +174 -0
  50. package/src/internal/compiling/{compile-directory → jsenv_directory}/updateMeta.js +1 -1
  51. package/src/internal/compiling/{compile-directory → jsenv_directory}/validateCache.js +0 -0
  52. package/src/internal/compiling/sse_service/sse_service.js +369 -0
  53. package/src/internal/compiling/startCompileServer.js +157 -804
  54. package/src/internal/compiling/transformResultToCompilationResult.js +2 -2
  55. package/src/internal/dev_server/exploring/exploring.js +10 -8
  56. package/src/internal/dev_server/toolbar/compilation/toolbar.compilation.js +92 -78
  57. package/src/internal/dev_server/toolbar/settings/toolbar.settings.js +13 -0
  58. package/src/internal/dev_server/toolbar/toolbar.html +46 -16
  59. package/src/internal/dev_server/toolbar/toolbar.injector.js +17 -15
  60. package/src/internal/dev_server/toolbar/toolbar.main.js +12 -16
  61. package/src/internal/executing/executeConcurrently.js +1 -1
  62. package/src/internal/executing/executePlan.js +2 -3
  63. package/src/internal/{generateGroupMap → features}/babel_plugins_compatibility.js +8 -8
  64. package/src/internal/features/browser_feature_detection/browser_feature_detect_dynamic_import.js +20 -0
  65. package/src/internal/features/browser_feature_detection/browser_feature_detect_import_assertions_css.js +23 -0
  66. package/src/internal/features/browser_feature_detection/browser_feature_detect_import_assertions_json.js +25 -0
  67. package/src/internal/features/browser_feature_detection/browser_feature_detect_importmap.js +37 -0
  68. package/src/internal/features/browser_feature_detection/browser_feature_detect_new_stylesheet.js +9 -0
  69. package/src/internal/features/browser_feature_detection/browser_feature_detect_top_level_await.js +14 -0
  70. package/src/internal/features/browser_feature_detection/browser_feature_detection.js +89 -0
  71. package/src/internal/{browser_feature_detection → features/browser_feature_detection}/compile_proxy.html +1 -1
  72. package/src/internal/features/browser_feature_detection/execute_with_script_module.js +24 -0
  73. package/src/internal/features/features_compat_from_runtime.js +38 -0
  74. package/src/internal/features/features_compat_from_runtime_support.js +31 -0
  75. package/src/internal/{generateGroupMap → features}/features_compatibility.js +3 -3
  76. package/src/internal/{node_feature_detection → features/node_feature_detection}/feature_detect_dynamic_import.mjs +0 -0
  77. package/src/internal/{node_feature_detection → features/node_feature_detection}/feature_detect_top_level_await.mjs +0 -0
  78. package/src/internal/{node_feature_detection/nodeSupportsDynamicImport.js → features/node_feature_detection/node_feature_detect_dynamic_import.js} +0 -0
  79. package/src/internal/{node_feature_detection/nodeSupportsTopLevelAwait.js → features/node_feature_detection/node_feature_detect_top_level_await.js} +0 -0
  80. package/src/internal/features/node_feature_detection/node_feature_detection.js +66 -0
  81. package/src/internal/node_launcher/createControllableNodeProcess.js +4 -6
  82. package/src/internal/node_launcher/node_runtime_report.js +15 -9
  83. package/src/internal/node_runtime/fetchSource.js +2 -4
  84. package/src/internal/node_runtime/nodeControllableFile.mjs +1 -5
  85. package/src/internal/node_runtime/node_execution_systemjs.js +2 -5
  86. package/src/internal/redirector/redirector.html +40 -0
  87. package/src/internal/{generateGroupMap/jsenvRuntimeSupport.js → runtime_support/jsenv_runtime_support.js} +0 -0
  88. package/src/internal/{generateGroupMap → runtime_support}/runtime_support.js +0 -0
  89. package/src/internal/url_conversion.js +12 -17
  90. package/src/launchNode.js +29 -41
  91. package/dist/compile_proxy/compile_proxy.html__inline__20_809f35f7.js.map +0 -392
  92. package/dist/redirector/redirector.html__inline__15_e391410e.js.map +0 -397
  93. package/dist/toolbar/toolbar.main_6c1b3d82.js.map +0 -802
  94. package/src/internal/CONSTANTS.js +0 -11
  95. package/src/internal/browser_feature_detection/browser_feature_detection.js +0 -274
  96. package/src/internal/compiling/js-compilation-service/jsenvTransform.js +0 -242
  97. package/src/internal/dev_server/redirector/redirector.html +0 -48
  98. package/src/internal/generateGroupMap/generateGroupMap.js +0 -65
  99. package/src/internal/generateGroupMap/one_runtime_compat.js +0 -38
  100. package/src/internal/generateGroupMap/runtime_compat.js +0 -34
  101. package/src/internal/generateGroupMap/runtime_compat_composition.js +0 -76
  102. package/src/internal/generateGroupMap/shake_babel_plugin_map.js +0 -21
  103. package/src/internal/node_feature_detection/node_feature_detection.js +0 -117
  104. package/src/internal/node_runtime/detectNode.js +0 -3
  105. package/src/internal/runtime/computeCompileIdFromGroupId.js +0 -30
  106. package/src/internal/runtime/resolveGroup.js +0 -13
  107. package/src/internal/runtime/resolveRuntimeGroup.js +0 -11
@@ -1,6 +1,20 @@
1
- import { urlToRelativeUrl } from "@jsenv/filesystem"
1
+ import { urlToRelativeUrl, urlToFileSystemPath } from "@jsenv/filesystem"
2
2
 
3
- import { jsenvTransform } from "./jsenvTransform.js"
3
+ import { require } from "@jsenv/core/src/internal/require.js"
4
+ import { createParseError } from "@jsenv/core/src/internal/compiling/babel_parse_error.js"
5
+ import { babelPluginTransformImportMeta } from "@jsenv/core/src/internal/compiling/babel_plugin_transform_import_meta.js"
6
+ import {
7
+ getMinimalBabelPluginMap,
8
+ babelPluginsFromBabelPluginMap,
9
+ } from "@jsenv/core/src/internal/compiling/babel_plugins.js"
10
+ import { babelPluginProxyExternalImports } from "@jsenv/core/src/internal/compiling/babel_plugin_proxy_external_imports.js"
11
+ import { babelPluginImportMetadata } from "@jsenv/core/src/internal/compiling/babel_plugin_import_metadata.js"
12
+
13
+ import { ansiToHTML } from "./ansiToHTML.js"
14
+ import { babelPluginRegeneratorRuntimeAsJsenvImport } from "./babel_plugin_regenerator_runtime_as_jsenv_import.js"
15
+ import { babelPluginBabelHelpersAsJsenvImports } from "./babel_plugin_babel_helpers_as_jsenv_imports.js"
16
+ import { babelPluginSystemJsPrepend } from "./babel_plugin_systemjs_prepend.js"
17
+ import { babelHelperNameFromUrl } from "./babelHelper.js"
4
18
 
5
19
  export const transformJs = async ({
6
20
  projectDirectoryUrl,
@@ -17,6 +31,7 @@ export const transformJs = async ({
17
31
  sourcemapEnabled = true,
18
32
 
19
33
  map,
34
+ ast,
20
35
  code,
21
36
  }) => {
22
37
  if (typeof projectDirectoryUrl !== "string") {
@@ -40,29 +55,142 @@ export const transformJs = async ({
40
55
  `babelHelpersInjectionAsImport can be enabled only when "moduleOutFormat" is "esmodule"`,
41
56
  )
42
57
  }
58
+ const relativeUrl = url.startsWith(projectDirectoryUrl)
59
+ ? urlToRelativeUrl(url, projectDirectoryUrl)
60
+ : undefined
43
61
 
44
- const transformResult = await jsenvTransform({
45
- url,
46
- relativeUrl: url.startsWith(projectDirectoryUrl)
47
- ? urlToRelativeUrl(url, projectDirectoryUrl)
48
- : undefined,
49
- projectDirectoryUrl,
50
- jsenvRemoteDirectory,
62
+ const inputPath = computeInputPath(url)
63
+ // https://babeljs.io/docs/en/options
64
+ const options = {
65
+ filename: inputPath,
66
+ filenameRelative: relativeUrl,
67
+ inputSourceMap: map,
68
+ configFile: false,
69
+ babelrc: false, // trust only these options, do not read any babelrc config file
70
+ ast: true,
71
+ sourceMaps: sourcemapEnabled,
72
+ sourceFileName: inputPath,
73
+ // https://babeljs.io/docs/en/options#parseropts
74
+ parserOpts: {
75
+ allowAwaitOutsideFunction:
76
+ topLevelAwait === undefined ||
77
+ topLevelAwait === "return" ||
78
+ topLevelAwait === "simple" ||
79
+ topLevelAwait === "ignore",
80
+ },
81
+ generatorOpts: {
82
+ compact: false,
83
+ },
84
+ }
85
+ const babelHelperName = babelHelperNameFromUrl(url)
86
+ // to prevent typeof circular dependency
87
+ if (babelHelperName === "typeof") {
88
+ const babelPluginMapWithoutTransformTypeOf = { ...babelPluginMap }
89
+ delete babelPluginMapWithoutTransformTypeOf["transform-typeof-symbol"]
90
+ babelPluginMap = babelPluginMapWithoutTransformTypeOf
91
+ }
92
+ if (transformGenerator) {
93
+ babelPluginMap = {
94
+ ...babelPluginMap,
95
+ "regenerator-runtime-as-jsenv-import": [
96
+ babelPluginRegeneratorRuntimeAsJsenvImport,
97
+ ],
98
+ }
99
+ }
100
+ babelPluginMap = {
101
+ ...getMinimalBabelPluginMap(),
102
+ "transform-import-meta": [
103
+ babelPluginTransformImportMeta,
104
+ { importMetaFormat },
105
+ ],
106
+ ...babelPluginMap,
107
+ ...(babelHelpersInjectionAsImport
108
+ ? {
109
+ "babel-helpers-as-jsenv-imports": [
110
+ babelPluginBabelHelpersAsJsenvImports,
111
+ ],
112
+ }
113
+ : {}),
114
+ ...(jsenvRemoteDirectory
115
+ ? {
116
+ "proxy-external-imports": [
117
+ babelPluginProxyExternalImports,
118
+ { jsenvRemoteDirectory },
119
+ ],
120
+ }
121
+ : {}),
122
+ "import-metadata": [babelPluginImportMetadata],
123
+ }
124
+ if (moduleOutFormat === "systemjs") {
125
+ const transformModulesSystemJs = require("@babel/plugin-transform-modules-systemjs")
126
+ const proposalDynamicImport = require("@babel/plugin-proposal-dynamic-import")
127
+ babelPluginMap = {
128
+ ...babelPluginMap,
129
+ "proposal-dynamic-import": [proposalDynamicImport],
130
+ "transform-modules-systemjs": [transformModulesSystemJs],
131
+ }
132
+ }
133
+ if (prependSystemJs) {
134
+ babelPluginMap = {
135
+ ...babelPluginMap,
136
+ "systemjs-prepend": [babelPluginSystemJsPrepend],
137
+ }
138
+ }
139
+
140
+ const asyncToPromise = babelPluginMap["transform-async-to-promises"]
141
+ if (topLevelAwait && asyncToPromise) {
142
+ asyncToPromise.options.topLevelAwait = topLevelAwait
143
+ }
144
+ const babelTransformReturnValue = await babelTransform({
145
+ ast,
51
146
  code,
52
- map,
147
+ options: {
148
+ ...options,
149
+ plugins: babelPluginsFromBabelPluginMap(babelPluginMap),
150
+ },
151
+ })
152
+ code = babelTransformReturnValue.code
153
+ map = babelTransformReturnValue.map
154
+ ast = babelTransformReturnValue.ast
155
+ const { metadata } = babelTransformReturnValue
156
+ return { code, map, metadata, ast }
157
+ }
158
+
159
+ const computeInputPath = (url) => {
160
+ if (url.startsWith("file://")) {
161
+ return urlToFileSystemPath(url)
162
+ }
163
+ return url
164
+ }
53
165
 
54
- babelPluginMap,
55
- moduleOutFormat,
56
- importMetaFormat,
166
+ const babelTransform = async ({ ast, code, options }) => {
167
+ const { transformAsync, transformFromAstAsync } = await import("@babel/core")
57
168
 
58
- babelHelpersInjectionAsImport,
59
- prependSystemJs,
60
- topLevelAwait,
61
- transformGenerator,
62
- sourcemapEnabled,
63
- })
64
- code = transformResult.code
65
- map = transformResult.map
66
- const { metadata } = transformResult
67
- return { code, map, metadata }
169
+ try {
170
+ if (ast) {
171
+ const result = await transformFromAstAsync(ast, code, options)
172
+ return result
173
+ }
174
+ return await transformAsync(code, options)
175
+ } catch (error) {
176
+ if (error && error.code === "BABEL_PARSE_ERROR") {
177
+ const message = error.message
178
+ const messageWithoutAnsi = message.replace(ansiRegex, "")
179
+ throw createParseError({
180
+ cause: error,
181
+ message: messageWithoutAnsi,
182
+ messageHTML: ansiToHTML(message),
183
+ filename: options.filename,
184
+ lineNumber: error.loc.line,
185
+ columnNumber: error.loc.column,
186
+ })
187
+ }
188
+ throw error
189
+ }
68
190
  }
191
+
192
+ const pattern = [
193
+ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
194
+ "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
195
+ ].join("|")
196
+ const ansiRegex = new RegExp(pattern, "g")
@@ -36,7 +36,7 @@ import {
36
36
  visitHtmlAst,
37
37
  addHtmlNodeAttribute,
38
38
  } from "./compileHtml.js"
39
- import { generateCompilationAssetUrl } from "./compile-directory/compile-asset.js"
39
+ import { generateCompilationAssetUrl } from "./jsenv_directory/compile_asset.js"
40
40
 
41
41
  export const compileHtml = async ({
42
42
  // cancellationToken,
@@ -46,12 +46,11 @@ export const compileHtml = async ({
46
46
  projectDirectoryUrl,
47
47
  jsenvRemoteDirectory,
48
48
  compileServerOrigin,
49
- outDirectoryRelativeUrl,
49
+ jsenvDirectoryRelativeUrl,
50
50
 
51
+ compileProfile,
51
52
  compileId,
52
53
  babelPluginMap,
53
- moduleOutFormat,
54
- importMetaFormat,
55
54
  topLevelAwait,
56
55
  jsenvScriptInjection = true,
57
56
  jsenvEventSourceClientInjection,
@@ -61,7 +60,7 @@ export const compileHtml = async ({
61
60
  sourcemapMethod,
62
61
  code,
63
62
  }) => {
64
- const compileDirectoryUrl = `${projectDirectoryUrl}${outDirectoryRelativeUrl}${compileId}/`
63
+ const compileDirectoryUrl = `${projectDirectoryUrl}${jsenvDirectoryRelativeUrl}${compileId}/`
65
64
  const browserRuntimeBuildUrlRelativeToProject = urlToRelativeUrl(
66
65
  BROWSER_RUNTIME_BUILD_URL,
67
66
  projectDirectoryUrl,
@@ -133,7 +132,7 @@ export const compileHtml = async ({
133
132
  specifier,
134
133
  })
135
134
  }
136
- if (moduleOutFormat !== "esmodule") {
135
+ if (compileProfile.moduleOutFormat !== "esmodule") {
137
136
  const ressourceHints = collectRessourceHints(htmlAst)
138
137
  await visitRessourceHints({
139
138
  ressourceHints,
@@ -141,13 +140,15 @@ export const compileHtml = async ({
141
140
  })
142
141
  }
143
142
  await visitImportmapScript({
144
- htmlAst,
145
143
  logger,
146
144
  url,
147
145
  compiledUrl,
148
146
  projectDirectoryUrl,
149
147
  compileDirectoryUrl,
150
- moduleOutFormat,
148
+
149
+ compileProfile,
150
+
151
+ htmlAst,
151
152
  scripts,
152
153
  addHtmlMutation,
153
154
  addHtmlSourceFile,
@@ -161,9 +162,8 @@ export const compileHtml = async ({
161
162
  url,
162
163
  compiledUrl,
163
164
 
165
+ compileProfile,
164
166
  babelPluginMap,
165
- moduleOutFormat,
166
- importMetaFormat,
167
167
  topLevelAwait,
168
168
  sourcemapMethod,
169
169
 
@@ -246,13 +246,15 @@ const visitRessourceHints = async ({ ressourceHints, addHtmlMutation }) => {
246
246
  }
247
247
 
248
248
  const visitImportmapScript = async ({
249
- htmlAst,
250
249
  logger,
251
250
  url,
252
251
  compiledUrl,
253
252
  projectDirectoryUrl,
254
253
  compileDirectoryUrl,
255
- moduleOutFormat,
254
+
255
+ compileProfile,
256
+
257
+ htmlAst,
256
258
  scripts,
257
259
  addHtmlMutation,
258
260
  addHtmlSourceFile,
@@ -280,7 +282,7 @@ const visitImportmapScript = async ({
280
282
  scriptInjections: [
281
283
  {
282
284
  type:
283
- moduleOutFormat === "systemjs"
285
+ compileProfile.moduleOutFormat === "systemjs"
284
286
  ? "systemjs-importmap"
285
287
  : "importmap",
286
288
  text: defaultImportMapAsText,
@@ -330,7 +332,7 @@ const visitImportmapScript = async ({
330
332
  addHtmlMutation(() => {
331
333
  removeHtmlNodeAttribute(firstImportmapScript, srcAttribute)
332
334
  setHtmlNodeText(firstImportmapScript, importmapAsText)
333
- if (moduleOutFormat === "systemjs") {
335
+ if (compileProfile.moduleOutFormat === "systemjs") {
334
336
  const typeAttribute = getHtmlNodeAttributeByName(
335
337
  firstImportmapScript,
336
338
  "type",
@@ -357,7 +359,7 @@ const visitImportmapScript = async ({
357
359
  addHtmlMutation(() => {
358
360
  removeHtmlNodeAttribute(firstImportmapScript, srcAttribute)
359
361
  setHtmlNodeText(firstImportmapScript, importmapAsText)
360
- if (moduleOutFormat === "systemjs") {
362
+ if (compileProfile.moduleOutFormat === "systemjs") {
361
363
  const typeAttribute = getHtmlNodeAttributeByName(
362
364
  firstImportmapScript,
363
365
  "type",
@@ -371,14 +373,13 @@ const visitImportmapScript = async ({
371
373
  const visitScripts = async ({
372
374
  logger,
373
375
  projectDirectoryUrl,
374
- compileServerOrigin,
375
376
  jsenvRemoteDirectory,
377
+ compileServerOrigin,
376
378
  url,
377
379
  compiledUrl,
378
380
 
381
+ compileProfile,
379
382
  babelPluginMap,
380
- moduleOutFormat,
381
- importMetaFormat,
382
383
  topLevelAwait,
383
384
  sourcemapMethod,
384
385
 
@@ -398,7 +399,7 @@ const visitScripts = async ({
398
399
  if (type === "module") {
399
400
  if (src) {
400
401
  addHtmlMutation(() => {
401
- if (moduleOutFormat === "systemjs") {
402
+ if (compileProfile.moduleOutFormat === "systemjs") {
402
403
  removeHtmlNodeAttribute(script, typeAttribute)
403
404
  }
404
405
  if (integrityAttribute) {
@@ -406,7 +407,7 @@ const visitScripts = async ({
406
407
  }
407
408
  removeHtmlNodeAttribute(script, srcAttribute)
408
409
  const jsenvMethod =
409
- moduleOutFormat === "systemjs"
410
+ compileProfile.moduleOutFormat === "systemjs"
410
411
  ? "executeFileUsingSystemJs"
411
412
  : "executeFileUsingDynamicImport"
412
413
  let specifier
@@ -442,9 +443,8 @@ const visitScripts = async ({
442
443
  compiledUrl: scriptCompiledUrl,
443
444
 
444
445
  type: "module",
446
+ compileProfile,
445
447
  babelPluginMap,
446
- moduleOutFormat,
447
- importMetaFormat,
448
448
  topLevelAwait,
449
449
 
450
450
  sourcemapMethod,
@@ -453,12 +453,12 @@ const visitScripts = async ({
453
453
  })
454
454
  const specifier = `./${urlToRelativeUrl(scriptCompiledUrl, compiledUrl)}`
455
455
  addHtmlMutation(() => {
456
- if (moduleOutFormat === "systemjs") {
456
+ if (compileProfile.moduleOutFormat === "systemjs") {
457
457
  removeHtmlNodeAttribute(script, typeAttribute)
458
458
  }
459
459
  removeHtmlNodeAttribute(script, srcAttribute)
460
460
  const jsenvMethod =
461
- moduleOutFormat === "systemjs"
461
+ compileProfile.moduleOutFormat === "systemjs"
462
462
  ? "executeFileUsingSystemJs"
463
463
  : "executeFileUsingDynamicImport"
464
464
  setHtmlNodeText(
@@ -531,9 +531,8 @@ const visitScripts = async ({
531
531
  compiledUrl: scriptCompiledUrl,
532
532
 
533
533
  type: "classic",
534
+ compileProfile,
534
535
  babelPluginMap,
535
- moduleOutFormat,
536
- importMetaFormat,
537
536
  topLevelAwait,
538
537
 
539
538
  sourcemapMethod,
@@ -566,9 +565,8 @@ const visitScripts = async ({
566
565
  compiledUrl: scriptCompiledUrl,
567
566
 
568
567
  type: "classic",
568
+ compileProfile,
569
569
  babelPluginMap,
570
- moduleOutFormat,
571
- importMetaFormat,
572
570
  topLevelAwait,
573
571
 
574
572
  code: textNode.value,
@@ -591,9 +589,8 @@ const transformHtmlScript = async ({
591
589
  compiledUrl,
592
590
 
593
591
  type,
592
+ compileProfile,
594
593
  babelPluginMap,
595
- moduleOutFormat,
596
- importMetaFormat,
597
594
  topLevelAwait,
598
595
 
599
596
  code,
@@ -608,8 +605,8 @@ const transformHtmlScript = async ({
608
605
  compiledUrl,
609
606
 
610
607
  babelPluginMap,
611
- moduleOutFormat: type === "module" ? moduleOutFormat : "global",
612
- importMetaFormat,
608
+ moduleOutFormat:
609
+ type === "module" ? compileProfile.moduleOutFormat : "global",
613
610
  topLevelAwait: type === "module" ? topLevelAwait : false,
614
611
  babelHelpersInjectionAsImport: type === "module" ? undefined : false,
615
612
 
@@ -7,12 +7,12 @@ export const compileImportmap = async ({
7
7
  url,
8
8
  compiledUrl,
9
9
  projectDirectoryUrl,
10
- outDirectoryRelativeUrl,
10
+ jsenvDirectoryRelativeUrl,
11
11
  compileId,
12
12
  }) => {
13
13
  const jsenvImportmap = getDefaultImportmap(compiledUrl, {
14
14
  projectDirectoryUrl,
15
- compileDirectoryUrl: `${projectDirectoryUrl}${outDirectoryRelativeUrl}${compileId}/`,
15
+ compileDirectoryUrl: `${projectDirectoryUrl}${jsenvDirectoryRelativeUrl}${compileId}/`,
16
16
  })
17
17
  const projectImportmap = JSON.parse(code)
18
18
  const importmap = composeTwoImportMaps(jsenvImportmap, projectImportmap)
@@ -9,11 +9,10 @@ export const compileJavascript = async ({
9
9
  url,
10
10
  compiledUrl,
11
11
 
12
+ compileProfile,
12
13
  babelPluginMap,
13
14
  workerUrls,
14
15
  serviceWorkerUrls,
15
- moduleOutFormat,
16
- importMetaFormat,
17
16
  topLevelAwait,
18
17
  prependSystemJs,
19
18
 
@@ -33,8 +32,7 @@ export const compileJavascript = async ({
33
32
  compiledUrl,
34
33
 
35
34
  babelPluginMap,
36
- moduleOutFormat,
37
- importMetaFormat,
35
+ moduleOutFormat: compileProfile.moduleOutFormat,
38
36
  topLevelAwait,
39
37
  prependSystemJs,
40
38
 
@@ -0,0 +1,24 @@
1
+ export const sameValueInTwoObjects = (object, secondObject) => {
2
+ const objectKeys = Object.keys(object)
3
+ const secondObjectKeys = Object.keys(secondObject)
4
+ if (!sameValuesInTwoArrays(objectKeys, secondObjectKeys)) {
5
+ return false
6
+ }
7
+ return objectKeys.every((key) => {
8
+ const objectKeyValue = object[key]
9
+ const secondObjectKeyValue = secondObject[key]
10
+ if (
11
+ typeof objectKeyValue === "object" &&
12
+ objectKeyValue !== null &&
13
+ typeof secondObjectKeyValue === "object" &&
14
+ secondObjectKeyValue !== null
15
+ ) {
16
+ return sameValueInTwoObjects(objectKeyValue, secondObjectKeyValue)
17
+ }
18
+ return objectKeyValue === secondObjectKeyValue
19
+ })
20
+ }
21
+
22
+ export const sameValuesInTwoArrays = (array, secondArray) => {
23
+ return array.every((value) => secondArray.includes(value))
24
+ }
@@ -0,0 +1,68 @@
1
+ import { resolveUrl, readFile } from "@jsenv/filesystem"
2
+
3
+ import {
4
+ TOOLBAR_INJECTOR_BUILD_URL,
5
+ EVENT_SOURCE_CLIENT_BUILD_URL,
6
+ BROWSER_RUNTIME_BUILD_URL,
7
+ } from "@jsenv/core/dist/build_manifest.js"
8
+ import { jsenvCoreDirectoryUrl } from "@jsenv/core/src/internal/jsenvCoreDirectoryUrl.js"
9
+
10
+ import {
11
+ sameValuesInTwoArrays,
12
+ sameValueInTwoObjects,
13
+ } from "./comparison_utils.js"
14
+
15
+ const COMPARERS = {
16
+ preservedUrls: sameValueInTwoObjects,
17
+ workers: sameValuesInTwoArrays,
18
+ serviceWorkers: sameValuesInTwoArrays,
19
+ replaceProcessEnvNodeEnv: (a, b) => a === b,
20
+ inlineImportMapIntoHTML: (a, b) => a === b,
21
+
22
+ jsenvCorePackageVersion: (a, b) => a === b,
23
+ TOOLBAR_INJECTOR_BUILD_URL: (a, b) => a === b,
24
+ EVENT_SOURCE_CLIENT_BUILD_URL: (a, b) => a === b,
25
+ BROWSER_RUNTIME_BUILD_URL: (a, b) => a === b,
26
+ }
27
+
28
+ export const compareCompileContexts = (
29
+ compileContext,
30
+ secondCompileContext,
31
+ ) => {
32
+ return Object.keys(COMPARERS).every((key) => {
33
+ return COMPARERS[key](compileContext[key], secondCompileContext[key])
34
+ })
35
+ }
36
+
37
+ export const createCompileContext = async ({
38
+ preservedUrls,
39
+ workers,
40
+ serviceWorkers,
41
+ replaceProcessEnvNodeEnv,
42
+ inlineImportMapIntoHTML,
43
+ }) => {
44
+ return {
45
+ preservedUrls,
46
+ workers,
47
+ serviceWorkers,
48
+ replaceProcessEnvNodeEnv,
49
+ inlineImportMapIntoHTML,
50
+
51
+ // when "jsenvCorePackageVersion" is different, it means compile logic may have changed
52
+ jsenvCorePackageVersion: await readJsenvCoreVersionFromPackageFile(),
53
+ TOOLBAR_INJECTOR_BUILD_URL,
54
+ EVENT_SOURCE_CLIENT_BUILD_URL,
55
+ BROWSER_RUNTIME_BUILD_URL,
56
+ }
57
+ }
58
+
59
+ const readJsenvCoreVersionFromPackageFile = async () => {
60
+ const jsenvCorePackageFileUrl = resolveUrl(
61
+ "./package.json",
62
+ jsenvCoreDirectoryUrl,
63
+ )
64
+ const jsenvCoreVersion = await readFile(jsenvCorePackageFileUrl, {
65
+ as: "json",
66
+ }).version
67
+ return jsenvCoreVersion
68
+ }