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

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 (254) 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/applyDecs/applyDecs.js +756 -0
  5. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +9 -0
  6. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +4 -0
  7. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +5 -0
  8. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +8 -0
  9. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +52 -0
  10. package/dist/babel_helpers/asyncIterator/asyncIterator.js +78 -0
  11. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +39 -0
  12. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +4 -0
  13. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +24 -0
  14. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +7 -0
  15. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +14 -0
  16. package/dist/babel_helpers/classCallCheck/classCallCheck.js +5 -0
  17. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -0
  18. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -0
  19. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +8 -0
  20. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +4 -0
  21. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -0
  22. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -0
  23. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +7 -0
  24. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -0
  25. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -0
  26. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +7 -0
  27. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +3 -0
  28. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -0
  29. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +9 -0
  30. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -0
  31. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -0
  32. package/dist/babel_helpers/construct/construct.js +15 -0
  33. package/dist/babel_helpers/createClass/createClass.js +18 -0
  34. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +63 -0
  35. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +22 -0
  36. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +50 -0
  37. package/dist/babel_helpers/createSuper/createSuper.js +22 -0
  38. package/dist/babel_helpers/decorate/decorate.js +622 -0
  39. package/dist/babel_helpers/defaults/defaults.js +14 -0
  40. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +26 -0
  41. package/dist/babel_helpers/defineProperty/defineProperty.js +19 -0
  42. package/dist/babel_helpers/extends/extends.js +16 -0
  43. package/dist/babel_helpers/get/get.js +21 -0
  44. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +2 -0
  45. package/dist/babel_helpers/identity/identity.js +3 -0
  46. package/dist/babel_helpers/inherits/inherits.js +21 -0
  47. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -0
  48. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +10 -0
  49. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +3 -0
  50. package/dist/babel_helpers/instanceof/instanceof.js +7 -0
  51. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +5 -0
  52. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +49 -0
  53. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +4 -0
  54. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -0
  55. package/dist/babel_helpers/iterableToArray/iterableToArray.js +3 -0
  56. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +38 -0
  57. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +13 -0
  58. package/dist/babel_helpers/jsx/jsx.js +49 -0
  59. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +10 -0
  60. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +5 -0
  61. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +3 -0
  62. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +3 -0
  63. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -0
  64. package/dist/babel_helpers/objectSpread/objectSpread.js +22 -0
  65. package/dist/babel_helpers/objectSpread2/objectSpread2.js +41 -0
  66. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +20 -0
  67. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +15 -0
  68. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +10 -0
  69. package/dist/babel_helpers/readOnlyError/readOnlyError.js +4 -0
  70. package/dist/babel_helpers/set/set.js +51 -0
  71. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +5 -0
  72. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -0
  73. package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -0
  74. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +7 -0
  75. package/dist/babel_helpers/superPropBase/superPropBase.js +10 -0
  76. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +11 -0
  77. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +8 -0
  78. package/dist/babel_helpers/tdz/tdz.js +4 -0
  79. package/dist/babel_helpers/temporalRef/temporalRef.js +5 -0
  80. package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +3 -0
  81. package/dist/babel_helpers/toArray/toArray.js +5 -0
  82. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -0
  83. package/dist/babel_helpers/toPrimitive/toPrimitive.js +14 -0
  84. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -0
  85. package/dist/babel_helpers/typeof/typeof.js +7 -0
  86. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -0
  87. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +7 -0
  88. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +35 -0
  89. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +67 -0
  90. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +4 -0
  91. package/dist/html/explorer.html +557 -0
  92. package/dist/js/controllable_file.mjs +227 -0
  93. package/dist/js/event_source_client.js +324 -0
  94. package/dist/js/global_this.js +32 -0
  95. package/dist/js/html_supervisor_installer.js +522 -0
  96. package/dist/js/html_supervisor_setup.js +82 -0
  97. package/dist/js/import_meta_hot.js +84 -0
  98. package/dist/js/inline_content.js +8 -0
  99. package/dist/js/new_stylesheet.js +409 -0
  100. package/dist/js/regenerator_runtime.js +721 -0
  101. package/dist/js/s.js +429 -0
  102. package/dist/main.js +13422 -0
  103. package/dist/other/jsenv.png +0 -0
  104. package/dist/s.js +626 -0
  105. package/dist/s.js.map +204 -0
  106. package/package.json +57 -51
  107. package/readme.md +6 -14
  108. package/src/build/build.js +1074 -563
  109. package/src/build/build_urls_generator.js +65 -24
  110. package/src/build/graph_utils.js +31 -0
  111. package/src/build/{inject_version_mappings.js → inject_global_version_mappings.js} +49 -18
  112. package/src/build/inject_service_worker_urls.js +79 -0
  113. package/src/build/resync_ressource_hints.js +115 -0
  114. package/src/build/start_build_server.js +210 -0
  115. package/src/dev/plugins/explorer/client/explorer.html +1 -1
  116. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +9 -13
  117. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  118. package/src/dev/start_dev_server.js +165 -38
  119. package/src/execute/execute.js +35 -8
  120. package/src/execute/run.js +21 -57
  121. package/src/execute/runtimes/browsers/from_playwright.js +220 -150
  122. package/src/execute/runtimes/node/child_exec_options.js +1 -1
  123. package/src/execute/runtimes/node/controllable_file.mjs +26 -10
  124. package/src/execute/runtimes/node/kill_process_tree.js +2 -4
  125. package/src/execute/runtimes/node/node_execution_performance.js +67 -0
  126. package/src/execute/runtimes/node/node_process.js +288 -39
  127. package/src/main.js +27 -0
  128. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  129. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  130. package/src/omega/errors.js +63 -67
  131. package/src/omega/fetched_content_compliance.js +24 -0
  132. package/src/omega/file_url_converter.js +9 -51
  133. package/src/omega/kitchen.js +605 -467
  134. package/src/omega/omega_server.js +2 -3
  135. package/src/omega/server/file_service.js +88 -41
  136. package/src/omega/server/user_agent.js +5 -6
  137. package/src/omega/url_graph/url_graph_load.js +31 -23
  138. package/src/omega/url_graph/url_graph_report.js +94 -51
  139. package/src/omega/url_graph/url_info_transformations.js +37 -17
  140. package/src/omega/url_graph.js +88 -19
  141. package/src/omega/url_specifier_encoding.js +59 -0
  142. package/src/omega/web_workers.js +42 -0
  143. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  144. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +19 -12
  145. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  146. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  147. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +41 -0
  148. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +204 -0
  149. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +25 -0
  150. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  151. package/src/plugins/bundling/css/bundle_css.js +140 -0
  152. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  153. package/src/plugins/bundling/js_module/bundle_js_module.js +343 -0
  154. package/src/plugins/bundling/jsenv_plugin_bundling.js +54 -0
  155. package/src/plugins/cache_control/jsenv_plugin_cache_control.js +34 -0
  156. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +54 -41
  157. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +183 -0
  158. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  159. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  160. package/src/plugins/html_supervisor/client/html_supervisor_installer.js +254 -0
  161. package/src/plugins/html_supervisor/client/html_supervisor_setup.js +82 -0
  162. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  163. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  164. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +73 -55
  165. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  166. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  167. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  168. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +7 -4
  169. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +100 -0
  170. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +33 -8
  171. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  172. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  173. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +40 -36
  174. package/src/plugins/inject_globals/inject_globals.js +57 -0
  175. package/src/plugins/inject_globals/jsenv_plugin_inject_globals.js +24 -0
  176. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  177. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +22 -21
  178. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +161 -0
  179. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  180. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +8 -11
  181. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +294 -0
  182. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  183. package/src/plugins/minification/css/minify_css.js +9 -0
  184. package/src/plugins/minification/html/minify_html.js +13 -0
  185. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  186. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  187. package/src/plugins/minification/json/minify_json.js +8 -0
  188. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +162 -0
  189. package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
  190. package/src/{omega → plugins}/plugin_controller.js +57 -12
  191. package/src/plugins/plugins.js +89 -0
  192. package/src/plugins/transpilation/as_js_classic/client/s.js +429 -0
  193. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  194. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  195. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +211 -0
  196. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +304 -0
  197. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_workers.js +55 -0
  198. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  199. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  200. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  201. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +14 -17
  202. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  203. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +39 -32
  204. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +30 -6
  205. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  206. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  207. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  208. package/src/plugins/transpilation/babel/require_babel_plugin.js +8 -0
  209. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  210. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +184 -0
  211. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +79 -0
  212. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +46 -0
  213. package/src/plugins/url_analysis/css/css_urls.js +49 -0
  214. package/src/plugins/url_analysis/html/html_urls.js +272 -0
  215. package/src/plugins/url_analysis/js/js_urls.js +68 -0
  216. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +103 -0
  217. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +20 -0
  218. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +9 -5
  219. package/src/plugins/url_version/jsenv_plugin_url_version.js +28 -0
  220. package/src/require_from_jsenv.js +3 -0
  221. package/src/test/execute_plan.js +85 -44
  222. package/src/test/execute_test_plan.js +37 -25
  223. package/src/test/execution_steps.js +2 -5
  224. package/src/test/logs_file_execution.js +56 -49
  225. package/main.js +0 -19
  226. package/src/build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js +0 -227
  227. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  228. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  229. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +0 -374
  230. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  231. package/src/execute/runtimes/node/controlled_process.js +0 -316
  232. package/src/omega/core_plugins/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
  233. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  234. package/src/omega/core_plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -58
  235. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_installer.js +0 -168
  236. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
  237. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  238. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  239. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  240. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  241. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  242. package/src/omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js +0 -142
  243. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  244. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  245. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  246. package/src/omega/core_plugins/url_version/jsenv_plugin_url_version.js +0 -50
  247. package/src/omega/core_plugins.js +0 -39
  248. package/src/omega/runtime_support/default_runtime_support.js +0 -13
  249. package/src/omega/url_graph/url_graph_sort.js +0 -29
  250. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  251. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  252. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  253. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  254. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -0,0 +1,183 @@
1
+ import { readFileSync, readdirSync, realpathSync, statSync } from "node:fs"
2
+ import { pathToFileURL } from "node:url"
3
+ import {
4
+ urlIsInsideOf,
5
+ urlToRelativeUrl,
6
+ urlToFilename,
7
+ ensurePathnameTrailingSlash,
8
+ } from "@jsenv/urls"
9
+
10
+ import {
11
+ applyFileSystemMagicResolution,
12
+ getExtensionsToTry,
13
+ } from "@jsenv/node-esm-resolution"
14
+ import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
15
+
16
+ export const jsenvPluginFileUrls = ({
17
+ magicExtensions = ["inherit", ".js"],
18
+ magicDirectoryIndex = true,
19
+ preservesSymlink = true,
20
+ directoryReferenceAllowed = false,
21
+ }) => {
22
+ return [
23
+ {
24
+ name: "jsenv:file_url_resolution",
25
+ appliesDuring: "*",
26
+ redirectUrl: (reference) => {
27
+ // http, https, data, about, ...
28
+ if (!reference.url.startsWith("file:")) {
29
+ return null
30
+ }
31
+ if (reference.isInline) {
32
+ return null
33
+ }
34
+ const urlObject = new URL(reference.url)
35
+ let stat
36
+ try {
37
+ stat = statSync(urlObject)
38
+ } catch (e) {
39
+ if (e.code === "ENOENT") {
40
+ stat = null
41
+ } else {
42
+ throw e
43
+ }
44
+ }
45
+ const { search, hash } = urlObject
46
+ let { pathname } = urlObject
47
+ const pathnameUsesTrailingSlash = pathname.endsWith("/")
48
+ urlObject.search = ""
49
+ urlObject.hash = ""
50
+ const foundADirectory = stat && stat.isDirectory()
51
+ const foundSomething = stat && !foundADirectory
52
+ // force trailing slash on directories
53
+ if (foundADirectory && !pathnameUsesTrailingSlash) {
54
+ urlObject.pathname = `${pathname}/`
55
+ }
56
+ // otherwise remove trailing slash if any
57
+ if (foundSomething && pathnameUsesTrailingSlash) {
58
+ // a warning here? (because it's strange to reference a file with a trailing slash)
59
+ urlObject.pathname = pathname.slice(0, -1)
60
+ }
61
+ if (foundADirectory && directoryReferenceAllowed) {
62
+ reference.data.foundADirectory = true
63
+ const directoryFacadeUrl = urlObject.href
64
+ const directoryUrlRaw = preservesSymlink
65
+ ? directoryFacadeUrl
66
+ : resolveSymlink(directoryFacadeUrl)
67
+ const directoryUrl = `${directoryUrlRaw}${search}${hash}`
68
+ return directoryUrl
69
+ }
70
+ const url = urlObject.href
71
+ const filesystemResolution = applyFileSystemMagicResolution(url, {
72
+ fileStat: stat,
73
+ magicDirectoryIndex,
74
+ magicExtensions: getExtensionsToTry(
75
+ magicExtensions,
76
+ reference.parentUrl,
77
+ ),
78
+ })
79
+ if (!filesystemResolution.found) {
80
+ reference.data.foundADirectory = foundADirectory
81
+ return null
82
+ }
83
+ reference.data.foundADirectory = filesystemResolution.isDirectory
84
+ const fileFacadeUrl = filesystemResolution.url
85
+ const fileUrlRaw = preservesSymlink
86
+ ? fileFacadeUrl
87
+ : resolveSymlink(fileFacadeUrl)
88
+ const fileUrl = `${fileUrlRaw}${search}${hash}`
89
+ return fileUrl
90
+ },
91
+ },
92
+ {
93
+ name: "jsenv:filesystem_resolution",
94
+ appliesDuring: "*",
95
+ resolveUrl: {
96
+ filesystem: (reference, context) => {
97
+ const { parentUrl } = reference
98
+ const parentUrlInfo = context.urlGraph.getUrlInfo(parentUrl)
99
+ const baseUrl =
100
+ parentUrlInfo && parentUrlInfo.type === "directory"
101
+ ? ensurePathnameTrailingSlash(parentUrl)
102
+ : parentUrl
103
+ return new URL(reference.specifier, baseUrl).href
104
+ },
105
+ },
106
+ },
107
+ {
108
+ name: "jsenv:@fs_resolution",
109
+ appliesDuring: {
110
+ // during dev and test it's a browser running the code
111
+ // so absolute file urls needs to be relativized
112
+ dev: true,
113
+ test: true,
114
+ // during build it's fine to use file:// urls
115
+ build: false,
116
+ },
117
+ resolveUrl: (reference) => {
118
+ if (reference.specifier.startsWith("/@fs/")) {
119
+ const fsRootRelativeUrl = reference.specifier.slice("/@fs/".length)
120
+ return `file:///${fsRootRelativeUrl}`
121
+ }
122
+ return null
123
+ },
124
+ formatUrl: (reference, context) => {
125
+ if (!reference.generatedUrl.startsWith("file:")) {
126
+ return null
127
+ }
128
+ if (urlIsInsideOf(reference.generatedUrl, context.rootDirectoryUrl)) {
129
+ return `/${urlToRelativeUrl(
130
+ reference.generatedUrl,
131
+ context.rootDirectoryUrl,
132
+ )}`
133
+ }
134
+ return `/@fs/${reference.generatedUrl.slice("file:///".length)}`
135
+ },
136
+ },
137
+ {
138
+ name: "jsenv:file_url_fetching",
139
+ appliesDuring: "*",
140
+ fetchUrlContent: (urlInfo, context) => {
141
+ if (!urlInfo.url.startsWith("file:")) {
142
+ return null
143
+ }
144
+ const urlObject = new URL(urlInfo.url)
145
+ if (context.reference.data.foundADirectory) {
146
+ if (directoryReferenceAllowed) {
147
+ const directoryEntries = readdirSync(urlObject)
148
+ let filename
149
+ if (context.reference.type === "filesystem") {
150
+ const parentUrlInfo = context.urlGraph.getUrlInfo(
151
+ context.reference.parentUrl,
152
+ )
153
+ filename = `${parentUrlInfo.filename}${context.reference.specifier}/`
154
+ } else {
155
+ filename = `${urlToFilename(urlInfo.url)}/`
156
+ }
157
+ return {
158
+ type: "directory",
159
+ contentType: "application/json",
160
+ content: JSON.stringify(directoryEntries, null, " "),
161
+ filename,
162
+ }
163
+ }
164
+ const error = new Error("found a directory on filesystem")
165
+ error.code = "DIRECTORY_REFERENCE_NOT_ALLOWED"
166
+ throw error
167
+ }
168
+ const fileBuffer = readFileSync(urlObject)
169
+ const contentType = CONTENT_TYPE.fromUrlExtension(urlInfo.url)
170
+ return {
171
+ content: CONTENT_TYPE.isTextual(contentType)
172
+ ? String(fileBuffer)
173
+ : fileBuffer,
174
+ contentType,
175
+ }
176
+ },
177
+ },
178
+ ]
179
+ }
180
+
181
+ const resolveSymlink = (fileUrl) => {
182
+ return pathToFileURL(realpathSync(new URL(fileUrl))).href
183
+ }
@@ -0,0 +1,254 @@
1
+ import { unevalException } from "./uneval_exception.js"
2
+ import { displayErrorInDocument } from "./error_in_document.js"
3
+ import { displayErrorNotification } from "./error_in_notification.js"
4
+
5
+ const { __html_supervisor__ } = window
6
+
7
+ export const installHtmlSupervisor = ({ logs, measurePerf }) => {
8
+ const errorTransformer = null // could implement error stack remapping if needed
9
+ const scriptExecutionResults = {}
10
+ let collectCalled = false
11
+ let pendingExecutionCount = 0
12
+ let resolveScriptExecutionsPromise
13
+ const scriptExecutionsPromise = new Promise((resolve) => {
14
+ resolveScriptExecutionsPromise = resolve
15
+ })
16
+ const onExecutionStart = (name) => {
17
+ scriptExecutionResults[name] = null // ensure execution order is reflected into the object
18
+ pendingExecutionCount++
19
+ if (measurePerf) {
20
+ performance.mark(`execution_start`)
21
+ }
22
+ }
23
+ const onExecutionSettled = (name, executionResult) => {
24
+ if (measurePerf) {
25
+ performance.measure(`execution`, `execution_start`)
26
+ }
27
+ scriptExecutionResults[name] = executionResult
28
+ pendingExecutionCount--
29
+ if (pendingExecutionCount === 0 && collectCalled) {
30
+ resolveScriptExecutionsPromise()
31
+ }
32
+ }
33
+ const onExecutionError = (
34
+ executionResult,
35
+ {
36
+ currentScript,
37
+ errorExposureInNotification = false,
38
+ errorExposureInDocument = true,
39
+ },
40
+ ) => {
41
+ const error = executionResult.error
42
+ if (error && error.code === "NETWORK_FAILURE") {
43
+ if (currentScript) {
44
+ const errorEvent = new Event("error")
45
+ currentScript.dispatchEvent(errorEvent)
46
+ }
47
+ } else if (typeof error === "object") {
48
+ const globalErrorEvent = new Event("error")
49
+ globalErrorEvent.filename = error.filename
50
+ globalErrorEvent.lineno = error.line || error.lineno
51
+ globalErrorEvent.colno = error.column || error.columnno
52
+ globalErrorEvent.message = error.message
53
+ window.dispatchEvent(globalErrorEvent)
54
+ }
55
+ if (errorExposureInNotification) {
56
+ displayErrorNotification(error)
57
+ }
58
+ if (errorExposureInDocument) {
59
+ displayErrorInDocument(error)
60
+ }
61
+ executionResult.exceptionSource = unevalException(error)
62
+ delete executionResult.error
63
+ }
64
+ const getNavigationStartTime = () => {
65
+ try {
66
+ return window.performance.timing.navigationStart
67
+ } catch (e) {
68
+ return Date.now()
69
+ }
70
+ }
71
+
72
+ const performExecution = async ({
73
+ src,
74
+ type,
75
+ currentScript,
76
+ execute,
77
+ // https://developer.mozilla.org/en-US/docs/web/html/element/script
78
+ }) => {
79
+ if (logs) {
80
+ console.group(`[jsenv] loading ${type} ${src}`)
81
+ }
82
+ onExecutionStart(src)
83
+ let completed
84
+ let result
85
+ let error
86
+ try {
87
+ result = await execute()
88
+ completed = true
89
+ } catch (e) {
90
+ completed = false
91
+ error = e
92
+ }
93
+ if (completed) {
94
+ const executionResult = {
95
+ status: "completed",
96
+ namespace: result,
97
+ coverage: window.__coverage__,
98
+ }
99
+ onExecutionSettled(src, executionResult)
100
+ if (logs) {
101
+ console.log(`${type} load ended`)
102
+ console.groupEnd()
103
+ }
104
+ return
105
+ }
106
+ const executionResult = {
107
+ status: "errored",
108
+ coverage: window.__coverage__,
109
+ }
110
+ let errorExposureInConsole = true
111
+ if (error.name === "SyntaxError") {
112
+ // errorExposureInConsole = false
113
+ }
114
+ if (errorTransformer) {
115
+ try {
116
+ error = await errorTransformer(error)
117
+ } catch (e) {}
118
+ }
119
+ executionResult.error = error
120
+ onExecutionSettled(src, executionResult)
121
+ onExecutionError(executionResult, {
122
+ currentScript,
123
+ })
124
+ if (errorExposureInConsole) {
125
+ if (typeof window.reportError === "function") {
126
+ window.reportError(error)
127
+ } else {
128
+ console.error(error)
129
+ }
130
+ }
131
+ if (logs) {
132
+ console.groupEnd()
133
+ }
134
+ }
135
+
136
+ const classicExecutionQueue = createExecutionQueue(performExecution)
137
+ const deferedExecutionQueue = createExecutionQueue(performExecution)
138
+ deferedExecutionQueue.waitFor(
139
+ new Promise((resolve) => {
140
+ if (
141
+ document.readyState === "interactive" ||
142
+ document.readyState === "complete"
143
+ ) {
144
+ resolve()
145
+ } else {
146
+ document.addEventListener("readystatechange", () => {
147
+ if (document.readyState === "interactive") {
148
+ resolve()
149
+ }
150
+ })
151
+ }
152
+ }),
153
+ )
154
+ __html_supervisor__.addScriptToExecute = async (scriptToExecute) => {
155
+ if (scriptToExecute.async) {
156
+ performExecution(scriptToExecute)
157
+ return
158
+ }
159
+ const useDeferQueue =
160
+ scriptToExecute.defer || scriptToExecute.type === "js_module"
161
+ if (useDeferQueue) {
162
+ // defer must wait for classic script to be done
163
+ const classicExecutionPromise = classicExecutionQueue.getPromise()
164
+ if (classicExecutionPromise) {
165
+ deferedExecutionQueue.waitFor(classicExecutionPromise)
166
+ }
167
+ deferedExecutionQueue.executeAsap(scriptToExecute)
168
+ } else {
169
+ classicExecutionQueue.executeAsap(scriptToExecute)
170
+ }
171
+ }
172
+
173
+ __html_supervisor__.collectScriptResults = async () => {
174
+ collectCalled = true
175
+ if (pendingExecutionCount === 0) {
176
+ resolveScriptExecutionsPromise()
177
+ } else {
178
+ await scriptExecutionsPromise
179
+ }
180
+
181
+ let status = "completed"
182
+ let exceptionSource = ""
183
+ Object.keys(scriptExecutionResults).forEach((key) => {
184
+ const scriptExecutionResult = scriptExecutionResults[key]
185
+ if (scriptExecutionResult.status === "errored") {
186
+ status = "errored"
187
+ exceptionSource = scriptExecutionResult.exceptionSource
188
+ }
189
+ })
190
+ return {
191
+ status,
192
+ ...(status === "errored" ? { exceptionSource } : {}),
193
+ startTime: getNavigationStartTime(),
194
+ endTime: Date.now(),
195
+ scriptExecutionResults,
196
+ }
197
+ }
198
+
199
+ const { scriptsToExecute } = __html_supervisor__
200
+ const copy = scriptsToExecute.slice()
201
+ scriptsToExecute.length = 0
202
+ copy.forEach((scriptToExecute) => {
203
+ __html_supervisor__.addScriptToExecute(scriptToExecute)
204
+ })
205
+ }
206
+
207
+ export const superviseScriptTypeModule = ({ src, isInline }) => {
208
+ __html_supervisor__.addScriptToExecute({
209
+ src,
210
+ type: "js_module",
211
+ isInline,
212
+ execute: () => import(new URL(src, document.location.href).href),
213
+ })
214
+ }
215
+
216
+ const createExecutionQueue = (execute) => {
217
+ const scripts = []
218
+
219
+ let promiseToWait = null
220
+ const waitFor = async (promise) => {
221
+ promiseToWait = promise
222
+ promiseToWait.then(
223
+ () => {
224
+ promiseToWait = null
225
+ dequeue()
226
+ },
227
+ () => {
228
+ promiseToWait = null
229
+ dequeue()
230
+ },
231
+ )
232
+ }
233
+
234
+ const executeAsap = async (script) => {
235
+ if (promiseToWait) {
236
+ scripts.push(script)
237
+ return
238
+ }
239
+ waitFor(execute(script))
240
+ }
241
+
242
+ const dequeue = () => {
243
+ const scriptWaiting = scripts.shift()
244
+ if (scriptWaiting) {
245
+ __html_supervisor__.addScriptToExecute(scriptWaiting)
246
+ }
247
+ }
248
+
249
+ return {
250
+ waitFor,
251
+ executeAsap,
252
+ getPromise: () => promiseToWait,
253
+ }
254
+ }
@@ -0,0 +1,82 @@
1
+ window.__html_supervisor__ = {
2
+ // "html_supervisor_installer.js" will implement
3
+ // - "addScriptToExecute"
4
+ // - "superviseScriptTypeModule"
5
+ // - "collectScriptResults"
6
+ // and take all executions in "scriptsToExecute" and implement their supervision
7
+ scriptsToExecute: [],
8
+ addScriptToExecute: (scriptToExecute) => {
9
+ window.__html_supervisor__.scriptsToExecute.push(scriptToExecute)
10
+ },
11
+ superviseScript: ({ src, isInline, crossorigin, integrity }) => {
12
+ window.__html_supervisor__.addScriptToExecute({
13
+ src,
14
+ type: "js_classic",
15
+ isInline,
16
+ currentScript: document.currentScript,
17
+ execute: () => {
18
+ return new Promise((resolve, reject) => {
19
+ const script = document.createElement("script")
20
+ if (crossorigin) {
21
+ script.crossorigin = crossorigin
22
+ }
23
+ if (integrity) {
24
+ script.integrity = integrity
25
+ }
26
+ script.src = src
27
+ const scriptUrl = new URL(src, window.location).href
28
+ let lastWindowErrorUrl
29
+ let lastWindowError
30
+ const windowErrorCallback = (e) => {
31
+ lastWindowErrorUrl = e.filename
32
+ lastWindowError = e.error
33
+ }
34
+ const cleanup = () => {
35
+ // the execution of the script itself can remove script from the page
36
+ if (script.parentNode) {
37
+ script.parentNode.removeChild(script)
38
+ }
39
+ window.removeEventListener("error", windowErrorCallback)
40
+ }
41
+ window.addEventListener("error", windowErrorCallback)
42
+ script.addEventListener("error", () => {
43
+ cleanup()
44
+ reject(src)
45
+ })
46
+ script.addEventListener("load", () => {
47
+ cleanup()
48
+ if (lastWindowErrorUrl === scriptUrl) {
49
+ reject(lastWindowError)
50
+ } else {
51
+ resolve()
52
+ }
53
+ })
54
+ document.body.appendChild(script)
55
+ })
56
+ },
57
+ })
58
+ },
59
+ superviseScriptTypeModule: () => {
60
+ throw new Error("htmlSupervisor not installed")
61
+ },
62
+ getScriptExecutionResults: () => {
63
+ // wait for page to load before collecting script execution results
64
+ const htmlReadyPromise = new Promise((resolve) => {
65
+ if (document.readyState === "complete") {
66
+ resolve()
67
+ return
68
+ }
69
+ const loadCallback = () => {
70
+ window.removeEventListener("load", loadCallback)
71
+ resolve()
72
+ }
73
+ window.addEventListener("load", loadCallback)
74
+ })
75
+ return htmlReadyPromise.then(() => {
76
+ return window.__html_supervisor__.collectScriptResults()
77
+ })
78
+ },
79
+ collectScriptResults: () => {
80
+ throw new Error("htmlSupervisor not installed")
81
+ },
82
+ }