@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
@@ -0,0 +1,140 @@
1
+ /*
2
+ * Each @import found in css is replaced by the file content
3
+ * - There is no need to worry about urls (such as background-image: url())
4
+ * because they are absolute (file://*) and will be made relative again by jsenv build
5
+ * - The sourcemap are not generated but ideally they should be
6
+ * It can be quite challenging, see "bundle_sourcemap.js"
7
+ */
8
+
9
+ import { applyPostCss } from "@jsenv/utils/css_ast/apply_post_css.js"
10
+ import { postCssPluginUrlVisitor } from "@jsenv/utils/css_ast/postcss_plugin_url_visitor.js"
11
+ import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
12
+ import { sortByDependencies } from "@jsenv/utils/graph/sort_by_dependencies.js"
13
+
14
+ // Do not use until https://github.com/parcel-bundler/parcel-css/issues/181
15
+ export const bundleCss = async ({ cssUrlInfos, context }) => {
16
+ const bundledCssUrlInfos = {}
17
+ const cssBundleInfos = await performCssBundling({
18
+ cssEntryUrlInfos: cssUrlInfos,
19
+ context,
20
+ })
21
+ cssUrlInfos.forEach((cssUrlInfo) => {
22
+ bundledCssUrlInfos[cssUrlInfo.url] = {
23
+ data: {
24
+ generatedBy: "parcel",
25
+ },
26
+ contentType: "text/css",
27
+ content: cssBundleInfos[cssUrlInfo.url].bundleContent,
28
+ }
29
+ })
30
+ return bundledCssUrlInfos
31
+ }
32
+
33
+ const performCssBundling = async ({ cssEntryUrlInfos, context }) => {
34
+ const cssBundleInfos = await loadCssUrls({
35
+ cssEntryUrlInfos,
36
+ context,
37
+ })
38
+ const cssUrlsSorted = sortByDependencies(cssBundleInfos)
39
+ cssUrlsSorted.forEach((cssUrl) => {
40
+ const cssBundleInfo = cssBundleInfos[cssUrl]
41
+ const magicSource = createMagicSource(cssBundleInfo.content)
42
+ cssBundleInfo.cssUrls.forEach((cssUrl) => {
43
+ if (cssUrl.type === "@import") {
44
+ magicSource.replace({
45
+ start: cssUrl.atRuleStart,
46
+ end: cssUrl.atRuleEnd,
47
+ replacement: cssBundleInfos[cssUrl.url].bundleContent,
48
+ })
49
+ }
50
+ })
51
+ const { content } = magicSource.toContentAndSourcemap()
52
+ cssBundleInfo.bundleContent = content.trim()
53
+ })
54
+ return cssBundleInfos
55
+ }
56
+
57
+ const parseCssUrls = async ({ css, url }) => {
58
+ const cssUrls = []
59
+ await applyPostCss({
60
+ sourcemaps: false,
61
+ plugins: [
62
+ postCssPluginUrlVisitor({
63
+ urlVisitor: ({
64
+ type,
65
+ specifier,
66
+ specifierStart,
67
+ specifierEnd,
68
+ atRuleStart,
69
+ atRuleEnd,
70
+ }) => {
71
+ cssUrls.push({
72
+ type,
73
+ url: new URL(specifier, url).href,
74
+ specifierStart,
75
+ specifierEnd,
76
+ atRuleStart,
77
+ atRuleEnd,
78
+ })
79
+ },
80
+ }),
81
+ ],
82
+ url,
83
+ content: css,
84
+ })
85
+
86
+ return cssUrls
87
+ }
88
+
89
+ const loadCssUrls = async ({ cssEntryUrlInfos, context }) => {
90
+ const cssBundleInfos = {}
91
+ const promises = []
92
+ const promiseMap = new Map()
93
+
94
+ const load = (cssUrlInfo) => {
95
+ const promiseFromData = promiseMap.get(cssUrlInfo.url)
96
+ if (promiseFromData) return promiseFromData
97
+ const promise = _load(cssUrlInfo)
98
+ promises.push(promise)
99
+ promiseMap.set(cssUrlInfo.url, promise)
100
+ return promise
101
+ }
102
+
103
+ const _load = async (cssUrlInfo) => {
104
+ const cssUrls = await parseCssUrls({
105
+ css: cssUrlInfo.content,
106
+ url: cssUrlInfo.url,
107
+ })
108
+ const cssBundleInfo = {
109
+ content: cssUrlInfo.content,
110
+ cssUrls,
111
+ dependencies: [],
112
+ }
113
+ cssBundleInfos[cssUrlInfo.url] = cssBundleInfo
114
+ cssUrls.forEach((cssUrl) => {
115
+ if (cssUrl.type === "@import") {
116
+ cssBundleInfo.dependencies.push(cssUrl.url)
117
+ const importedCssUrlInfo = context.urlGraph.getUrlInfo(cssUrl.url)
118
+ load(importedCssUrlInfo)
119
+ }
120
+ })
121
+ }
122
+
123
+ cssEntryUrlInfos.forEach((cssEntryUrlInfo) => {
124
+ load(cssEntryUrlInfo)
125
+ })
126
+
127
+ const waitAll = async () => {
128
+ if (promises.length === 0) {
129
+ return
130
+ }
131
+ const promisesToWait = promises.slice()
132
+ promises.length = 0
133
+ await Promise.all(promisesToWait)
134
+ await waitAll()
135
+ }
136
+ await waitAll()
137
+ promiseMap.clear()
138
+
139
+ return cssBundleInfos
140
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ * TODO:
3
+ * for each js_classic where subtype is a worker
4
+ * take the url info and find importScripts calls
5
+ * and replace them with the corresponding url info file content
6
+ * we'll ikely need to save the importScripts node location to be able to do that
7
+ */
8
+
9
+ // import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
10
+
11
+ export const bundleJsClassicWorkers = () => {
12
+ return {}
13
+ }
@@ -0,0 +1,343 @@
1
+ import { pathToFileURL } from "node:url"
2
+
3
+ import { URL_META } from "@jsenv/url-meta"
4
+ import { isFileSystemPath } from "@jsenv/urls"
5
+ import { createDetailedMessage } from "@jsenv/log"
6
+ import { babelHelperNameFromUrl } from "@jsenv/babel-plugins"
7
+ import { applyRollupPlugins } from "@jsenv/utils/js_ast/apply_rollup_plugins.js"
8
+ import { sourcemapConverter } from "@jsenv/utils/sourcemap/sourcemap_converter.js"
9
+ import { fileUrlConverter } from "@jsenv/core/src/omega/file_url_converter.js"
10
+
11
+ const globalThisClientFileUrl = new URL(
12
+ "../../transpilation/babel/global_this/client/global_this.js",
13
+ import.meta.url,
14
+ ).href
15
+ const newStylesheetClientFileUrl = new URL(
16
+ "../../transpilation/babel/new_stylesheet/client/new_stylesheet.js",
17
+ import.meta.url,
18
+ ).href
19
+ const regeneratorRuntimeClientFileUrl = new URL(
20
+ "../../transpilation/babel/regenerator_runtime/client/regenerator_runtime.js",
21
+ import.meta.url,
22
+ ).href
23
+
24
+ export const bundleJsModule = async ({
25
+ jsModuleUrlInfos,
26
+ context,
27
+ options,
28
+ }) => {
29
+ const {
30
+ signal,
31
+ logger,
32
+ rootDirectoryUrl,
33
+ buildDirectoryUrl,
34
+ urlGraph,
35
+ runtimeCompat,
36
+ sourcemaps,
37
+ } = context
38
+ const { babelHelpersChunk = true, include } = options
39
+ const { jsModuleBundleUrlInfos } = await buildWithRollup({
40
+ signal,
41
+ logger,
42
+ rootDirectoryUrl,
43
+ buildDirectoryUrl,
44
+ urlGraph,
45
+ jsModuleUrlInfos,
46
+
47
+ runtimeCompat,
48
+ sourcemaps,
49
+
50
+ include,
51
+ babelHelpersChunk,
52
+ })
53
+ return jsModuleBundleUrlInfos
54
+ }
55
+
56
+ export const buildWithRollup = async ({
57
+ signal,
58
+ logger,
59
+ rootDirectoryUrl,
60
+ buildDirectoryUrl,
61
+ urlGraph,
62
+ jsModuleUrlInfos,
63
+
64
+ runtimeCompat,
65
+ sourcemaps,
66
+
67
+ include,
68
+ babelHelpersChunk,
69
+ }) => {
70
+ const resultRef = { current: null }
71
+ try {
72
+ await applyRollupPlugins({
73
+ rollupPlugins: [
74
+ rollupPluginJsenv({
75
+ signal,
76
+ logger,
77
+ rootDirectoryUrl,
78
+ buildDirectoryUrl,
79
+ urlGraph,
80
+ jsModuleUrlInfos,
81
+
82
+ runtimeCompat,
83
+ sourcemaps,
84
+ include,
85
+ babelHelpersChunk,
86
+ resultRef,
87
+ }),
88
+ ],
89
+ inputOptions: {
90
+ input: [],
91
+ onwarn: (warning) => {
92
+ if (warning.code === "CIRCULAR_DEPENDENCY") {
93
+ return
94
+ }
95
+ if (
96
+ warning.code === "THIS_IS_UNDEFINED" &&
97
+ pathToFileURL(warning.id).href === globalThisClientFileUrl
98
+ ) {
99
+ return
100
+ }
101
+ if (warning.code === "EVAL") {
102
+ // ideally we should disable only for jsenv files
103
+ return
104
+ }
105
+ logger.warn(String(warning))
106
+ },
107
+ },
108
+ })
109
+ return resultRef.current
110
+ } catch (e) {
111
+ if (e.code === "MISSING_EXPORT") {
112
+ const detailedMessage = createDetailedMessage(e.message, {
113
+ frame: e.frame,
114
+ })
115
+ throw new Error(detailedMessage, { cause: e })
116
+ }
117
+ throw e
118
+ }
119
+ }
120
+
121
+ const rollupPluginJsenv = ({
122
+ // logger,
123
+ rootDirectoryUrl,
124
+ buildDirectoryUrl,
125
+ urlGraph,
126
+ jsModuleUrlInfos,
127
+ sourcemaps,
128
+
129
+ include,
130
+ babelHelpersChunk,
131
+
132
+ resultRef,
133
+ }) => {
134
+ let _rollupEmitFile = () => {
135
+ throw new Error("not implemented")
136
+ }
137
+ const emitChunk = (chunk) => {
138
+ return _rollupEmitFile({
139
+ type: "chunk",
140
+ ...chunk,
141
+ })
142
+ }
143
+ let importCanBeBundled = () => true
144
+ if (include) {
145
+ const associations = URL_META.resolveAssociations(
146
+ { bundle: include },
147
+ rootDirectoryUrl,
148
+ )
149
+ importCanBeBundled = (url) => {
150
+ return URL_META.applyAssociations({ url, associations }).bundle
151
+ }
152
+ }
153
+ const urlImporters = {}
154
+
155
+ return {
156
+ name: "jsenv",
157
+ async buildStart() {
158
+ _rollupEmitFile = (...args) => this.emitFile(...args)
159
+ let previousNonEntryPointModuleId
160
+ jsModuleUrlInfos.forEach((jsModuleUrlInfo) => {
161
+ const id = jsModuleUrlInfo.url
162
+ if (jsModuleUrlInfo.data.isEntryPoint) {
163
+ emitChunk({
164
+ id,
165
+ })
166
+ return
167
+ }
168
+ emitChunk({
169
+ id,
170
+ implicitlyLoadedAfterOneOf: previousNonEntryPointModuleId
171
+ ? [previousNonEntryPointModuleId]
172
+ : null,
173
+ // preserveSignature: "allow-extension",
174
+ })
175
+ previousNonEntryPointModuleId = id
176
+ })
177
+ },
178
+ async generateBundle(outputOptions, rollupResult) {
179
+ _rollupEmitFile = (...args) => this.emitFile(...args)
180
+
181
+ const jsModuleBundleUrlInfos = {}
182
+ Object.keys(rollupResult).forEach((fileName) => {
183
+ const rollupFileInfo = rollupResult[fileName]
184
+ // there is 3 types of file: "placeholder", "asset", "chunk"
185
+ if (rollupFileInfo.type === "chunk") {
186
+ const jsModuleBundleUrlInfo = {
187
+ data: {
188
+ generatedBy: "rollup",
189
+ bundleRelativeUrl: rollupFileInfo.fileName,
190
+ usesImport:
191
+ rollupFileInfo.imports.length > 0 ||
192
+ rollupFileInfo.dynamicImports.length > 0,
193
+ usesExport: rollupFileInfo.exports.length > 0,
194
+ },
195
+ contentType: "text/javascript",
196
+ content: rollupFileInfo.code,
197
+ sourcemap: rollupFileInfo.map,
198
+ }
199
+ let url
200
+ if (rollupFileInfo.facadeModuleId) {
201
+ url = fileUrlConverter.asFileUrl(rollupFileInfo.facadeModuleId)
202
+ } else {
203
+ url = new URL(rollupFileInfo.fileName, buildDirectoryUrl).href
204
+ }
205
+ jsModuleBundleUrlInfos[url] = jsModuleBundleUrlInfo
206
+ }
207
+ })
208
+ resultRef.current = {
209
+ jsModuleBundleUrlInfos,
210
+ }
211
+ },
212
+ outputOptions: (outputOptions) => {
213
+ // const sourcemapFile = buildDirectoryUrl
214
+ Object.assign(outputOptions, {
215
+ format: "esm",
216
+ dir: fileUrlConverter.asFilePath(buildDirectoryUrl),
217
+ sourcemap: sourcemaps === "file" || sourcemaps === "inline",
218
+ // sourcemapFile,
219
+ sourcemapPathTransform: (relativePath) => {
220
+ return new URL(relativePath, buildDirectoryUrl).href
221
+ },
222
+ entryFileNames: () => {
223
+ return `[name].js`
224
+ },
225
+ chunkFileNames: (chunkInfo) => {
226
+ const insideJs = willBeInsideJsDirectory({
227
+ chunkInfo,
228
+ fileUrlConverter,
229
+ jsModuleUrlInfos,
230
+ })
231
+ let nameFromUrlInfo
232
+ if (chunkInfo.facadeModuleId) {
233
+ const url = fileUrlConverter.asFileUrl(chunkInfo.facadeModuleId)
234
+ const urlInfo = jsModuleUrlInfos.find(
235
+ (jsModuleUrlInfo) => jsModuleUrlInfo.url === url,
236
+ )
237
+ if (urlInfo) {
238
+ nameFromUrlInfo = urlInfo.filename
239
+ }
240
+ }
241
+ const name = nameFromUrlInfo || `${chunkInfo.name}.js`
242
+ return insideJs ? `js/${name}` : `${name}`
243
+ },
244
+ manualChunks: (id) => {
245
+ if (babelHelpersChunk) {
246
+ const fileUrl = fileUrlConverter.asFileUrl(id)
247
+ if (
248
+ fileUrl.endsWith(
249
+ "babel-plugin-transform-async-to-promises/helpers.mjs",
250
+ )
251
+ ) {
252
+ return "babel_helpers"
253
+ }
254
+ if (babelHelperNameFromUrl(fileUrl)) {
255
+ return "babel_helpers"
256
+ }
257
+ if (fileUrl === globalThisClientFileUrl) {
258
+ return "babel_helpers"
259
+ }
260
+ if (fileUrl === newStylesheetClientFileUrl) {
261
+ return "babel_helpers"
262
+ }
263
+ if (fileUrl === regeneratorRuntimeClientFileUrl) {
264
+ return "babel_helpers"
265
+ }
266
+ }
267
+ return null
268
+ },
269
+ // https://rollupjs.org/guide/en/#outputpaths
270
+ // paths: (id) => {
271
+ // return id
272
+ // },
273
+ })
274
+ },
275
+ resolveId: (specifier, importer = rootDirectoryUrl) => {
276
+ if (isFileSystemPath(importer)) {
277
+ importer = fileUrlConverter.asFileUrl(importer)
278
+ }
279
+ const url = new URL(specifier, importer).href
280
+ const existingImporter = urlImporters[url]
281
+ if (!existingImporter) {
282
+ urlImporters[url] = importer
283
+ }
284
+ if (!url.startsWith("file:")) {
285
+ return { id: url, external: true }
286
+ }
287
+ if (!importCanBeBundled(url)) {
288
+ return { id: url, external: true }
289
+ }
290
+ const urlInfo = urlGraph.getUrlInfo(url)
291
+ if (!urlInfo) {
292
+ // happen when excluded by urlAnalysis.include
293
+ return { id: url, external: true }
294
+ }
295
+ if (!urlInfo.shouldHandle) {
296
+ return { id: url, external: true }
297
+ }
298
+ const filePath = fileUrlConverter.asFilePath(url)
299
+ return filePath
300
+ },
301
+ async load(rollupId) {
302
+ const fileUrl = fileUrlConverter.asFileUrl(rollupId)
303
+ const urlInfo = urlGraph.getUrlInfo(fileUrl)
304
+ return {
305
+ code: urlInfo.content,
306
+ map: urlInfo.sourcemap
307
+ ? sourcemapConverter.toFilePaths(urlInfo.sourcemap)
308
+ : null,
309
+ }
310
+ },
311
+ }
312
+ }
313
+
314
+ const willBeInsideJsDirectory = ({
315
+ chunkInfo,
316
+ fileUrlConverter,
317
+ jsModuleUrlInfos,
318
+ }) => {
319
+ // if the chunk is generated dynamically by rollup
320
+ // for an entry point jsenv will put that file inside js/ directory
321
+ // if it's generated dynamically for a file already in js/ directory
322
+ // both will be inside the js/ directory
323
+ if (!chunkInfo.facadeModuleId) {
324
+ // generated by rollup
325
+ return true
326
+ }
327
+ const url = fileUrlConverter.asFileUrl(chunkInfo.facadeModuleId)
328
+ const jsModuleUrlInfo = jsModuleUrlInfos.find(
329
+ (jsModuleUrlInfo) => jsModuleUrlInfo.url === url,
330
+ )
331
+ if (!jsModuleUrlInfo) {
332
+ // generated by rollup
333
+ return true
334
+ }
335
+ if (
336
+ !jsModuleUrlInfo.data.isEntryPoint &&
337
+ !jsModuleUrlInfo.data.isWebWorkerEntryPoint
338
+ ) {
339
+ // not an entry point, jsenv will put it inside js/ directory
340
+ return true
341
+ }
342
+ return false
343
+ }
@@ -0,0 +1,54 @@
1
+ import { bundleCss } from "./css/bundle_css.js"
2
+ import { bundleJsClassicWorkers } from "./js_classic_workers/bundle_js_classic_workers.js"
3
+ import { bundleJsModule } from "./js_module/bundle_js_module.js"
4
+
5
+ export const jsenvPluginBundling = (bundling) => {
6
+ if (typeof bundling === "boolean") {
7
+ bundling = {
8
+ css: bundling,
9
+ js_classic_workers: bundling,
10
+ js_module: bundling,
11
+ }
12
+ } else if (typeof bundling !== "object") {
13
+ throw new Error(`bundling must be a boolean or an object, got ${bundling}`)
14
+ }
15
+ Object.keys(bundling).forEach((key) => {
16
+ if (bundling[key] === true) bundling[key] = {}
17
+ })
18
+
19
+ return {
20
+ name: "jsenv:bundling",
21
+ appliesDuring: {
22
+ build: true,
23
+ },
24
+ bundle: {
25
+ css: bundling.css
26
+ ? (cssUrlInfos, context) => {
27
+ return bundleCss({
28
+ cssUrlInfos,
29
+ context,
30
+ options: bundling.css,
31
+ })
32
+ }
33
+ : undefined,
34
+ js_classic: bundling.js_classic
35
+ ? (jsClassicUrlInfos, context) => {
36
+ return bundleJsClassicWorkers({
37
+ jsClassicUrlInfos,
38
+ context,
39
+ options: bundling.js_classic_workers,
40
+ })
41
+ }
42
+ : undefined,
43
+ js_module: bundling.js_module
44
+ ? (jsModuleUrlInfos, context) => {
45
+ return bundleJsModule({
46
+ jsModuleUrlInfos,
47
+ context,
48
+ options: bundling.js_module,
49
+ })
50
+ }
51
+ : undefined,
52
+ },
53
+ }
54
+ }
@@ -0,0 +1,34 @@
1
+ export const jsenvPluginCacheControl = () => {
2
+ return {
3
+ name: "jsenv:cache_control",
4
+ appliesDuring: {
5
+ dev: true,
6
+ test: true,
7
+ },
8
+ augmentResponse: ({ reference }, context) => {
9
+ if (context.scenario === "test") {
10
+ // During dev, all files are put into browser cache for 1 hour because:
11
+ // 1: Browser cache is a temporary directory created by playwright
12
+ // 2: We assume source files won't be modified while tests are running
13
+ return {
14
+ headers: {
15
+ "cache-control": `private,max-age=3600,immutable`,
16
+ },
17
+ }
18
+ }
19
+ if (
20
+ reference.searchParams.has("v") &&
21
+ !reference.searchParams.has("hmr")
22
+ ) {
23
+ return {
24
+ headers: {
25
+ "cache-control": `private,max-age=${SECONDS_IN_30_DAYS},immutable`,
26
+ },
27
+ }
28
+ }
29
+ return null
30
+ },
31
+ }
32
+ }
33
+
34
+ const SECONDS_IN_30_DAYS = 60 * 60 * 24 * 30
@@ -11,50 +11,63 @@ import { applyBabelPlugins } from "@jsenv/utils/js_ast/apply_babel_plugins.js"
11
11
  import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
12
12
 
13
13
  export const jsenvPluginCommonJsGlobals = () => {
14
+ const transformCommonJsGlobals = async (urlInfo, { scenario }) => {
15
+ if (
16
+ !urlInfo.content.includes("process.env.NODE_ENV") &&
17
+ !urlInfo.content.includes("__filename") &&
18
+ !urlInfo.content.includes("__dirname")
19
+ ) {
20
+ return null
21
+ }
22
+ const isJsModule = urlInfo.type === "js_module"
23
+ const replaceMap = {
24
+ "process.env.NODE_ENV": `("${
25
+ scenario === "dev" || scenario === "test" ? "development" : "production"
26
+ }")`,
27
+ "global": "globalThis",
28
+ "__filename": isJsModule
29
+ ? `import.meta.url.slice('file:///'.length)`
30
+ : `document.currentScript.src`,
31
+ "__dirname": isJsModule
32
+ ? `import.meta.url.slice('file:///'.length).replace(/[\\\/\\\\][^\\\/\\\\]*$/, '')`
33
+ : `new URL('./', document.currentScript.src).href`,
34
+ }
35
+ const { metadata } = await applyBabelPlugins({
36
+ babelPlugins: [
37
+ [
38
+ babelPluginMetadataExpressionPaths,
39
+ {
40
+ replaceMap,
41
+ allowConflictingReplacements: true,
42
+ },
43
+ ],
44
+ ],
45
+ urlInfo,
46
+ })
47
+ const { expressionPaths } = metadata
48
+ const keys = Object.keys(expressionPaths)
49
+ if (keys.length === 0) {
50
+ return null
51
+ }
52
+ const magicSource = createMagicSource(urlInfo.content)
53
+ keys.forEach((key) => {
54
+ expressionPaths[key].forEach((path) => {
55
+ magicSource.replace({
56
+ start: path.node.start,
57
+ end: path.node.end,
58
+ replacement: replaceMap[key],
59
+ })
60
+ })
61
+ })
62
+ return magicSource.toContentAndSourcemap()
63
+ }
64
+
14
65
  return {
15
66
  name: "jsenv:commonjs_globals",
16
67
  appliesDuring: "*",
17
- transform: {
18
- js_module: async ({ url, generatedUrl, content }, { scenario }) => {
19
- const replaceMap = {
20
- "process.env.NODE_ENV": `("${
21
- scenario === "dev" || scenario === "test" ? "dev" : "prod"
22
- }")`,
23
- "global": "globalThis",
24
- "__filename": `import.meta.url.slice('file:///'.length)`,
25
- "__dirname": `import.meta.url.slice('file:///'.length).replace(/[\\\/\\\\][^\\\/\\\\]*$/, '')`,
26
- }
27
- const { metadata } = await applyBabelPlugins({
28
- babelPlugins: [
29
- [
30
- babelPluginMetadataExpressionPaths,
31
- {
32
- replaceMap,
33
- allowConflictingReplacements: true,
34
- },
35
- ],
36
- ],
37
- url,
38
- generatedUrl,
39
- content,
40
- })
41
- const { expressionPaths } = metadata
42
- const keys = Object.keys(expressionPaths)
43
- if (keys.length === 0) {
44
- return null
45
- }
46
- const magicSource = createMagicSource(content)
47
- keys.forEach((key) => {
48
- expressionPaths[key].forEach((path) => {
49
- magicSource.replace({
50
- start: path.node.start,
51
- end: path.node.end,
52
- replacement: replaceMap[key],
53
- })
54
- })
55
- })
56
- return magicSource.toContentAndSourcemap()
57
- },
68
+ transformUrlContent: {
69
+ js_classic: transformCommonJsGlobals,
70
+ js_module: transformCommonJsGlobals,
58
71
  },
59
72
  }
60
73
  }