@jsenv/core 27.0.0-alpha.8 → 27.0.0-alpha.80

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 (253) hide show
  1. package/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +95 -0
  2. package/dist/babel_helpers/AwaitValue/AwaitValue.js +3 -0
  3. package/dist/babel_helpers/applyDecoratorDescriptor/applyDecoratorDescriptor.js +29 -0
  4. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +9 -0
  5. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +4 -0
  6. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +5 -0
  7. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +8 -0
  8. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +52 -0
  9. package/dist/babel_helpers/asyncIterator/asyncIterator.js +78 -0
  10. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +39 -0
  11. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +4 -0
  12. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +24 -0
  13. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +7 -0
  14. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +14 -0
  15. package/dist/babel_helpers/classCallCheck/classCallCheck.js +5 -0
  16. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -0
  17. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -0
  18. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +8 -0
  19. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +4 -0
  20. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -0
  21. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -0
  22. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +7 -0
  23. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -0
  24. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -0
  25. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +7 -0
  26. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +3 -0
  27. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -0
  28. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +9 -0
  29. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -0
  30. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -0
  31. package/dist/babel_helpers/construct/construct.js +15 -0
  32. package/dist/babel_helpers/createClass/createClass.js +18 -0
  33. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +63 -0
  34. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +22 -0
  35. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +50 -0
  36. package/dist/babel_helpers/createSuper/createSuper.js +22 -0
  37. package/dist/babel_helpers/decorate/decorate.js +622 -0
  38. package/dist/babel_helpers/defaults/defaults.js +14 -0
  39. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +26 -0
  40. package/dist/babel_helpers/defineProperty/defineProperty.js +19 -0
  41. package/dist/babel_helpers/extends/extends.js +16 -0
  42. package/dist/babel_helpers/get/get.js +21 -0
  43. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +2 -0
  44. package/dist/babel_helpers/inherits/inherits.js +21 -0
  45. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -0
  46. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +10 -0
  47. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +3 -0
  48. package/dist/babel_helpers/instanceof/instanceof.js +7 -0
  49. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +5 -0
  50. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +49 -0
  51. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +4 -0
  52. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -0
  53. package/dist/babel_helpers/iterableToArray/iterableToArray.js +3 -0
  54. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +38 -0
  55. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +13 -0
  56. package/dist/babel_helpers/jsx/jsx.js +49 -0
  57. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +10 -0
  58. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +5 -0
  59. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +3 -0
  60. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +3 -0
  61. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -0
  62. package/dist/babel_helpers/objectSpread/objectSpread.js +22 -0
  63. package/dist/babel_helpers/objectSpread2/objectSpread2.js +41 -0
  64. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +20 -0
  65. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +15 -0
  66. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +10 -0
  67. package/dist/babel_helpers/readOnlyError/readOnlyError.js +4 -0
  68. package/dist/babel_helpers/readme.md +8 -0
  69. package/dist/babel_helpers/set/set.js +51 -0
  70. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +5 -0
  71. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -0
  72. package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -0
  73. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +7 -0
  74. package/dist/babel_helpers/superPropBase/superPropBase.js +10 -0
  75. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +11 -0
  76. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +8 -0
  77. package/dist/babel_helpers/tdz/tdz.js +4 -0
  78. package/dist/babel_helpers/temporalRef/temporalRef.js +5 -0
  79. package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +3 -0
  80. package/dist/babel_helpers/toArray/toArray.js +5 -0
  81. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -0
  82. package/dist/babel_helpers/toPrimitive/toPrimitive.js +14 -0
  83. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -0
  84. package/dist/babel_helpers/typeof/typeof.js +7 -0
  85. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -0
  86. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +7 -0
  87. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +35 -0
  88. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +67 -0
  89. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +4 -0
  90. package/dist/html/explorer.html +557 -0
  91. package/dist/js/controllable_file.mjs +227 -0
  92. package/dist/js/event_source_client.js +324 -0
  93. package/dist/js/global_this.js +32 -0
  94. package/dist/js/html_supervisor_installer.js +522 -0
  95. package/dist/js/html_supervisor_setup.js +82 -0
  96. package/dist/js/import_meta_hot.js +84 -0
  97. package/dist/js/inline_content.js +8 -0
  98. package/dist/js/new_stylesheet.js +409 -0
  99. package/dist/js/regenerator_runtime.js +721 -0
  100. package/dist/js/s.js +429 -0
  101. package/dist/main.js +13418 -0
  102. package/dist/other/jsenv.png +0 -0
  103. package/dist/s.js +626 -0
  104. package/dist/s.js.map +204 -0
  105. package/package.json +55 -48
  106. package/readme.md +6 -14
  107. package/src/build/build.js +1074 -563
  108. package/src/build/build_urls_generator.js +65 -24
  109. package/src/build/graph_utils.js +31 -0
  110. package/src/build/{inject_version_mappings.js → inject_global_version_mappings.js} +49 -18
  111. package/src/build/inject_service_worker_urls.js +79 -0
  112. package/src/build/resync_ressource_hints.js +115 -0
  113. package/src/build/start_build_server.js +210 -0
  114. package/src/dev/plugins/explorer/client/explorer.html +1 -1
  115. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +9 -13
  116. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  117. package/src/dev/start_dev_server.js +165 -38
  118. package/src/execute/execute.js +35 -8
  119. package/src/execute/run.js +21 -57
  120. package/src/execute/runtimes/browsers/from_playwright.js +220 -150
  121. package/src/execute/runtimes/node/child_exec_options.js +1 -1
  122. package/src/execute/runtimes/node/controllable_file.mjs +26 -10
  123. package/src/execute/runtimes/node/kill_process_tree.js +2 -4
  124. package/src/execute/runtimes/node/node_execution_performance.js +67 -0
  125. package/src/execute/runtimes/node/node_process.js +288 -39
  126. package/src/main.js +27 -0
  127. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  128. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  129. package/src/omega/errors.js +63 -67
  130. package/src/omega/fetched_content_compliance.js +24 -0
  131. package/src/omega/file_url_converter.js +9 -51
  132. package/src/omega/kitchen.js +605 -467
  133. package/src/omega/omega_server.js +2 -3
  134. package/src/omega/server/file_service.js +88 -41
  135. package/src/omega/server/user_agent.js +5 -6
  136. package/src/omega/url_graph/url_graph_load.js +31 -23
  137. package/src/omega/url_graph/url_graph_report.js +94 -51
  138. package/src/omega/url_graph/url_info_transformations.js +37 -17
  139. package/src/omega/url_graph.js +88 -19
  140. package/src/omega/url_specifier_encoding.js +59 -0
  141. package/src/omega/web_workers.js +42 -0
  142. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  143. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +19 -12
  144. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  145. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  146. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +41 -0
  147. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +204 -0
  148. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +25 -0
  149. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  150. package/src/plugins/bundling/css/bundle_css.js +140 -0
  151. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  152. package/src/plugins/bundling/js_module/bundle_js_module.js +343 -0
  153. package/src/plugins/bundling/jsenv_plugin_bundling.js +54 -0
  154. package/src/plugins/cache_control/jsenv_plugin_cache_control.js +34 -0
  155. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +54 -41
  156. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +183 -0
  157. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  158. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  159. package/src/plugins/html_supervisor/client/html_supervisor_installer.js +254 -0
  160. package/src/plugins/html_supervisor/client/html_supervisor_setup.js +82 -0
  161. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  162. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  163. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +73 -55
  164. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  165. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  166. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  167. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +7 -4
  168. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +100 -0
  169. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +33 -8
  170. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  171. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  172. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +40 -36
  173. package/src/plugins/inject_globals/inject_globals.js +57 -0
  174. package/src/plugins/inject_globals/jsenv_plugin_inject_globals.js +24 -0
  175. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  176. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +22 -21
  177. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +161 -0
  178. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  179. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +8 -11
  180. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +294 -0
  181. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  182. package/src/plugins/minification/css/minify_css.js +9 -0
  183. package/src/plugins/minification/html/minify_html.js +13 -0
  184. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  185. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  186. package/src/plugins/minification/json/minify_json.js +8 -0
  187. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +162 -0
  188. package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
  189. package/src/{omega → plugins}/plugin_controller.js +57 -12
  190. package/src/plugins/plugins.js +89 -0
  191. package/src/plugins/transpilation/as_js_classic/client/s.js +429 -0
  192. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  193. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  194. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +211 -0
  195. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +304 -0
  196. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_workers.js +55 -0
  197. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  198. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  199. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  200. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +14 -17
  201. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  202. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +39 -32
  203. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +30 -6
  204. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  205. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  206. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  207. package/src/plugins/transpilation/babel/require_babel_plugin.js +8 -0
  208. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  209. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +184 -0
  210. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +79 -0
  211. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +46 -0
  212. package/src/plugins/url_analysis/css/css_urls.js +49 -0
  213. package/src/plugins/url_analysis/html/html_urls.js +272 -0
  214. package/src/plugins/url_analysis/js/js_urls.js +68 -0
  215. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +103 -0
  216. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +20 -0
  217. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +9 -5
  218. package/src/plugins/url_version/jsenv_plugin_url_version.js +28 -0
  219. package/src/require_from_jsenv.js +3 -0
  220. package/src/test/execute_plan.js +85 -44
  221. package/src/test/execute_test_plan.js +37 -25
  222. package/src/test/execution_steps.js +2 -5
  223. package/src/test/logs_file_execution.js +56 -49
  224. package/main.js +0 -19
  225. package/src/build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js +0 -227
  226. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  227. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  228. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +0 -374
  229. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  230. package/src/execute/runtimes/node/controlled_process.js +0 -316
  231. package/src/omega/core_plugins/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
  232. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  233. package/src/omega/core_plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -58
  234. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_installer.js +0 -168
  235. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
  236. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  237. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  238. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  239. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  240. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  241. package/src/omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js +0 -142
  242. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  243. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  244. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  245. package/src/omega/core_plugins/url_version/jsenv_plugin_url_version.js +0 -50
  246. package/src/omega/core_plugins.js +0 -39
  247. package/src/omega/runtime_support/default_runtime_support.js +0 -13
  248. package/src/omega/url_graph/url_graph_sort.js +0 -29
  249. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  250. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  251. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  252. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  253. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -8,14 +8,13 @@ import {
8
8
  } from "@jsenv/server"
9
9
  import { convertFileSystemErrorToResponseProperties } from "@jsenv/server/src/internal/convertFileSystemErrorToResponseProperties.js"
10
10
  import { createCallbackListNotifiedOnce } from "@jsenv/abort"
11
- import { loggerToLogLevel } from "@jsenv/logger"
12
11
 
13
12
  import { createFileService } from "./server/file_service.js"
14
13
 
15
14
  export const startOmegaServer = async ({
16
15
  signal,
17
16
  handleSIGINT,
18
- logger,
17
+ logLevel,
19
18
  protocol = "http",
20
19
  http2 = protocol === "https",
21
20
  privateKey,
@@ -48,7 +47,7 @@ export const startOmegaServer = async ({
48
47
  stopOnSIGINT: handleSIGINT,
49
48
  stopOnInternalError: false,
50
49
  keepProcessAlive,
51
- logLevel: loggerToLogLevel(logger),
50
+ logLevel,
52
51
  startLog: false,
53
52
 
54
53
  protocol,
@@ -3,7 +3,7 @@ import {
3
3
  serveDirectory,
4
4
  composeTwoResponses,
5
5
  } from "@jsenv/server"
6
- import { urlIsInsideOf, moveUrl } from "@jsenv/filesystem"
6
+ import { urlIsInsideOf, moveUrl } from "@jsenv/urls"
7
7
 
8
8
  import { parseUserAgentHeader } from "./user_agent.js"
9
9
 
@@ -20,6 +20,11 @@ export const createFileService = ({
20
20
  urlGraph,
21
21
  scenario,
22
22
  }
23
+ const augmentResponseContext = {
24
+ rootDirectoryUrl,
25
+ urlGraph,
26
+ scenario,
27
+ }
23
28
 
24
29
  const getResponse = async (request) => {
25
30
  // serve file inside ".jsenv" directory
@@ -39,43 +44,87 @@ export const createFileService = ({
39
44
  if (responseFromPlugin) {
40
45
  return responseFromPlugin
41
46
  }
42
- const { runtimeName, runtimeVersion } = parseUserAgentHeader(
43
- request.headers["user-agent"],
44
- )
45
- const runtimeSupport = {
46
- [runtimeName]: runtimeVersion,
47
+ let reference
48
+ const parentUrl = inferParentFromRequest(request, rootDirectoryUrl)
49
+ if (parentUrl) {
50
+ reference = urlGraph.inferReference(request.ressource, parentUrl)
51
+ }
52
+ if (!reference) {
53
+ const entryPoint = kitchen.prepareEntryPoint({
54
+ trace: parentUrl || rootDirectoryUrl,
55
+ parentUrl: parentUrl || rootDirectoryUrl,
56
+ type: "entry_point",
57
+ specifier: request.ressource,
58
+ })
59
+ reference = entryPoint[0]
60
+ }
61
+ const urlInfo = urlGraph.reuseOrCreateUrlInfo(reference.url)
62
+
63
+ const ifNoneMatch = request.headers["if-none-match"]
64
+ if (ifNoneMatch && urlInfo.contentEtag === ifNoneMatch) {
65
+ return {
66
+ status: 304,
67
+ headers: {
68
+ "cache-control": `private,max-age=0,must-revalidate`,
69
+ ...urlInfo.headers,
70
+ },
71
+ }
47
72
  }
48
- const reference = kitchen.createReference({
49
- parentUrl: inferParentFromRequest(request, rootDirectoryUrl),
50
- type: "entry_point",
51
- specifier: request.ressource,
52
- })
53
- const requestedUrlInfo = kitchen.resolveReference(reference)
54
- const referenceFromGraph = urlGraph.inferReference(
55
- reference.url,
56
- reference.parentUrl,
57
- )
58
73
  try {
59
- await kitchen.cook({
60
- reference: referenceFromGraph || reference,
61
- urlInfo: requestedUrlInfo,
62
- outDirectoryUrl: `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`,
63
- runtimeSupport,
74
+ // urlInfo objects are reused, they must be "reset" before cooking them again
75
+ if (
76
+ urlInfo.contentEtag &&
77
+ !urlInfo.isInline &&
78
+ urlInfo.type !== "sourcemap"
79
+ ) {
80
+ urlInfo.sourcemap = null
81
+ urlInfo.sourcemapReference = null
82
+ urlInfo.content = null
83
+ urlInfo.originalContent = null
84
+ urlInfo.type = null
85
+ urlInfo.subtype = null
86
+ urlInfo.timing = {}
87
+ }
88
+ const { runtimeName, runtimeVersion } = parseUserAgentHeader(
89
+ request.headers["user-agent"],
90
+ )
91
+ await kitchen.cook(urlInfo, {
92
+ request,
93
+ reference,
94
+ clientRuntimeCompat: {
95
+ [runtimeName]: runtimeVersion,
96
+ },
97
+ outDirectoryUrl:
98
+ scenario === "dev"
99
+ ? `${rootDirectoryUrl}.jsenv/${runtimeName}@${runtimeVersion}/`
100
+ : `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`,
64
101
  })
65
- const { response, contentType, content } = requestedUrlInfo
102
+ let { response } = urlInfo
66
103
  if (response) {
67
104
  return response
68
105
  }
69
- return {
106
+ response = {
70
107
  url: reference.url,
71
108
  status: 200,
72
109
  headers: {
73
- "content-type": contentType,
74
- "content-length": Buffer.byteLength(content),
110
+ "content-length": Buffer.byteLength(urlInfo.content),
75
111
  "cache-control": `private,max-age=0,must-revalidate`,
112
+ "eTag": urlInfo.contentEtag,
113
+ ...urlInfo.headers,
114
+ "content-type": urlInfo.contentType,
76
115
  },
77
- body: content,
116
+ body: urlInfo.content,
117
+ timing: urlInfo.timing,
78
118
  }
119
+ kitchen.pluginController.callHooks(
120
+ "augmentResponse",
121
+ { reference, urlInfo },
122
+ augmentResponseContext,
123
+ (returnValue) => {
124
+ response = composeTwoResponses(response, returnValue)
125
+ },
126
+ )
127
+ return response
79
128
  } catch (e) {
80
129
  const code = e.code
81
130
  if (code === "PARSE_ERROR") {
@@ -86,14 +135,14 @@ export const createFileService = ({
86
135
  statusText: e.reason,
87
136
  statusMessage: e.message,
88
137
  headers: {
89
- "content-type": requestedUrlInfo.contentType,
90
- "content-length": Buffer.byteLength(requestedUrlInfo.content),
138
+ "content-type": urlInfo.contentType,
139
+ "content-length": Buffer.byteLength(urlInfo.content),
91
140
  "cache-control": "no-store",
92
141
  },
93
- body: requestedUrlInfo.content,
142
+ body: urlInfo.content,
94
143
  }
95
144
  }
96
- if (code === "EISDIR") {
145
+ if (code === "DIRECTORY_REFERENCE_NOT_ALLOWED") {
97
146
  return serveDirectory(reference.url, {
98
147
  headers: {
99
148
  accept: "text/html",
@@ -127,16 +176,6 @@ export const createFileService = ({
127
176
  }
128
177
  return async (request) => {
129
178
  let response = await getResponse(request)
130
- if (response.url) {
131
- kitchen.pluginController.callHooks(
132
- "augmentResponse",
133
- response,
134
- {},
135
- (returnValue) => {
136
- response = composeTwoResponses(response, returnValue)
137
- },
138
- )
139
- }
140
179
  return response
141
180
  }
142
181
  }
@@ -144,7 +183,15 @@ export const createFileService = ({
144
183
  const inferParentFromRequest = (request, rootDirectoryUrl) => {
145
184
  const { referer } = request.headers
146
185
  if (!referer) {
147
- return rootDirectoryUrl
186
+ return null
187
+ }
188
+ const refererUrlObject = new URL(referer)
189
+ refererUrlObject.searchParams.delete("hmr")
190
+ refererUrlObject.searchParams.delete("v")
191
+ const { pathname, search } = refererUrlObject
192
+ if (pathname.startsWith("/@fs/")) {
193
+ const fsRootRelativeUrl = pathname.slice("/@fs/".length)
194
+ return `file:///${fsRootRelativeUrl}${search}`
148
195
  }
149
196
  return moveUrl({
150
197
  url: referer,
@@ -1,8 +1,7 @@
1
- import { createRequire } from "node:module"
1
+ import { memoizeByFirstArgument } from "@jsenv/utils/memoize/memoize_by_first_argument.js"
2
+ import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
2
3
 
3
- const require = createRequire(import.meta.url)
4
-
5
- export const parseUserAgentHeader = (userAgent) => {
4
+ export const parseUserAgentHeader = memoizeByFirstArgument((userAgent) => {
6
5
  if (userAgent.includes("node-fetch/")) {
7
6
  // it's not really node and conceptually we can't assume the node version
8
7
  // but good enough for now
@@ -11,7 +10,7 @@ export const parseUserAgentHeader = (userAgent) => {
11
10
  runtimeVersion: process.version.slice(1),
12
11
  }
13
12
  }
14
- const UA = require("@financial-times/polyfill-useragent-normaliser")
13
+ const UA = requireFromJsenv("@financial-times/polyfill-useragent-normaliser")
15
14
  const { ua } = new UA(userAgent)
16
15
  const { family, major, minor, patch } = ua
17
16
  return {
@@ -19,4 +18,4 @@ export const parseUserAgentHeader = (userAgent) => {
19
18
  runtimeVersion:
20
19
  family === "Other" ? "unknown" : `${major}.${minor}${patch}`,
21
20
  }
22
- }
21
+ })
@@ -1,62 +1,69 @@
1
1
  import { ensureEmptyDirectory } from "@jsenv/filesystem"
2
2
 
3
3
  export const loadUrlGraph = async ({
4
+ operation,
4
5
  urlGraph,
5
6
  kitchen,
6
7
  startLoading,
8
+ writeGeneratedFiles,
7
9
  outDirectoryUrl,
8
- runtimeSupport,
10
+ clientRuntimeCompat,
9
11
  }) => {
10
- if (outDirectoryUrl) {
12
+ if (writeGeneratedFiles && outDirectoryUrl) {
11
13
  await ensureEmptyDirectory(outDirectoryUrl)
12
14
  }
13
15
  const promises = []
14
- const cook = ({ urlInfo, ...rest }) => {
15
- const promiseFromData = urlInfo.data.promise
16
+ const promiseMap = new Map()
17
+ const cook = (urlInfo, context) => {
18
+ const promiseFromData = promiseMap.get(urlInfo)
16
19
  if (promiseFromData) return promiseFromData
17
- const promise = _cook({
18
- urlInfo,
20
+ const promise = _cook(urlInfo, {
19
21
  outDirectoryUrl,
20
- runtimeSupport,
21
- ...rest,
22
+ clientRuntimeCompat,
23
+ ...context,
22
24
  })
23
25
  promises.push(promise)
24
- urlInfo.data.promise = promise
26
+ promiseMap.set(urlInfo, promise)
25
27
  return promise
26
28
  }
27
- const _cook = async ({ urlInfo, ...rest }) => {
28
- await kitchen.cook({
29
- urlInfo,
29
+ const _cook = async (urlInfo, context) => {
30
+ await kitchen.cook(urlInfo, {
30
31
  cookDuringCook: cook,
31
- ...rest,
32
+ ...context,
32
33
  })
33
34
  const { references } = urlInfo
34
35
  references.forEach((reference) => {
35
- cook({
36
- reference,
37
- urlInfo: urlGraph.getUrlInfo(reference.url),
38
- })
36
+ // we don't cook ressource hints
37
+ // because they might refer to ressource that will be modified during build
38
+ // It also means something else have to reference that url in order to cook it
39
+ // so that the preload is deleted by "resync_ressource_hints.js" otherwise
40
+ if (reference.isRessourceHint) {
41
+ return
42
+ }
43
+ // we use reference.generatedUrl to mimic what a browser would do:
44
+ // do a fetch to the specifier as found in the file
45
+ const referencedUrlInfo = urlGraph.reuseOrCreateUrlInfo(
46
+ reference.generatedUrl,
47
+ )
48
+ cook(referencedUrlInfo, { reference })
39
49
  })
40
50
  }
41
51
  startLoading(
42
52
  ({ trace, parentUrl = kitchen.rootDirectoryUrl, type, specifier }) => {
43
- const entryReference = kitchen.createReference({
53
+ const [entryReference, entryUrlInfo] = kitchen.prepareEntryPoint({
44
54
  trace,
45
55
  parentUrl,
46
56
  type,
47
57
  specifier,
48
58
  })
49
- const entryUrlInfo = kitchen.resolveReference(entryReference)
50
59
  entryUrlInfo.data.isEntryPoint = true
51
- cook({
52
- reference: entryReference,
53
- urlInfo: entryUrlInfo,
54
- })
60
+ cook(entryUrlInfo, { reference: entryReference })
55
61
  return [entryReference, entryUrlInfo]
56
62
  },
57
63
  )
58
64
 
59
65
  const waitAll = async () => {
66
+ operation.throwIfAborted()
60
67
  if (promises.length === 0) {
61
68
  return
62
69
  }
@@ -66,4 +73,5 @@ export const loadUrlGraph = async ({
66
73
  await waitAll()
67
74
  }
68
75
  await waitAll()
76
+ promiseMap.clear()
69
77
  }
@@ -1,37 +1,33 @@
1
- import { ANSI } from "@jsenv/log"
2
-
3
- import { byteAsFileSize } from "@jsenv/utils/logs/size_log.js"
1
+ import { ANSI, byteAsFileSize, distributePercentages } from "@jsenv/log"
4
2
 
5
3
  export const createUrlGraphSummary = (
6
4
  urlGraph,
7
5
  { title = "graph summary" } = {},
8
6
  ) => {
9
7
  const graphReport = createUrlGraphReport(urlGraph)
10
- const totalLabel = `Total`
11
8
  return `--- ${title} ---
12
9
  ${createRepartitionMessage(graphReport)}
13
- ${ANSI.color(totalLabel, ANSI.GREY)} ${
14
- graphReport.total.count
15
- } (${byteAsFileSize(graphReport.total.size)})
16
10
  --------------------`
17
11
  }
18
12
 
19
13
  const createUrlGraphReport = (urlGraph) => {
20
14
  const { urlInfos } = urlGraph
21
15
  const countGroups = {
16
+ sourcemaps: 0,
22
17
  html: 0,
23
18
  css: 0,
24
19
  js: 0,
25
- assets: 0,
26
- sourcemaps: 0,
20
+ json: 0,
21
+ other: 0,
27
22
  total: 0,
28
23
  }
29
24
  const sizeGroups = {
25
+ sourcemaps: 0,
30
26
  html: 0,
31
27
  css: 0,
32
28
  js: 0,
33
- sourcemaps: 0,
34
- assets: 0,
29
+ json: 0,
30
+ other: 0,
35
31
  total: 0,
36
32
  }
37
33
  Object.keys(urlInfos).forEach((url) => {
@@ -39,8 +35,10 @@ const createUrlGraphReport = (urlGraph) => {
39
35
  return
40
36
  }
41
37
  const urlInfo = urlInfos[url]
42
- // ignore inline files, they are already taken into account in the file where they appear
43
- if (urlInfo.isInline) {
38
+ // ignore:
39
+ // - inline files: they are already taken into account in the file where they appear
40
+ // - ignored files: we don't know their content
41
+ if (urlInfo.isInline || !urlInfo.shouldHandle) {
44
42
  return
45
43
  }
46
44
  // file loaded via import assertion are already inside the graph
@@ -49,9 +47,9 @@ const createUrlGraphReport = (urlGraph) => {
49
47
  // and only the js module remain (likely bundled)
50
48
  const urlObject = new URL(urlInfo.url)
51
49
  if (
52
- urlObject.searchParams.has("json_module") ||
53
- urlObject.searchParams.has("css_module") ||
54
- urlObject.searchParams.has("text_module")
50
+ urlObject.searchParams.has("as_json_module") ||
51
+ urlObject.searchParams.has("as_css_module") ||
52
+ urlObject.searchParams.has("as_text_module")
55
53
  ) {
56
54
  return
57
55
  }
@@ -79,17 +77,63 @@ const createUrlGraphReport = (urlGraph) => {
79
77
  sizeGroups.js += urlContentSize
80
78
  return
81
79
  }
82
- countGroups.assets++
83
- sizeGroups.assets += urlContentSize
80
+ if (category === "json") {
81
+ countGroups.json++
82
+ sizeGroups.json += urlContentSize
83
+ return
84
+ }
85
+ countGroups.other++
86
+ sizeGroups.other += urlContentSize
84
87
  return
85
88
  })
89
+
90
+ const sizesToDistribute = {}
91
+ Object.keys(sizeGroups).forEach((groupName) => {
92
+ if (groupName !== "sourcemaps" && groupName !== "total") {
93
+ sizesToDistribute[groupName] = sizeGroups[groupName]
94
+ }
95
+ })
96
+ const percentageGroups = distributePercentages(sizesToDistribute)
97
+
86
98
  return {
87
- html: { count: countGroups.html, size: sizeGroups.html },
88
- css: { count: countGroups.css, size: sizeGroups.css },
89
- js: { count: countGroups.js, size: sizeGroups.js },
90
- sourcemaps: { count: countGroups.sourcemaps, size: sizeGroups.sourcemaps },
91
- assets: { count: countGroups.assets, size: sizeGroups.assets },
92
- total: { count: countGroups.total, size: sizeGroups.total },
99
+ // sourcemaps are special, there size are ignored
100
+ // so there is no "percentage" associated
101
+ sourcemaps: {
102
+ count: countGroups.sourcemaps,
103
+ size: sizeGroups.sourcemaps,
104
+ percentage: undefined,
105
+ },
106
+
107
+ html: {
108
+ count: countGroups.html,
109
+ size: sizeGroups.html,
110
+ percentage: percentageGroups.html,
111
+ },
112
+ css: {
113
+ count: countGroups.css,
114
+ size: sizeGroups.css,
115
+ percentage: percentageGroups.css,
116
+ },
117
+ js: {
118
+ count: countGroups.js,
119
+ size: sizeGroups.js,
120
+ percentage: percentageGroups.js,
121
+ },
122
+ json: {
123
+ count: countGroups.json,
124
+ size: sizeGroups.json,
125
+ percentage: percentageGroups.json,
126
+ },
127
+ other: {
128
+ count: countGroups.other,
129
+ size: sizeGroups.other,
130
+ percentage: percentageGroups.other,
131
+ },
132
+ total: {
133
+ count: countGroups.total,
134
+ size: sizeGroups.total,
135
+ percentage: 100,
136
+ },
93
137
  }
94
138
  }
95
139
 
@@ -106,32 +150,22 @@ const determineCategory = (urlInfo) => {
106
150
  if (urlInfo.type === "js_module" || urlInfo.type === "js_classic") {
107
151
  return "js"
108
152
  }
109
- return "assets"
153
+ if (urlInfo.type === "json") {
154
+ return "json"
155
+ }
156
+ return "other"
110
157
  }
111
158
 
112
- const createRepartitionMessage = ({ html, css, js, assets }) => {
113
- const parts = []
114
- if (html.count) {
115
- parts.push(
116
- `${ANSI.color(`html:`, ANSI.GREY)} ${html.count} (${byteAsFileSize(
117
- html.size,
118
- )})`,
119
- )
120
- }
121
- if (css.count) {
159
+ const createRepartitionMessage = ({ html, css, js, json, other, total }) => {
160
+ const addPart = (name, { count, size, percentage }) => {
122
161
  parts.push(
123
- `${ANSI.color(`css:`, ANSI.GREY)} ${css.count} (${byteAsFileSize(
124
- css.size,
125
- )})`,
126
- )
127
- }
128
- if (js.count) {
129
- parts.push(
130
- `${ANSI.color(`js:`, ANSI.GREY)} ${js.count} (${byteAsFileSize(
131
- js.size,
132
- )})`,
162
+ `${ANSI.color(`${name}:`, ANSI.GREY)} ${count} (${byteAsFileSize(
163
+ size,
164
+ )} / ${percentage} %)`,
133
165
  )
134
166
  }
167
+
168
+ const parts = []
135
169
  // if (sourcemaps.count) {
136
170
  // parts.push(
137
171
  // `${ANSI.color(`sourcemaps:`, ANSI.GREY)} ${
@@ -139,13 +173,22 @@ const createRepartitionMessage = ({ html, css, js, assets }) => {
139
173
  // } (${byteAsFileSize(sourcemaps.size)})`,
140
174
  // )
141
175
  // }
142
- if (assets.count) {
143
- parts.push(
144
- `${ANSI.color(`assets:`, ANSI.GREY)} ${assets.count} (${byteAsFileSize(
145
- assets.size,
146
- )})`,
147
- )
176
+ if (html.count) {
177
+ addPart("html ", html)
178
+ }
179
+ if (css.count) {
180
+ addPart("css ", css)
181
+ }
182
+ if (js.count) {
183
+ addPart("js ", js)
184
+ }
185
+ if (json.count) {
186
+ addPart("json ", json)
187
+ }
188
+ if (other.count) {
189
+ addPart("other", other)
148
190
  }
191
+ addPart("total", total)
149
192
  return `- ${parts.join(`
150
193
  - `)}`
151
194
  }
@@ -1,3 +1,6 @@
1
+ import { bufferToEtag } from "@jsenv/filesystem"
2
+ import { urlToRelativeUrl } from "@jsenv/urls"
3
+
1
4
  import { composeTwoSourcemaps } from "@jsenv/utils/sourcemap/sourcemap_composition_v3.js"
2
5
  import {
3
6
  SOURCEMAP,
@@ -8,7 +11,8 @@ import {
8
11
  export const createUrlInfoTransformer = ({
9
12
  logger,
10
13
  sourcemaps,
11
- sourcemapsSources,
14
+ sourcemapsSourcesContent,
15
+ sourcemapsRelativeSources,
12
16
  urlGraph,
13
17
  injectSourcemapPlaceholder,
14
18
  foundSourcemap,
@@ -23,17 +27,22 @@ export const createUrlInfoTransformer = ({
23
27
  // for inline content (<script> insdide html)
24
28
  // chrome won't be able to fetch the file as it does not exists
25
29
  // so sourcemap must contain sources
26
- urlInfo.isInline || sourcemapsSources
30
+ sourcemapsSourcesContent ||
31
+ urlInfo.isInline ||
32
+ (sourcemap.sources &&
33
+ sourcemap.sources.some(
34
+ (source) => !source || !source.startsWith("file:"),
35
+ ))
27
36
  if (sourcemap.sources && sourcemap.sources.length > 1) {
28
37
  sourcemap.sources = sourcemap.sources.map(
29
- (source) => new URL(source, urlInfo.data.rawUrl || urlInfo.url).href,
38
+ (source) => new URL(source, urlInfo.originalUrl).href,
30
39
  )
31
40
  if (!wantSourcesContent) {
32
41
  sourcemap.sourcesContent = undefined
33
42
  }
34
43
  return sourcemap
35
44
  }
36
- sourcemap.sources = [urlInfo.data.rawUrl || urlInfo.url]
45
+ sourcemap.sources = [urlInfo.originalUrl]
37
46
  sourcemap.sourcesContent = [urlInfo.originalContent]
38
47
  if (!wantSourcesContent) {
39
48
  sourcemap.sourcesContent = undefined
@@ -66,6 +75,7 @@ export const createUrlInfoTransformer = ({
66
75
 
67
76
  // already loaded during "load" hook (happens during build)
68
77
  if (urlInfo.sourcemap) {
78
+ urlInfo.sourcemap = normalizeSourcemap(urlInfo, urlInfo.sourcemap)
69
79
  return
70
80
  }
71
81
  // check for existing sourcemap for this content
@@ -78,17 +88,15 @@ export const createUrlInfoTransformer = ({
78
88
  const [sourcemapReference, sourcemapUrlInfo] = foundSourcemap({
79
89
  urlInfo,
80
90
  type,
81
- line,
82
- column,
83
91
  specifier,
92
+ specifierLine: line,
93
+ specifierColumn: column,
84
94
  })
85
95
  try {
86
- await context.cook({
87
- reference: sourcemapReference,
88
- urlInfo: sourcemapUrlInfo,
89
- })
90
- const sourcemap = JSON.parse(sourcemapUrlInfo.content)
91
- urlInfo.sourcemap = normalizeSourcemap(urlInfo, sourcemap)
96
+ await context.cook(sourcemapUrlInfo, { reference: sourcemapReference })
97
+ const sourcemapRaw = JSON.parse(sourcemapUrlInfo.content)
98
+ const sourcemap = normalizeSourcemap(urlInfo, sourcemapRaw)
99
+ urlInfo.sourcemap = sourcemap
92
100
  } catch (e) {
93
101
  logger.error(`Error while handling existing sourcemap: ${e.message}`)
94
102
  return
@@ -137,20 +145,32 @@ export const createUrlInfoTransformer = ({
137
145
  const sourcemapReference = urlInfo.sourcemapReference
138
146
  const sourcemapUrlInfo = urlGraph.getUrlInfo(sourcemapReference.url)
139
147
  sourcemapUrlInfo.contentType = "application/json"
140
- sourcemapUrlInfo.content = JSON.stringify(urlInfo.sourcemap, null, " ")
148
+ const sourcemap = urlInfo.sourcemap
149
+ if (sourcemapsRelativeSources) {
150
+ sourcemap.sources = sourcemap.sources.map((source) => {
151
+ const sourceRelative = urlToRelativeUrl(source, urlInfo.url)
152
+ return sourceRelative || "."
153
+ })
154
+ }
155
+ sourcemapUrlInfo.content = JSON.stringify(sourcemap, null, " ")
141
156
  if (sourcemaps === "inline") {
142
- sourcemapReference.generatedSpecifier = sourcemapToBase64Url(
143
- urlInfo.sourcemap,
144
- )
157
+ sourcemapReference.generatedSpecifier = sourcemapToBase64Url(sourcemap)
145
158
  }
146
159
  if (sourcemaps === "file" || sourcemaps === "inline") {
147
160
  urlInfo.content = SOURCEMAP.writeComment({
148
161
  contentType: urlInfo.contentType,
149
162
  content: urlInfo.content,
150
- specifier: sourcemapReference.generatedSpecifier,
163
+ specifier:
164
+ sourcemaps === "file" && sourcemapsRelativeSources
165
+ ? urlToRelativeUrl(sourcemapReference.url, urlInfo.url)
166
+ : sourcemapReference.generatedSpecifier,
151
167
  })
152
168
  }
169
+ } else if (urlInfo.sourcemapReference) {
170
+ // in the end we don't use the sourcemap placeholder
171
+ urlGraph.deleteUrlInfo(urlInfo.sourcemapReference.url)
153
172
  }
173
+ urlInfo.contentEtag = bufferToEtag(Buffer.from(urlInfo.content))
154
174
  }
155
175
 
156
176
  return {