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

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 (247) 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 +13452 -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 +44 -32
  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 +8 -12
  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 +342 -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 +19 -18
  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 +7 -10
  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 +12 -16
  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/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  205. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +184 -0
  206. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +80 -0
  207. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +46 -0
  208. package/src/plugins/url_analysis/css/css_urls.js +49 -0
  209. package/src/plugins/url_analysis/html/html_urls.js +272 -0
  210. package/src/plugins/url_analysis/js/js_urls.js +68 -0
  211. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +102 -0
  212. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +20 -0
  213. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +9 -5
  214. package/src/plugins/url_version/jsenv_plugin_url_version.js +28 -0
  215. package/src/test/execute_plan.js +81 -44
  216. package/src/test/execute_test_plan.js +37 -24
  217. package/src/test/execution_steps.js +1 -4
  218. package/src/test/logs_file_execution.js +56 -49
  219. package/src/build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js +0 -225
  220. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  221. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  222. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +0 -374
  223. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  224. package/src/execute/runtimes/node/controlled_process.js +0 -316
  225. package/src/omega/core_plugins/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
  226. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  227. package/src/omega/core_plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -58
  228. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_installer.js +0 -168
  229. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
  230. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  231. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  232. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  233. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  234. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  235. package/src/omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js +0 -142
  236. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  237. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  238. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  239. package/src/omega/core_plugins/url_version/jsenv_plugin_url_version.js +0 -50
  240. package/src/omega/core_plugins.js +0 -39
  241. package/src/omega/runtime_support/default_runtime_support.js +0 -13
  242. package/src/omega/url_graph/url_graph_sort.js +0 -29
  243. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  244. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  245. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  246. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  247. 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,342 @@
1
+ import { pathToFileURL } from "node:url"
2
+ import { isFileSystemPath, URL_META } from "@jsenv/urls"
3
+ import { createDetailedMessage } from "@jsenv/logger"
4
+
5
+ import { babelHelperNameFromUrl } from "@jsenv/babel-plugins"
6
+ import { applyRollupPlugins } from "@jsenv/utils/js_ast/apply_rollup_plugins.js"
7
+ import { sourcemapConverter } from "@jsenv/utils/sourcemap/sourcemap_converter.js"
8
+ import { fileUrlConverter } from "@jsenv/core/src/omega/file_url_converter.js"
9
+
10
+ const globalThisClientFileUrl = new URL(
11
+ "../../transpilation/babel/global_this/client/global_this.js",
12
+ import.meta.url,
13
+ ).href
14
+ const newStylesheetClientFileUrl = new URL(
15
+ "../../transpilation/babel/new_stylesheet/client/new_stylesheet.js",
16
+ import.meta.url,
17
+ ).href
18
+ const regeneratorRuntimeClientFileUrl = new URL(
19
+ "../../transpilation/babel/regenerator_runtime/client/regenerator_runtime.js",
20
+ import.meta.url,
21
+ ).href
22
+
23
+ export const bundleJsModule = async ({
24
+ jsModuleUrlInfos,
25
+ context,
26
+ options,
27
+ }) => {
28
+ const {
29
+ signal,
30
+ logger,
31
+ rootDirectoryUrl,
32
+ buildDirectoryUrl,
33
+ urlGraph,
34
+ runtimeCompat,
35
+ sourcemaps,
36
+ } = context
37
+ const { babelHelpersChunk = true, include } = options
38
+ const { jsModuleBundleUrlInfos } = await buildWithRollup({
39
+ signal,
40
+ logger,
41
+ rootDirectoryUrl,
42
+ buildDirectoryUrl,
43
+ urlGraph,
44
+ jsModuleUrlInfos,
45
+
46
+ runtimeCompat,
47
+ sourcemaps,
48
+
49
+ include,
50
+ babelHelpersChunk,
51
+ })
52
+ return jsModuleBundleUrlInfos
53
+ }
54
+
55
+ export const buildWithRollup = async ({
56
+ signal,
57
+ logger,
58
+ rootDirectoryUrl,
59
+ buildDirectoryUrl,
60
+ urlGraph,
61
+ jsModuleUrlInfos,
62
+
63
+ runtimeCompat,
64
+ sourcemaps,
65
+
66
+ include,
67
+ babelHelpersChunk,
68
+ }) => {
69
+ const resultRef = { current: null }
70
+ try {
71
+ await applyRollupPlugins({
72
+ rollupPlugins: [
73
+ rollupPluginJsenv({
74
+ signal,
75
+ logger,
76
+ rootDirectoryUrl,
77
+ buildDirectoryUrl,
78
+ urlGraph,
79
+ jsModuleUrlInfos,
80
+
81
+ runtimeCompat,
82
+ sourcemaps,
83
+ include,
84
+ babelHelpersChunk,
85
+ resultRef,
86
+ }),
87
+ ],
88
+ inputOptions: {
89
+ input: [],
90
+ onwarn: (warning) => {
91
+ if (warning.code === "CIRCULAR_DEPENDENCY") {
92
+ return
93
+ }
94
+ if (
95
+ warning.code === "THIS_IS_UNDEFINED" &&
96
+ pathToFileURL(warning.id).href === globalThisClientFileUrl
97
+ ) {
98
+ return
99
+ }
100
+ if (warning.code === "EVAL") {
101
+ // ideally we should disable only for jsenv files
102
+ return
103
+ }
104
+ logger.warn(String(warning))
105
+ },
106
+ },
107
+ })
108
+ return resultRef.current
109
+ } catch (e) {
110
+ if (e.code === "MISSING_EXPORT") {
111
+ const detailedMessage = createDetailedMessage(e.message, {
112
+ frame: e.frame,
113
+ })
114
+ throw new Error(detailedMessage, { cause: e })
115
+ }
116
+ throw e
117
+ }
118
+ }
119
+
120
+ const rollupPluginJsenv = ({
121
+ // logger,
122
+ rootDirectoryUrl,
123
+ buildDirectoryUrl,
124
+ urlGraph,
125
+ jsModuleUrlInfos,
126
+ sourcemaps,
127
+
128
+ include,
129
+ babelHelpersChunk,
130
+
131
+ resultRef,
132
+ }) => {
133
+ let _rollupEmitFile = () => {
134
+ throw new Error("not implemented")
135
+ }
136
+ const emitChunk = (chunk) => {
137
+ return _rollupEmitFile({
138
+ type: "chunk",
139
+ ...chunk,
140
+ })
141
+ }
142
+ let importCanBeBundled = () => true
143
+ if (include) {
144
+ const associations = URL_META.resolveAssociations(
145
+ { bundle: include },
146
+ rootDirectoryUrl,
147
+ )
148
+ importCanBeBundled = (url) => {
149
+ return URL_META.applyAssociations({ url, associations }).bundle
150
+ }
151
+ }
152
+ const urlImporters = {}
153
+
154
+ return {
155
+ name: "jsenv",
156
+ async buildStart() {
157
+ _rollupEmitFile = (...args) => this.emitFile(...args)
158
+ let previousNonEntryPointModuleId
159
+ jsModuleUrlInfos.forEach((jsModuleUrlInfo) => {
160
+ const id = jsModuleUrlInfo.url
161
+ if (jsModuleUrlInfo.data.isEntryPoint) {
162
+ emitChunk({
163
+ id,
164
+ })
165
+ return
166
+ }
167
+ emitChunk({
168
+ id,
169
+ implicitlyLoadedAfterOneOf: previousNonEntryPointModuleId
170
+ ? [previousNonEntryPointModuleId]
171
+ : null,
172
+ // preserveSignature: "allow-extension",
173
+ })
174
+ previousNonEntryPointModuleId = id
175
+ })
176
+ },
177
+ async generateBundle(outputOptions, rollupResult) {
178
+ _rollupEmitFile = (...args) => this.emitFile(...args)
179
+
180
+ const jsModuleBundleUrlInfos = {}
181
+ Object.keys(rollupResult).forEach((fileName) => {
182
+ const rollupFileInfo = rollupResult[fileName]
183
+ // there is 3 types of file: "placeholder", "asset", "chunk"
184
+ if (rollupFileInfo.type === "chunk") {
185
+ const jsModuleBundleUrlInfo = {
186
+ data: {
187
+ generatedBy: "rollup",
188
+ bundleRelativeUrl: rollupFileInfo.fileName,
189
+ usesImport:
190
+ rollupFileInfo.imports.length > 0 ||
191
+ rollupFileInfo.dynamicImports.length > 0,
192
+ usesExport: rollupFileInfo.exports.length > 0,
193
+ },
194
+ contentType: "text/javascript",
195
+ content: rollupFileInfo.code,
196
+ sourcemap: rollupFileInfo.map,
197
+ }
198
+ let url
199
+ if (rollupFileInfo.facadeModuleId) {
200
+ url = fileUrlConverter.asFileUrl(rollupFileInfo.facadeModuleId)
201
+ } else {
202
+ url = new URL(rollupFileInfo.fileName, buildDirectoryUrl).href
203
+ }
204
+ jsModuleBundleUrlInfos[url] = jsModuleBundleUrlInfo
205
+ }
206
+ })
207
+ resultRef.current = {
208
+ jsModuleBundleUrlInfos,
209
+ }
210
+ },
211
+ outputOptions: (outputOptions) => {
212
+ // const sourcemapFile = buildDirectoryUrl
213
+ Object.assign(outputOptions, {
214
+ format: "esm",
215
+ dir: fileUrlConverter.asFilePath(buildDirectoryUrl),
216
+ sourcemap: sourcemaps === "file" || sourcemaps === "inline",
217
+ // sourcemapFile,
218
+ sourcemapPathTransform: (relativePath) => {
219
+ return new URL(relativePath, buildDirectoryUrl).href
220
+ },
221
+ entryFileNames: () => {
222
+ return `[name].js`
223
+ },
224
+ chunkFileNames: (chunkInfo) => {
225
+ const insideJs = willBeInsideJsDirectory({
226
+ chunkInfo,
227
+ fileUrlConverter,
228
+ jsModuleUrlInfos,
229
+ })
230
+ let nameFromUrlInfo
231
+ if (chunkInfo.facadeModuleId) {
232
+ const url = fileUrlConverter.asFileUrl(chunkInfo.facadeModuleId)
233
+ const urlInfo = jsModuleUrlInfos.find(
234
+ (jsModuleUrlInfo) => jsModuleUrlInfo.url === url,
235
+ )
236
+ if (urlInfo) {
237
+ nameFromUrlInfo = urlInfo.filename
238
+ }
239
+ }
240
+ const name = nameFromUrlInfo || `${chunkInfo.name}.js`
241
+ return insideJs ? `js/${name}` : `${name}`
242
+ },
243
+ manualChunks: (id) => {
244
+ if (babelHelpersChunk) {
245
+ const fileUrl = fileUrlConverter.asFileUrl(id)
246
+ if (
247
+ fileUrl.endsWith(
248
+ "babel-plugin-transform-async-to-promises/helpers.mjs",
249
+ )
250
+ ) {
251
+ return "babel_helpers"
252
+ }
253
+ if (babelHelperNameFromUrl(fileUrl)) {
254
+ return "babel_helpers"
255
+ }
256
+ if (fileUrl === globalThisClientFileUrl) {
257
+ return "babel_helpers"
258
+ }
259
+ if (fileUrl === newStylesheetClientFileUrl) {
260
+ return "babel_helpers"
261
+ }
262
+ if (fileUrl === regeneratorRuntimeClientFileUrl) {
263
+ return "babel_helpers"
264
+ }
265
+ }
266
+ return null
267
+ },
268
+ // https://rollupjs.org/guide/en/#outputpaths
269
+ // paths: (id) => {
270
+ // return id
271
+ // },
272
+ })
273
+ },
274
+ resolveId: (specifier, importer = rootDirectoryUrl) => {
275
+ if (isFileSystemPath(importer)) {
276
+ importer = fileUrlConverter.asFileUrl(importer)
277
+ }
278
+ const url = new URL(specifier, importer).href
279
+ const existingImporter = urlImporters[url]
280
+ if (!existingImporter) {
281
+ urlImporters[url] = importer
282
+ }
283
+ if (!url.startsWith("file:")) {
284
+ return { id: url, external: true }
285
+ }
286
+ if (!importCanBeBundled(url)) {
287
+ return { id: url, external: true }
288
+ }
289
+ const urlInfo = urlGraph.getUrlInfo(url)
290
+ if (!urlInfo) {
291
+ // happen when excluded by urlAnalysis.include
292
+ return { id: url, external: true }
293
+ }
294
+ if (!urlInfo.shouldHandle) {
295
+ return { id: url, external: true }
296
+ }
297
+ const filePath = fileUrlConverter.asFilePath(url)
298
+ return filePath
299
+ },
300
+ async load(rollupId) {
301
+ const fileUrl = fileUrlConverter.asFileUrl(rollupId)
302
+ const urlInfo = urlGraph.getUrlInfo(fileUrl)
303
+ return {
304
+ code: urlInfo.content,
305
+ map: urlInfo.sourcemap
306
+ ? sourcemapConverter.toFilePaths(urlInfo.sourcemap)
307
+ : null,
308
+ }
309
+ },
310
+ }
311
+ }
312
+
313
+ const willBeInsideJsDirectory = ({
314
+ chunkInfo,
315
+ fileUrlConverter,
316
+ jsModuleUrlInfos,
317
+ }) => {
318
+ // if the chunk is generated dynamically by rollup
319
+ // for an entry point jsenv will put that file inside js/ directory
320
+ // if it's generated dynamically for a file already in js/ directory
321
+ // both will be inside the js/ directory
322
+ if (!chunkInfo.facadeModuleId) {
323
+ // generated by rollup
324
+ return true
325
+ }
326
+ const url = fileUrlConverter.asFileUrl(chunkInfo.facadeModuleId)
327
+ const jsModuleUrlInfo = jsModuleUrlInfos.find(
328
+ (jsModuleUrlInfo) => jsModuleUrlInfo.url === url,
329
+ )
330
+ if (!jsModuleUrlInfo) {
331
+ // generated by rollup
332
+ return true
333
+ }
334
+ if (
335
+ !jsModuleUrlInfo.data.isEntryPoint &&
336
+ !jsModuleUrlInfo.data.isWebWorkerEntryPoint
337
+ ) {
338
+ // not an entry point, jsenv will put it inside js/ directory
339
+ return true
340
+ }
341
+ return false
342
+ }
@@ -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
  }