@jsenv/core 27.0.0-alpha.7 → 27.0.0-alpha.72

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 (248) 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 +79 -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 +13455 -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/main.js +9 -1
  106. package/package.json +46 -33
  107. package/readme.md +6 -14
  108. package/src/build/build.js +1080 -562
  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 +211 -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 +170 -38
  119. package/src/execute/execute.js +36 -6
  120. package/src/execute/run.js +21 -57
  121. package/src/execute/runtimes/browsers/from_playwright.js +218 -148
  122. package/src/execute/runtimes/node/controllable_file.mjs +26 -10
  123. package/src/execute/runtimes/node/node_execution_performance.js +67 -0
  124. package/src/execute/runtimes/node/node_process.js +288 -39
  125. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  126. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  127. package/src/omega/errors.js +62 -66
  128. package/src/omega/fetched_content_compliance.js +24 -0
  129. package/src/omega/file_url_converter.js +9 -51
  130. package/src/omega/kitchen.js +593 -463
  131. package/src/omega/omega_server.js +2 -3
  132. package/src/omega/server/file_service.js +86 -38
  133. package/src/omega/server/user_agent.js +4 -2
  134. package/src/omega/url_graph/url_graph_load.js +31 -23
  135. package/src/omega/url_graph/url_graph_report.js +94 -51
  136. package/src/omega/url_graph/url_info_transformations.js +37 -17
  137. package/src/omega/url_graph.js +88 -19
  138. package/src/omega/url_specifier_encoding.js +59 -0
  139. package/src/omega/web_workers.js +42 -0
  140. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  141. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +19 -12
  142. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  143. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  144. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +41 -0
  145. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +204 -0
  146. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +25 -0
  147. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  148. package/src/plugins/bundling/css/bundle_css.js +140 -0
  149. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  150. package/src/plugins/bundling/js_module/bundle_js_module.js +343 -0
  151. package/src/plugins/bundling/jsenv_plugin_bundling.js +54 -0
  152. package/src/plugins/cache_control/jsenv_plugin_cache_control.js +34 -0
  153. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +54 -41
  154. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +198 -0
  155. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  156. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  157. package/src/plugins/html_supervisor/client/html_supervisor_installer.js +254 -0
  158. package/src/plugins/html_supervisor/client/html_supervisor_setup.js +79 -0
  159. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  160. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  161. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +73 -55
  162. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  163. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  164. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  165. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +7 -4
  166. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +100 -0
  167. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +33 -8
  168. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  169. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  170. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +40 -36
  171. package/src/plugins/inject_globals/jsenv_plugin_inject_globals.js +76 -0
  172. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  173. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +20 -19
  174. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +161 -0
  175. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  176. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +8 -11
  177. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +294 -0
  178. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  179. package/src/plugins/minification/css/minify_css.js +9 -0
  180. package/src/plugins/minification/html/minify_html.js +15 -0
  181. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  182. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  183. package/src/plugins/minification/json/minify_json.js +8 -0
  184. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +160 -0
  185. package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
  186. package/src/{omega → plugins}/plugin_controller.js +56 -11
  187. package/src/plugins/plugins.js +92 -0
  188. package/src/plugins/transpilation/as_js_classic/client/s.js +429 -0
  189. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  190. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  191. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +213 -0
  192. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +304 -0
  193. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_workers.js +55 -0
  194. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  195. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  196. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  197. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +14 -17
  198. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  199. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +39 -32
  200. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +30 -6
  201. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  202. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  203. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  204. package/src/plugins/transpilation/babel/require_babel_plugin.js +8 -0
  205. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  206. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +184 -0
  207. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +79 -0
  208. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +46 -0
  209. package/src/plugins/url_analysis/css/css_urls.js +49 -0
  210. package/src/plugins/url_analysis/html/html_urls.js +272 -0
  211. package/src/plugins/url_analysis/js/js_urls.js +68 -0
  212. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +103 -0
  213. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +20 -0
  214. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +9 -5
  215. package/src/plugins/url_version/jsenv_plugin_url_version.js +28 -0
  216. package/src/test/execute_plan.js +82 -44
  217. package/src/test/execute_test_plan.js +38 -24
  218. package/src/test/execution_steps.js +1 -4
  219. package/src/test/logs_file_execution.js +56 -49
  220. package/src/build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js +0 -225
  221. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  222. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  223. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +0 -374
  224. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  225. package/src/execute/runtimes/node/controlled_process.js +0 -316
  226. package/src/omega/core_plugins/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
  227. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  228. package/src/omega/core_plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -58
  229. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_installer.js +0 -168
  230. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
  231. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  232. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  233. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  234. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  235. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  236. package/src/omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js +0 -142
  237. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  238. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  239. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  240. package/src/omega/core_plugins/url_version/jsenv_plugin_url_version.js +0 -50
  241. package/src/omega/core_plugins.js +0 -39
  242. package/src/omega/runtime_support/default_runtime_support.js +0 -13
  243. package/src/omega/url_graph/url_graph_sort.js +0 -29
  244. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  245. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  246. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  247. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  248. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -0,0 +1,198 @@
1
+ import { readFileSync, readdirSync, realpathSync, statSync } from "node:fs"
2
+ import { pathToFileURL } from "node:url"
3
+ import {
4
+ urlIsInsideOf,
5
+ urlToRelativeUrl,
6
+ urlToExtension,
7
+ urlToFilename,
8
+ ensurePathnameTrailingSlash,
9
+ } from "@jsenv/urls"
10
+
11
+ import { applyFileSystemMagicResolution } from "@jsenv/node-esm-resolution"
12
+ import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
13
+
14
+ export const jsenvPluginFileUrls = ({
15
+ magicExtensions = ["inherit", ".js"],
16
+ magicDirectoryIndex = true,
17
+ preservesSymlink = true,
18
+ directoryReferenceAllowed = false,
19
+ }) => {
20
+ const getExtensionsToTry = (magicExtensions, importer) => {
21
+ const extensionsSet = new Set()
22
+ magicExtensions.forEach((magicExtension) => {
23
+ if (magicExtension === "inherit") {
24
+ const importerExtension = urlToExtension(importer)
25
+ extensionsSet.add(importerExtension)
26
+ } else {
27
+ extensionsSet.add(magicExtension)
28
+ }
29
+ })
30
+ return Array.from(extensionsSet.values())
31
+ }
32
+
33
+ return [
34
+ {
35
+ name: "jsenv:file_url_resolution",
36
+ appliesDuring: "*",
37
+ redirectUrl: (reference) => {
38
+ // http, https, data, about, ...
39
+ if (!reference.url.startsWith("file:")) {
40
+ return null
41
+ }
42
+ if (reference.isInline) {
43
+ return null
44
+ }
45
+ const urlObject = new URL(reference.url)
46
+ let stat
47
+ try {
48
+ stat = statSync(urlObject)
49
+ } catch (e) {
50
+ if (e.code === "ENOENT") {
51
+ stat = null
52
+ } else {
53
+ throw e
54
+ }
55
+ }
56
+ const { search, hash } = urlObject
57
+ let { pathname } = urlObject
58
+ const pathnameUsesTrailingSlash = pathname.endsWith("/")
59
+ urlObject.search = ""
60
+ urlObject.hash = ""
61
+ const foundADirectory = stat && stat.isDirectory()
62
+ const foundSomething = stat && !foundADirectory
63
+ // force trailing slash on directories
64
+ if (foundADirectory && !pathnameUsesTrailingSlash) {
65
+ urlObject.pathname = `${pathname}/`
66
+ }
67
+ // otherwise remove trailing slash if any
68
+ if (foundSomething && pathnameUsesTrailingSlash) {
69
+ // a warning here? (because it's strange to reference a file with a trailing slash)
70
+ urlObject.pathname = pathname.slice(0, -1)
71
+ }
72
+ if (foundADirectory && directoryReferenceAllowed) {
73
+ reference.data.foundADirectory = true
74
+ const directoryFacadeUrl = urlObject.href
75
+ const directoryUrlRaw = preservesSymlink
76
+ ? directoryFacadeUrl
77
+ : resolveSymlink(directoryFacadeUrl)
78
+ const directoryUrl = `${directoryUrlRaw}${search}${hash}`
79
+ return directoryUrl
80
+ }
81
+ const url = urlObject.href
82
+ const filesystemResolution = applyFileSystemMagicResolution(url, {
83
+ fileStat: stat,
84
+ magicDirectoryIndex,
85
+ magicExtensions: getExtensionsToTry(
86
+ magicExtensions,
87
+ reference.parentUrl,
88
+ ),
89
+ })
90
+ if (!filesystemResolution.found) {
91
+ reference.data.foundADirectory = foundADirectory
92
+ return null
93
+ }
94
+ reference.data.foundADirectory = filesystemResolution.isDirectory
95
+ const fileFacadeUrl = filesystemResolution.url
96
+ const fileUrlRaw = preservesSymlink
97
+ ? fileFacadeUrl
98
+ : resolveSymlink(fileFacadeUrl)
99
+ const fileUrl = `${fileUrlRaw}${search}${hash}`
100
+ return fileUrl
101
+ },
102
+ },
103
+ {
104
+ name: "jsenv:filesystem_resolution",
105
+ appliesDuring: "*",
106
+ resolveUrl: {
107
+ filesystem: (reference, context) => {
108
+ const { parentUrl } = reference
109
+ const parentUrlInfo = context.urlGraph.getUrlInfo(parentUrl)
110
+ const baseUrl =
111
+ parentUrlInfo && parentUrlInfo.type === "directory"
112
+ ? ensurePathnameTrailingSlash(parentUrl)
113
+ : parentUrl
114
+ return new URL(reference.specifier, baseUrl).href
115
+ },
116
+ },
117
+ },
118
+ {
119
+ name: "jsenv:@fs_resolution",
120
+ appliesDuring: {
121
+ // during dev and test it's a browser running the code
122
+ // so absolute file urls needs to be relativized
123
+ dev: true,
124
+ test: true,
125
+ // during build it's fine to use file:// urls
126
+ build: false,
127
+ },
128
+ resolveUrl: (reference) => {
129
+ if (reference.specifier.startsWith("/@fs/")) {
130
+ const fsRootRelativeUrl = reference.specifier.slice("/@fs/".length)
131
+ return `file:///${fsRootRelativeUrl}`
132
+ }
133
+ return null
134
+ },
135
+ formatUrl: (reference, context) => {
136
+ if (!reference.generatedUrl.startsWith("file:")) {
137
+ return null
138
+ }
139
+ if (urlIsInsideOf(reference.generatedUrl, context.rootDirectoryUrl)) {
140
+ return `/${urlToRelativeUrl(
141
+ reference.generatedUrl,
142
+ context.rootDirectoryUrl,
143
+ )}`
144
+ }
145
+ return `/@fs/${reference.generatedUrl.slice("file:///".length)}`
146
+ },
147
+ },
148
+ {
149
+ name: "jsenv:file_url_fetching",
150
+ appliesDuring: "*",
151
+ fetchUrlContent: (urlInfo, context) => {
152
+ if (!urlInfo.url.startsWith("file:")) {
153
+ return null
154
+ }
155
+ const urlObject = new URL(urlInfo.url)
156
+ if (context.reference.data.foundADirectory) {
157
+ if (directoryReferenceAllowed) {
158
+ const directoryEntries = readdirSync(urlObject)
159
+ let filename
160
+ if (context.reference.type === "filesystem") {
161
+ const parentUrlInfo = context.urlGraph.getUrlInfo(
162
+ context.reference.parentUrl,
163
+ )
164
+ filename = `${parentUrlInfo.filename}${context.reference.specifier}/`
165
+ } else {
166
+ filename = `${urlToFilename(urlInfo.url)}/`
167
+ }
168
+ return {
169
+ type: "directory",
170
+ contentType: "application/json",
171
+ content: JSON.stringify(directoryEntries, null, " "),
172
+ filename,
173
+ }
174
+ }
175
+ const error = new Error("found a directory on filesystem")
176
+ error.code = "DIRECTORY_REFERENCE_NOT_ALLOWED"
177
+ throw error
178
+ }
179
+ const fileBuffer = readFileSync(urlObject)
180
+ const contentType = CONTENT_TYPE.fromUrlExtension(urlInfo.url)
181
+ if (CONTENT_TYPE.isTextual(contentType)) {
182
+ return {
183
+ contentType,
184
+ content: String(fileBuffer),
185
+ }
186
+ }
187
+ return {
188
+ contentType,
189
+ content: fileBuffer,
190
+ }
191
+ },
192
+ },
193
+ ]
194
+ }
195
+
196
+ const resolveSymlink = (fileUrl) => {
197
+ return pathToFileURL(realpathSync(new URL(fileUrl))).href
198
+ }
@@ -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,79 @@
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
+ document.body.removeChild(script)
36
+ window.removeEventListener("error", windowErrorCallback)
37
+ }
38
+ window.addEventListener("error", windowErrorCallback)
39
+ script.addEventListener("error", () => {
40
+ cleanup()
41
+ reject(src)
42
+ })
43
+ script.addEventListener("load", () => {
44
+ cleanup()
45
+ if (lastWindowErrorUrl === scriptUrl) {
46
+ reject(lastWindowError)
47
+ } else {
48
+ resolve()
49
+ }
50
+ })
51
+ document.body.appendChild(script)
52
+ })
53
+ },
54
+ })
55
+ },
56
+ superviseScriptTypeModule: () => {
57
+ throw new Error("htmlSupervisor not installed")
58
+ },
59
+ getScriptExecutionResults: () => {
60
+ // wait for page to load before collecting script execution results
61
+ const htmlReadyPromise = new Promise((resolve) => {
62
+ if (document.readyState === "complete") {
63
+ resolve()
64
+ return
65
+ }
66
+ const loadCallback = () => {
67
+ window.removeEventListener("load", loadCallback)
68
+ resolve()
69
+ }
70
+ window.addEventListener("load", loadCallback)
71
+ })
72
+ return htmlReadyPromise.then(() => {
73
+ return window.__html_supervisor__.collectScriptResults()
74
+ })
75
+ },
76
+ collectScriptResults: () => {
77
+ throw new Error("htmlSupervisor not installed")
78
+ },
79
+ }