@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,294 @@
1
+ import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
2
+ import { createMagicSource } from "@jsenv/utils/sourcemap/magic_source.js"
3
+ import { JS_QUOTES } from "@jsenv/utils/string/js_quotes.js"
4
+ import { applyBabelPlugins } from "@jsenv/utils/js_ast/apply_babel_plugins.js"
5
+ import { generateInlineContentUrl } from "@jsenv/urls"
6
+
7
+ export const jsenvPluginJsInlineContent = ({ allowEscapeForVersioning }) => {
8
+ const parseAndTransformInlineContentCalls = async (urlInfo, context) => {
9
+ const inlineContentInfos = await parseJsInlineContentInfos({
10
+ js: urlInfo.content,
11
+ url: urlInfo.originalUrl,
12
+ isJsModule: urlInfo.type === "js_module",
13
+ })
14
+ if (inlineContentInfos.length === 0) {
15
+ return null
16
+ }
17
+ const magicSource = createMagicSource(urlInfo.content)
18
+ await inlineContentInfos.reduce(async (previous, inlineContentInfo) => {
19
+ await previous
20
+ const inlineUrl = generateInlineContentUrl({
21
+ url: urlInfo.url,
22
+ extension: CONTENT_TYPE.asFileExtension(inlineContentInfo.contentType),
23
+ line: inlineContentInfo.line,
24
+ column: inlineContentInfo.column,
25
+ lineEnd: inlineContentInfo.lineEnd,
26
+ columnEnd: inlineContentInfo.columnEnd,
27
+ })
28
+ let { quote } = inlineContentInfo
29
+ if (
30
+ quote === "`" &&
31
+ !context.isSupportedOnCurrentClients("template_literals")
32
+ ) {
33
+ // if quote is "`" and template literals are not supported
34
+ // we'll use a regular string (single or double quote)
35
+ // when rendering the string
36
+ quote = JS_QUOTES.pickBest(inlineContentInfo.content)
37
+ }
38
+ const [inlineReference, inlineUrlInfo] =
39
+ context.referenceUtils.foundInline({
40
+ type: "js_inline_content",
41
+ subtype: inlineContentInfo.type, // "new_blob_first_arg", "new_inline_content_first_arg", "json_parse_first_arg"
42
+ isOriginalPosition: urlInfo.content === urlInfo.originalContent,
43
+ specifierLine: inlineContentInfo.line,
44
+ specifierColumn: inlineContentInfo.column,
45
+ specifier: inlineUrl,
46
+ contentType: inlineContentInfo.contentType,
47
+ content: inlineContentInfo.content,
48
+ })
49
+ inlineUrlInfo.jsQuote = quote
50
+ inlineReference.escape = (value) =>
51
+ JS_QUOTES.escapeSpecialChars(value.slice(1, -1), { quote })
52
+ await context.cook(inlineUrlInfo, { reference: inlineReference })
53
+ magicSource.replace({
54
+ start: inlineContentInfo.start,
55
+ end: inlineContentInfo.end,
56
+ replacement: JS_QUOTES.escapeSpecialChars(inlineUrlInfo.content, {
57
+ quote,
58
+ allowEscapeForVersioning,
59
+ }),
60
+ })
61
+ }, Promise.resolve())
62
+ return magicSource.toContentAndSourcemap()
63
+ }
64
+
65
+ return {
66
+ name: "jsenv:js_inline_content",
67
+ appliesDuring: "*",
68
+ transformUrlContent: {
69
+ js_classic: parseAndTransformInlineContentCalls,
70
+ js_module: parseAndTransformInlineContentCalls,
71
+ },
72
+ }
73
+ }
74
+
75
+ const parseJsInlineContentInfos = async ({ js, url, isJsModule }) => {
76
+ if (
77
+ !js.includes("InlineContent") &&
78
+ !js.includes("new Blob(") &&
79
+ !js.includes("JSON.parse(")
80
+ ) {
81
+ return []
82
+ }
83
+ const { metadata } = await applyBabelPlugins({
84
+ babelPlugins: [babelPluginMetadataInlineContents],
85
+ urlInfo: {
86
+ originalUrl: url,
87
+ type: isJsModule ? "js_module" : "js_classic",
88
+ content: js,
89
+ },
90
+ })
91
+ return metadata.inlineContentInfos
92
+ }
93
+
94
+ const babelPluginMetadataInlineContents = () => {
95
+ return {
96
+ name: "metadata-inline-contents",
97
+ visitor: {
98
+ Program: (programPath, state) => {
99
+ const inlineContentInfos = []
100
+ const onInlineContentInfo = (inlineContentInfo) => {
101
+ inlineContentInfos.push(inlineContentInfo)
102
+ }
103
+ programPath.traverse({
104
+ NewExpression: (path) => {
105
+ if (isNewInlineContentCall(path)) {
106
+ analyzeNewInlineContentCall(path.node, {
107
+ onInlineContentInfo,
108
+ })
109
+ return
110
+ }
111
+ if (isNewBlobCall(path.node)) {
112
+ analyzeNewBlobCall(path.node, {
113
+ onInlineContentInfo,
114
+ })
115
+ return
116
+ }
117
+ },
118
+ CallExpression: (path) => {
119
+ const node = path.node
120
+ if (isJSONParseCall(node)) {
121
+ analyzeJsonParseCall(node, {
122
+ onInlineContentInfo,
123
+ })
124
+ }
125
+ },
126
+ })
127
+ state.file.metadata.inlineContentInfos = inlineContentInfos
128
+ },
129
+ },
130
+ }
131
+ }
132
+
133
+ const isNewInlineContentCall = (path) => {
134
+ const node = path.node
135
+ if (node.callee.type === "Identifier") {
136
+ // terser rename import to use a shorter name
137
+ const name = getOriginalName(path, node.callee.name)
138
+ return name === "InlineContent"
139
+ }
140
+ if (node.callee.id && node.callee.id.type === "Identifier") {
141
+ const name = getOriginalName(path, node.callee.id.name)
142
+ return name === "InlineContent"
143
+ }
144
+ return false
145
+ }
146
+ const analyzeNewInlineContentCall = (node, { onInlineContentInfo }) => {
147
+ analyzeArguments({
148
+ node,
149
+ onInlineContentInfo,
150
+ nodeHoldingContent: node.arguments[0],
151
+ type: "new_inline_content_first_arg",
152
+ })
153
+ }
154
+
155
+ const isNewBlobCall = (node) => {
156
+ return node.callee.type === "Identifier" && node.callee.name === "Blob"
157
+ }
158
+ const analyzeNewBlobCall = (node, { onInlineContentInfo }) => {
159
+ const firstArg = node.arguments[0]
160
+ if (firstArg.type !== "ArrayExpression") {
161
+ return
162
+ }
163
+ if (firstArg.elements.length !== 1) {
164
+ return
165
+ }
166
+ analyzeArguments({
167
+ node,
168
+ onInlineContentInfo,
169
+ nodeHoldingContent: firstArg.elements[0],
170
+ type: "new_blob_first_arg",
171
+ })
172
+ }
173
+
174
+ const analyzeArguments = ({
175
+ node,
176
+ onInlineContentInfo,
177
+ nodeHoldingContent,
178
+ type,
179
+ }) => {
180
+ if (node.arguments.length !== 2) {
181
+ return
182
+ }
183
+ const [, secondArg] = node.arguments
184
+ const typePropertyNode = getTypePropertyNode(secondArg)
185
+ if (!typePropertyNode) {
186
+ return
187
+ }
188
+ const typePropertyValueNode = typePropertyNode.value
189
+ if (typePropertyValueNode.type !== "StringLiteral") {
190
+ return
191
+ }
192
+ const contentType = typePropertyValueNode.value
193
+ const contentDetails = extractContentDetails(nodeHoldingContent)
194
+ if (contentDetails) {
195
+ onInlineContentInfo({
196
+ node: nodeHoldingContent,
197
+ ...getNodePosition(nodeHoldingContent),
198
+ type,
199
+ contentType,
200
+ ...contentDetails,
201
+ })
202
+ }
203
+ }
204
+ const extractContentDetails = (node) => {
205
+ if (node.type === "StringLiteral") {
206
+ return {
207
+ nodeType: "StringLiteral",
208
+ quote: node.extra.raw[0],
209
+ content: node.value,
210
+ }
211
+ }
212
+ if (node.type === "TemplateLiteral") {
213
+ const quasis = node.quasis
214
+ if (quasis.length !== 1) {
215
+ return null
216
+ }
217
+ const templateElementNode = quasis[0]
218
+ return {
219
+ nodeType: "TemplateLiteral",
220
+ quote: "`",
221
+ content: templateElementNode.value.cooked,
222
+ }
223
+ }
224
+ return null
225
+ }
226
+
227
+ const isJSONParseCall = (node) => {
228
+ const callee = node.callee
229
+ return (
230
+ callee.type === "MemberExpression" &&
231
+ callee.object.type === "Identifier" &&
232
+ callee.object.name === "JSON" &&
233
+ callee.property.type === "Identifier" &&
234
+ callee.property.name === "parse"
235
+ )
236
+ }
237
+ const analyzeJsonParseCall = (node, { onInlineContentInfo }) => {
238
+ const firstArgNode = node.arguments[0]
239
+ const contentDetails = extractContentDetails(firstArgNode)
240
+ if (contentDetails) {
241
+ onInlineContentInfo({
242
+ node: firstArgNode,
243
+ ...getNodePosition(firstArgNode),
244
+ type: "json_parse_first_arg",
245
+ contentType: "application/json",
246
+ ...contentDetails,
247
+ })
248
+ }
249
+ }
250
+
251
+ const getNodePosition = (node) => {
252
+ return {
253
+ start: node.start,
254
+ end: node.end,
255
+ line: node.loc.start.line,
256
+ column: node.loc.start.column,
257
+ lineEnd: node.loc.end.line,
258
+ columnEnd: node.loc.end.column,
259
+ }
260
+ }
261
+ const getOriginalName = (path, name) => {
262
+ const binding = path.scope.getBinding(name)
263
+ if (!binding) {
264
+ return name
265
+ }
266
+ if (binding.path.type === "ImportSpecifier") {
267
+ const importedName = binding.path.node.imported.name
268
+ if (name === importedName) {
269
+ return name
270
+ }
271
+ return getOriginalName(path, importedName)
272
+ }
273
+ if (binding.path.type === "VariableDeclarator") {
274
+ const { init } = binding.path.node
275
+ if (init && init.type === "Identifier") {
276
+ const previousName = init.name
277
+ return getOriginalName(path, previousName)
278
+ }
279
+ }
280
+ return name
281
+ }
282
+ const getTypePropertyNode = (node) => {
283
+ if (node.type !== "ObjectExpression") {
284
+ return null
285
+ }
286
+ const { properties } = node
287
+ return properties.find((property) => {
288
+ return (
289
+ property.type === "ObjectProperty" &&
290
+ property.key.type === "Identifier" &&
291
+ property.key.name === "type"
292
+ )
293
+ })
294
+ }
@@ -0,0 +1,13 @@
1
+ export const jsenvPluginLeadingSlash = () => {
2
+ return {
3
+ name: "jsenv:leading_slash",
4
+ appliesDuring: "*",
5
+ resolveUrl: (reference, context) => {
6
+ if (reference.specifier[0] !== "/") {
7
+ return null
8
+ }
9
+ return new URL(reference.specifier.slice(1), context.rootDirectoryUrl)
10
+ .href
11
+ },
12
+ }
13
+ }
@@ -0,0 +1,9 @@
1
+ import { minifyWithParcel } from "@jsenv/utils/css_ast/parcel_css.js"
2
+
3
+ export const minifyCss = ({ cssUrlInfo, context }) => {
4
+ const { code, map } = minifyWithParcel(cssUrlInfo, context)
5
+ return {
6
+ content: String(code),
7
+ sourcemap: map,
8
+ }
9
+ }
@@ -0,0 +1,13 @@
1
+ import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
2
+
3
+ // https://github.com/kangax/html-minifier#options-quick-reference
4
+ export const minifyHtml = ({ htmlUrlInfo, options } = {}) => {
5
+ const { collapseWhitespace = true, removeComments = true } = options
6
+
7
+ const { minify } = requireFromJsenv("html-minifier")
8
+ const htmlMinified = minify(htmlUrlInfo.content, {
9
+ collapseWhitespace,
10
+ removeComments,
11
+ })
12
+ return htmlMinified
13
+ }
@@ -1,28 +1,11 @@
1
1
  // https://github.com/terser-js/terser#minify-options
2
2
 
3
- export const jsenvPluginMinifyJs = () => {
4
- const applyTerser = async (urlInfo) => {
5
- return minifyJs({
6
- url: urlInfo.url,
7
- content: urlInfo.content,
8
- sourcemap: urlInfo.sourcemap,
9
- isJsModule: urlInfo.type === "js_module",
10
- })
11
- }
12
-
13
- return {
14
- name: "jsenv:minify_js",
15
- appliesDuring: {
16
- build: true,
17
- },
18
- optimize: {
19
- js_classic: applyTerser,
20
- js_module: applyTerser,
21
- },
22
- }
23
- }
3
+ export const minifyJs = async ({ jsUrlInfo, options }) => {
4
+ const url = jsUrlInfo.url
5
+ const content = jsUrlInfo.content
6
+ const sourcemap = jsUrlInfo.sourcemap
7
+ const isJsModule = jsUrlInfo.type === "js_module"
24
8
 
25
- const minifyJs = async ({ url, content, sourcemap, isJsModule }) => {
26
9
  const { minify } = await import("terser")
27
10
  const terserResult = await minify(
28
11
  {
@@ -38,6 +21,7 @@ const minifyJs = async ({ url, content, sourcemap, isJsModule }) => {
38
21
  // We need to preserve "new InlineContent()" calls to be able to recognize them
39
22
  // after minification in order to version urls inside inline content text
40
23
  keep_fnames: /InlineContent/,
24
+ ...options,
41
25
  },
42
26
  )
43
27
  return {
@@ -0,0 +1,78 @@
1
+ import { minifyHtml } from "./html/minify_html.js"
2
+ import { minifyCss } from "./css/minify_css.js"
3
+ import { minifyJs } from "./js/minify_js.js"
4
+ import { minifyJson } from "./json/minify_json.js"
5
+
6
+ export const jsenvPluginMinification = (minification) => {
7
+ if (typeof minification === "boolean") {
8
+ minification = {
9
+ html: minification,
10
+ css: minification,
11
+ js_classic: minification,
12
+ js_module: minification,
13
+ json: minification,
14
+ svg: minification,
15
+ }
16
+ } else if (typeof minification !== "object") {
17
+ throw new Error(
18
+ `minification must be a boolean or an object, got ${minification}`,
19
+ )
20
+ }
21
+ Object.keys(minification).forEach((key) => {
22
+ if (minification[key] === true) minification[key] = {}
23
+ })
24
+ const htmlOptimizer = minification.html
25
+ ? (urlInfo, context) =>
26
+ minifyHtml({
27
+ htmlUrlInfo: urlInfo,
28
+ context,
29
+ options: minification.html,
30
+ })
31
+ : null
32
+ const jsonOptimizer = minification.json
33
+ ? (urlInfo, context) =>
34
+ minifyJson({
35
+ jsonUrlInfo: urlInfo,
36
+ context,
37
+ options: minification.json,
38
+ })
39
+ : null
40
+
41
+ return {
42
+ name: "jsenv:minification",
43
+ appliesDuring: {
44
+ build: true,
45
+ },
46
+ optimizeUrlContent: {
47
+ html: htmlOptimizer,
48
+ svg: htmlOptimizer,
49
+ css: minification.css
50
+ ? (urlInfo, context) =>
51
+ minifyCss({
52
+ cssUrlInfo: urlInfo,
53
+ context,
54
+ options: minification.css,
55
+ })
56
+ : null,
57
+ js_classic: minification.js_classic
58
+ ? (urlInfo, context) =>
59
+ minifyJs({
60
+ jsUrlInfo: urlInfo,
61
+ context,
62
+ options: minification.js_classic,
63
+ })
64
+ : null,
65
+ js_module: minification.js_module
66
+ ? (urlInfo, context) =>
67
+ minifyJs({
68
+ jsUrlInfo: urlInfo,
69
+ context,
70
+ options: minification.js_module,
71
+ })
72
+ : null,
73
+ json: jsonOptimizer,
74
+ importmap: jsonOptimizer,
75
+ webmanifest: jsonOptimizer,
76
+ },
77
+ }
78
+ }
@@ -0,0 +1,8 @@
1
+ export const minifyJson = ({ jsonUrlInfo }) => {
2
+ const { content } = jsonUrlInfo
3
+ if (content.startsWith("{\n")) {
4
+ const jsonWithoutWhitespaces = JSON.stringify(JSON.parse(content))
5
+ return jsonWithoutWhitespaces
6
+ }
7
+ return null
8
+ }
@@ -0,0 +1,162 @@
1
+ /*
2
+ * - should I restore eventual search params lost during node esm resolution
3
+ * - what about symlinks?
4
+ * It feels like I should apply symlink (when we don't want to preserve them)
5
+ * once a file:/// url is found, regardless
6
+ * if that comes from node resolution or anything else (not even magic resolution)
7
+ * it should likely be an other plugin happening after the others
8
+ */
9
+
10
+ import { registerFileLifecycle } from "@jsenv/filesystem"
11
+
12
+ import {
13
+ applyNodeEsmResolution,
14
+ defaultLookupPackageScope,
15
+ defaultReadPackageJson,
16
+ readCustomConditionsFromProcessArgs,
17
+ } from "@jsenv/node-esm-resolution"
18
+
19
+ export const jsenvPluginNodeEsmResolution = ({
20
+ rootDirectoryUrl,
21
+ runtimeCompat,
22
+ packageConditions,
23
+ filesInvalidatingCache = ["package.json", "package-lock.json"],
24
+ }) => {
25
+ const packageScopesCache = new Map()
26
+ const lookupPackageScope = (url) => {
27
+ const fromCache = packageScopesCache.get(url)
28
+ if (fromCache) {
29
+ return fromCache
30
+ }
31
+ const packageScope = defaultLookupPackageScope(url)
32
+ packageScopesCache.set(url, packageScope)
33
+ return packageScope
34
+ }
35
+ const packageJsonsCache = new Map()
36
+ const readPackageJson = (url) => {
37
+ const fromCache = packageJsonsCache.get(url)
38
+ if (fromCache) {
39
+ return fromCache
40
+ }
41
+ const packageJson = defaultReadPackageJson(url)
42
+ packageJsonsCache.set(url, packageJson)
43
+ return packageJson
44
+ }
45
+
46
+ const unregisters = []
47
+ filesInvalidatingCache.forEach((file) => {
48
+ const unregister = registerFileLifecycle(new URL(file, rootDirectoryUrl), {
49
+ added: () => {
50
+ packageScopesCache.clear()
51
+ packageJsonsCache.clear()
52
+ },
53
+ updated: () => {
54
+ packageScopesCache.clear()
55
+ packageJsonsCache.clear()
56
+ },
57
+ removed: () => {
58
+ packageScopesCache.clear()
59
+ packageJsonsCache.clear()
60
+ },
61
+ keepProcessAlive: false,
62
+ })
63
+ unregisters.push(unregister)
64
+ })
65
+
66
+ return [
67
+ jsenvPluginNodeEsmResolver({
68
+ runtimeCompat,
69
+ packageConditions,
70
+ lookupPackageScope,
71
+ readPackageJson,
72
+ }),
73
+ jsenvPluginNodeModulesVersionInUrls({
74
+ lookupPackageScope,
75
+ readPackageJson,
76
+ }),
77
+ ]
78
+ }
79
+
80
+ const jsenvPluginNodeEsmResolver = ({
81
+ runtimeCompat,
82
+ packageConditions,
83
+ lookupPackageScope,
84
+ readPackageJson,
85
+ }) => {
86
+ const nodeRuntimeEnabled = Object.keys(runtimeCompat).includes("node")
87
+ // https://nodejs.org/api/esm.html#resolver-algorithm-specification
88
+ packageConditions = packageConditions || [
89
+ ...readCustomConditionsFromProcessArgs(),
90
+ nodeRuntimeEnabled ? "node" : "browser",
91
+ "import",
92
+ ]
93
+ return {
94
+ name: "jsenv:node_esm_resolve",
95
+ appliesDuring: "*",
96
+ resolveUrl: {
97
+ js_import_export: (reference) => {
98
+ const { parentUrl, specifier } = reference
99
+ const { url } = applyNodeEsmResolution({
100
+ conditions: packageConditions,
101
+ parentUrl,
102
+ specifier,
103
+ lookupPackageScope,
104
+ readPackageJson,
105
+ })
106
+ return url
107
+ },
108
+ },
109
+ fetchUrlContent: (urlInfo) => {
110
+ if (urlInfo.url.startsWith("file:///@ignore/")) {
111
+ return {
112
+ content: "export default {}",
113
+ contentType: "text/javascript",
114
+ type: "js_module",
115
+ }
116
+ }
117
+ return null
118
+ },
119
+ }
120
+ }
121
+
122
+ const jsenvPluginNodeModulesVersionInUrls = ({
123
+ lookupPackageScope,
124
+ readPackageJson,
125
+ }) => {
126
+ return {
127
+ name: "jsenv:node_modules_version_in_urls",
128
+ appliesDuring: {
129
+ dev: true,
130
+ test: true,
131
+ },
132
+ transformUrlSearchParams: (reference, context) => {
133
+ if (!reference.url.startsWith("file:")) {
134
+ return null
135
+ }
136
+ // without this check a file inside a project without package.json
137
+ // could be considered as a node module if there is a ancestor package.json
138
+ // but we want to version only node modules
139
+ if (!reference.url.includes("/node_modules/")) {
140
+ return null
141
+ }
142
+ if (reference.searchParams.has("v")) {
143
+ return null
144
+ }
145
+ const packageUrl = lookupPackageScope(reference.url)
146
+ if (!packageUrl) {
147
+ return null
148
+ }
149
+ if (packageUrl === context.rootDirectoryUrl) {
150
+ return null
151
+ }
152
+ const packageVersion = readPackageJson(packageUrl).version
153
+ if (!packageVersion) {
154
+ // example where it happens: https://github.com/babel/babel/blob/2ce56e832c2dd7a7ed92c89028ba929f874c2f5c/packages/babel-runtime/helpers/esm/package.json#L2
155
+ return null
156
+ }
157
+ return {
158
+ v: packageVersion,
159
+ }
160
+ },
161
+ }
162
+ }
@@ -0,0 +1,12 @@
1
+ export const jsenvPluginNodeRuntime = ({ runtimeCompat }) => {
2
+ const nodeFound = Object.keys(runtimeCompat).includes("node")
3
+ if (!nodeFound) {
4
+ return []
5
+ }
6
+
7
+ // what do we need to do?
8
+ return {
9
+ name: "jsenv:node_runtime",
10
+ appliesDuring: "*",
11
+ }
12
+ }