@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
@@ -1,374 +0,0 @@
1
- import { urlToRelativeUrl } from "@jsenv/filesystem"
2
- import { createCallbackList } from "@jsenv/abort"
3
-
4
- import { injectQueryParams } from "@jsenv/utils/urls/url_utils.js"
5
- import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
6
- import {
7
- parseHtmlString,
8
- stringifyHtmlAst,
9
- injectScriptAsEarlyAsPossible,
10
- createHtmlNode,
11
- } from "@jsenv/utils/html_ast/html_ast.js"
12
- import { applyBabelPlugins } from "@jsenv/utils/js_ast/apply_babel_plugins.js"
13
-
14
- import { createSSEService } from "./sse_service.js"
15
- import { collectHotDataFromHtmlAst } from "./html_hot_dependencies.js"
16
- import { babelPluginMetadataImportMetaHot } from "./babel_plugin_metadata_import_meta_hot.js"
17
-
18
- export const jsenvPluginAutoreload = ({
19
- rootDirectoryUrl,
20
- urlGraph,
21
- autoreloadPatterns,
22
- }) => {
23
- return [
24
- jsenvPluginHot(),
25
- jsenvPluginHotSSE({
26
- rootDirectoryUrl,
27
- urlGraph,
28
- autoreloadPatterns,
29
- }),
30
- ]
31
- }
32
-
33
- const jsenvPluginHot = () => {
34
- const eventSourceClientFileUrl = new URL(
35
- "./client/event_source_client.js",
36
- import.meta.url,
37
- ).href
38
- const importMetaHotClientFileUrl = new URL(
39
- "./client/import_meta_hot.js",
40
- import.meta.url,
41
- ).href
42
-
43
- return {
44
- name: "jsenv:hot",
45
- appliesDuring: { dev: true },
46
- normalize: ({ url, data }) => {
47
- const urlObject = new URL(url)
48
- if (!urlObject.searchParams.has("hmr")) {
49
- data.hmr = false
50
- return null
51
- }
52
- data.hmr = true
53
- // "hmr" search param goal is to mark url as enabling hmr:
54
- // this goal is achieved when we reach this part of the code
55
- // We get rid of this params so that urlGraph and other parts of the code
56
- // recognize the url (it is not considered as a different url)
57
- urlObject.searchParams.delete("hmr")
58
- urlObject.searchParams.delete("v")
59
- return urlObject.href
60
- },
61
- transformReferencedUrl: ({ parentUrl, url, data }, { urlGraph }) => {
62
- const parentUrlInfo = urlGraph.getUrlInfo(parentUrl)
63
- if (!parentUrlInfo || !parentUrlInfo.data.hmr) {
64
- return null
65
- }
66
- if (!data.hmrTimestamp) {
67
- return null
68
- }
69
- return injectQueryParams(url, {
70
- hmr: "",
71
- v: data.hmrTimestamp,
72
- })
73
- },
74
- transform: {
75
- html: ({ data, content }, { referenceUtils }) => {
76
- const htmlAst = parseHtmlString(content)
77
- const { hotReferences } = collectHotDataFromHtmlAst(htmlAst)
78
- data.hotDecline = false
79
- data.hotAcceptSelf = false
80
- data.hotAcceptDependencies = hotReferences.map(
81
- ({ type, specifier }) => {
82
- const [reference] = referenceUtils.inject({
83
- type,
84
- specifier,
85
- })
86
- return reference.url
87
- },
88
- )
89
- const [eventSourceClientReference] = referenceUtils.inject({
90
- type: "script_src",
91
- specifier: eventSourceClientFileUrl,
92
- })
93
- injectScriptAsEarlyAsPossible(
94
- htmlAst,
95
- createHtmlNode({
96
- "tagName": "script",
97
- "type": "module",
98
- "src": eventSourceClientReference.generatedSpecifier,
99
- "injected-by": "jsenv:hot",
100
- }),
101
- )
102
- const htmlModified = stringifyHtmlAst(htmlAst)
103
- return {
104
- content: htmlModified,
105
- }
106
- },
107
- css: ({ data }) => {
108
- data.hotDecline = false
109
- data.hotAcceptSelf = false
110
- data.hotAcceptDependencies = []
111
- },
112
- js_module: async (
113
- { url, generatedUrl, data, content },
114
- { referenceUtils },
115
- ) => {
116
- const { metadata } = await applyBabelPlugins({
117
- babelPlugins: [babelPluginMetadataImportMetaHot],
118
- url,
119
- generatedUrl,
120
- content,
121
- })
122
- const {
123
- importMetaHotDetected,
124
- hotDecline,
125
- hotAcceptSelf,
126
- hotAcceptDependencies,
127
- } = metadata
128
- data.hotDecline = hotDecline
129
- data.hotAcceptSelf = hotAcceptSelf
130
- data.hotAcceptDependencies = hotAcceptDependencies
131
- if (!importMetaHotDetected) {
132
- return null
133
- }
134
- // For some reason using magic source here produce
135
- // better sourcemap than doing the equivalent with babel
136
- // I suspect it's because I was doing injectAstAfterImport(programPath, ast.program.body[0])
137
- // which is likely not well supported by babel
138
- const [importMetaHotClientFileReference] = referenceUtils.inject({
139
- parentUrl: url,
140
- type: "js_import_export",
141
- specifier: importMetaHotClientFileUrl,
142
- })
143
- const magicSource = createMagicSource(content)
144
- magicSource.prepend(
145
- `import { createImportMetaHot } from ${importMetaHotClientFileReference.generatedSpecifier}
146
- import.meta.hot = createImportMetaHot(import.meta.url)
147
- `,
148
- )
149
- return magicSource.toContentAndSourcemap()
150
- },
151
- },
152
- }
153
- }
154
-
155
- const jsenvPluginHotSSE = ({
156
- rootDirectoryUrl,
157
- urlGraph,
158
- autoreloadPatterns,
159
- }) => {
160
- const hotUpdateCallbackList = createCallbackList()
161
- const notifyDeclined = ({ cause, reason, declinedBy }) => {
162
- hotUpdateCallbackList.notify({
163
- declined: true,
164
- cause,
165
- reason,
166
- declinedBy,
167
- })
168
- }
169
- const notifyAccepted = ({ cause, reason, instructions }) => {
170
- hotUpdateCallbackList.notify({
171
- accepted: true,
172
- cause,
173
- reason,
174
- instructions,
175
- })
176
- }
177
- const updateHmrTimestamp = (urlInfo, hmrTimestamp) => {
178
- const urlInfos = urlGraph.urlInfos
179
- const seen = []
180
- const iterate = (urlInfo) => {
181
- if (seen.includes(urlInfo.url)) {
182
- return
183
- }
184
- seen.push(urlInfo.url)
185
- urlInfo.data.hmrTimestamp = hmrTimestamp
186
- urlInfo.dependents.forEach((dependentUrl) => {
187
- const dependentUrlInfo = urlInfos[dependentUrl]
188
- if (
189
- !dependentUrlInfo.data.hotAcceptDependencies.includes(urlInfo.url)
190
- ) {
191
- iterate(dependentUrlInfo, hmrTimestamp)
192
- }
193
- })
194
- }
195
- iterate(urlInfo)
196
- }
197
- const propagateUpdate = (firstUrlInfo) => {
198
- const urlInfos = urlGraph.urlInfos
199
- const iterate = (urlInfo, trace) => {
200
- if (urlInfo.data.hotAcceptSelf) {
201
- return {
202
- accepted: true,
203
- reason:
204
- urlInfo === firstUrlInfo
205
- ? `file accepts hot reload`
206
- : `a dependent file accepts hot reload`,
207
- instructions: [
208
- {
209
- type: urlInfo.type,
210
- boundary: urlToRelativeUrl(urlInfo.url, rootDirectoryUrl),
211
- acceptedBy: urlToRelativeUrl(urlInfo.url, rootDirectoryUrl),
212
- },
213
- ],
214
- }
215
- }
216
- const { dependents } = urlInfo
217
- const instructions = []
218
- for (const dependentUrl of dependents) {
219
- const dependentUrlInfo = urlInfos[dependentUrl]
220
- if (dependentUrlInfo.data.hotDecline) {
221
- return {
222
- declined: true,
223
- reason: `a dependent file declines hot reload`,
224
- declinedBy: dependentUrl,
225
- }
226
- }
227
- if (dependentUrlInfo.data.hotAcceptDependencies.includes(urlInfo.url)) {
228
- instructions.push({
229
- type: dependentUrlInfo.type,
230
- boundary: urlToRelativeUrl(dependentUrl, rootDirectoryUrl),
231
- acceptedBy: urlToRelativeUrl(urlInfo.url, rootDirectoryUrl),
232
- })
233
- continue
234
- }
235
- if (trace.includes(dependentUrl)) {
236
- return {
237
- declined: true,
238
- reason: "circular dependency",
239
- declinedBy: urlToRelativeUrl(dependentUrl, rootDirectoryUrl),
240
- }
241
- }
242
- const dependentPropagationResult = iterate(dependentUrlInfo, [
243
- ...trace,
244
- dependentUrl,
245
- ])
246
- if (dependentPropagationResult.accepted) {
247
- instructions.push(...dependentPropagationResult.instructions)
248
- continue
249
- }
250
- if (
251
- // declined explicitely by an other file, it must decline the whole update
252
- dependentPropagationResult.declinedBy
253
- ) {
254
- return dependentPropagationResult
255
- }
256
- // declined by absence of boundary, we can keep searching
257
- continue
258
- }
259
- if (instructions.length === 0) {
260
- return {
261
- declined: true,
262
- reason: `there is no file accepting hot reload while propagating update`,
263
- }
264
- }
265
- return {
266
- accepted: true,
267
- reason: `${instructions.length} dependent file(s) accepts hot reload`,
268
- instructions,
269
- }
270
- }
271
- const trace = []
272
- return iterate(firstUrlInfo, trace)
273
- }
274
- const sseService = createSSEService({
275
- rootDirectoryUrl,
276
- autoreloadPatterns,
277
- onFileChange: ({ relativeUrl, event }) => {
278
- const url = new URL(relativeUrl, rootDirectoryUrl).href
279
- const urlInfo = urlGraph.urlInfos[url]
280
- // file not part of dependency graph
281
- if (!urlInfo) {
282
- return
283
- }
284
- updateHmrTimestamp(urlInfo, Date.now())
285
- const hotUpdate = propagateUpdate(urlInfo)
286
- if (hotUpdate.declined) {
287
- notifyDeclined({
288
- cause: `${relativeUrl} ${event}`,
289
- reason: hotUpdate.reason,
290
- declinedBy: hotUpdate.declinedBy,
291
- })
292
- } else {
293
- notifyAccepted({
294
- cause: `${relativeUrl} ${event}`,
295
- reason: hotUpdate.reason,
296
- instructions: hotUpdate.instructions,
297
- })
298
- }
299
- },
300
- hotUpdateCallbackList,
301
- })
302
- urlGraph.prunedCallbackList.add(({ prunedUrlInfos, firstUrlInfo }) => {
303
- prunedUrlInfos.forEach((prunedUrlInfo) => {
304
- prunedUrlInfo.data.hmrTimestamp = Date.now()
305
- // should we delete instead?
306
- // delete urlGraph.urlInfos[prunedUrlInfo.url]
307
- })
308
- const mainHotUpdate = propagateUpdate(firstUrlInfo)
309
- const cause = `following files are no longer referenced: ${prunedUrlInfos.map(
310
- (prunedUrlInfo) => urlToRelativeUrl(prunedUrlInfo.url, rootDirectoryUrl),
311
- )}`
312
- // now check if we can hot update the main ressource
313
- // then if we can hot update all dependencies
314
- if (mainHotUpdate.declined) {
315
- notifyDeclined({
316
- cause,
317
- reason: mainHotUpdate.reason,
318
- declinedBy: mainHotUpdate.declinedBy,
319
- })
320
- return
321
- }
322
- // main can hot update
323
- let i = 0
324
- const instructions = []
325
- while (i < prunedUrlInfos.length) {
326
- const prunedUrlInfo = prunedUrlInfos[i++]
327
- if (prunedUrlInfo.data.hotDecline) {
328
- notifyDeclined({
329
- cause,
330
- reason: `a pruned file declines hot reload`,
331
- declinedBy: urlToRelativeUrl(prunedUrlInfo.url, rootDirectoryUrl),
332
- })
333
- return
334
- }
335
- instructions.push({
336
- type: "prune",
337
- boundary: urlToRelativeUrl(prunedUrlInfo.url, rootDirectoryUrl),
338
- acceptedBy: urlToRelativeUrl(firstUrlInfo.url, rootDirectoryUrl),
339
- })
340
- }
341
- notifyAccepted({
342
- cause,
343
- reason: mainHotUpdate.reason,
344
- instructions,
345
- })
346
- })
347
-
348
- return {
349
- name: "jsenv:hot_sse",
350
- appliesDuring: { dev: true },
351
- serve: (request, { urlGraph, rootDirectoryUrl }) => {
352
- if (request.ressource === "/__graph__") {
353
- const graphJson = JSON.stringify(urlGraph.toJSON(rootDirectoryUrl))
354
- return {
355
- status: 200,
356
- headers: {
357
- "content-type": "application/json",
358
- "content-length": Buffer.byteLength(graphJson),
359
- },
360
- body: graphJson,
361
- }
362
- }
363
- const { accept } = request.headers
364
- if (accept && accept.includes("text/event-stream")) {
365
- const room = sseService.getOrCreateSSERoom(request)
366
- return room.join(request)
367
- }
368
- return null
369
- },
370
- destroy: () => {
371
- sseService.destroy()
372
- },
373
- }
374
- }
@@ -1,149 +0,0 @@
1
- import { createSSERoom } from "@jsenv/server"
2
- import { registerDirectoryLifecycle } from "@jsenv/filesystem"
3
- import {
4
- createCallbackList,
5
- createCallbackListNotifiedOnce,
6
- } from "@jsenv/abort"
7
-
8
- export const createSSEService = ({
9
- rootDirectoryUrl,
10
- autoreloadPatterns,
11
- onFileChange,
12
- hotUpdateCallbackList,
13
- }) => {
14
- const destroyCallbackList = createCallbackListNotifiedOnce()
15
- const projectFileModified = createCallbackList()
16
- const projectFileRemoved = createCallbackList()
17
- const projectFileAdded = createCallbackList()
18
- const watchProjectFiles = (callback) => {
19
- const removeModifiedCallback = projectFileModified.add((relativeUrl) => {
20
- callback({
21
- event: "modified",
22
- relativeUrl,
23
- })
24
- })
25
- const removeRemovedCallback = projectFileRemoved.add((relativeUrl) => {
26
- callback({
27
- event: "removed",
28
- relativeUrl,
29
- })
30
- })
31
- const removeAddedCallback = projectFileRemoved.add((relativeUrl) => {
32
- callback({
33
- event: "added",
34
- relativeUrl,
35
- })
36
- })
37
- return () => {
38
- removeModifiedCallback()
39
- removeRemovedCallback()
40
- removeAddedCallback()
41
- }
42
- }
43
- // wait 100ms to actually start watching
44
- // otherwise server starting is delayed by the filesystem scan done in
45
- // registerDirectoryLifecycle
46
- const timeout = setTimeout(() => {
47
- const unregisterDirectoryLifecyle = registerDirectoryLifecycle(
48
- rootDirectoryUrl,
49
- {
50
- watchDescription: {
51
- ...autoreloadPatterns,
52
- ".jsenv/": false,
53
- },
54
- updated: ({ relativeUrl }) => {
55
- projectFileModified.notify(relativeUrl)
56
- },
57
- removed: ({ relativeUrl }) => {
58
- projectFileRemoved.notify(relativeUrl)
59
- },
60
- added: ({ relativeUrl }) => {
61
- projectFileAdded.notify(relativeUrl)
62
- },
63
- keepProcessAlive: false,
64
- recursive: true,
65
- },
66
- )
67
- destroyCallbackList.add(unregisterDirectoryLifecyle)
68
- }, 100)
69
- destroyCallbackList.add(() => {
70
- clearTimeout(timeout)
71
- })
72
-
73
- const cache = []
74
- const sseRoomLimit = 100
75
- const getOrCreateSSERoom = (request) => {
76
- const htmlFileRelativeUrl = request.ressource.slice(1)
77
- const cacheEntry = cache.find(
78
- (cacheEntryCandidate) =>
79
- cacheEntryCandidate.htmlFileRelativeUrl === htmlFileRelativeUrl,
80
- )
81
- if (cacheEntry) {
82
- return cacheEntry.sseRoom
83
- }
84
- const sseRoom = createSSERoom({
85
- retryDuration: 2000,
86
- historyLength: 100,
87
- welcomeEventEnabled: true,
88
- effect: () => {
89
- const removeHotUpdateCallback = hotUpdateCallbackList.add(
90
- (hotUpdate) => {
91
- if (hotUpdate.declined) {
92
- sseRoom.sendEvent({
93
- type: "reload",
94
- data: JSON.stringify({
95
- cause: hotUpdate.cause,
96
- type: "full",
97
- typeReason: hotUpdate.reason,
98
- declinedBy: hotUpdate.declinedBy,
99
- }),
100
- })
101
- } else {
102
- sseRoom.sendEvent({
103
- type: "reload",
104
- data: JSON.stringify({
105
- cause: hotUpdate.cause,
106
- type: "hot",
107
- typeReason: hotUpdate.reason,
108
- hotInstructions: hotUpdate.instructions,
109
- }),
110
- })
111
- }
112
- },
113
- )
114
- const stopWatching = watchProjectFiles(({ relativeUrl, event }) => {
115
- onFileChange({ relativeUrl, event })
116
- })
117
- return () => {
118
- removeHotUpdateCallback()
119
- stopWatching()
120
- }
121
- },
122
- })
123
-
124
- const removeSSECleanupCallback = destroyCallbackList.add(() => {
125
- removeSSECleanupCallback()
126
- sseRoom.close()
127
- })
128
- cache.push({
129
- htmlFileRelativeUrl,
130
- sseRoom,
131
- cleanup: () => {
132
- removeSSECleanupCallback()
133
- sseRoom.close()
134
- },
135
- })
136
- if (cache.length >= sseRoomLimit) {
137
- const firstCacheEntry = cache.shift()
138
- firstCacheEntry.cleanup()
139
- }
140
- return sseRoom
141
- }
142
-
143
- return {
144
- getOrCreateSSERoom,
145
- destroy: () => {
146
- destroyCallbackList.notify()
147
- },
148
- }
149
- }