@jsenv/core 24.2.1 → 24.3.3

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 (154) hide show
  1. package/dist/browser_runtime/browser_runtime-fbd309a1.js +5137 -0
  2. package/dist/browser_runtime/browser_runtime-fbd309a1.js.map +1064 -0
  3. package/dist/{jsenv_browser_system.js → browser_system/browser_system-29eda202.js} +12 -12
  4. package/dist/{jsenv_browser_system.js.map → browser_system/browser_system-29eda202.js.map} +64 -64
  5. package/dist/build_manifest.js +12 -0
  6. package/dist/compile_proxy/assets/s.js-749702e8.map +242 -0
  7. package/dist/compile_proxy/compile_proxy-405777e6.html +2074 -0
  8. package/dist/compile_proxy/compile_proxy.html__inline__20-39c0801c.js.map +385 -0
  9. package/dist/{jsenv_event_source_client.js → event_source_client/event_source_client-9f14c8b9.js} +39 -21
  10. package/dist/event_source_client/event_source_client-9f14c8b9.js.map +127 -0
  11. package/dist/redirector/assets/s.js-749702e8.map +242 -0
  12. package/dist/redirector/redirector-237cd168.html +2118 -0
  13. package/dist/redirector/redirector.html__inline__15-33acb0b9.js.map +390 -0
  14. package/dist/toolbar/assets/compilation.css-209d68b4.map +12 -0
  15. package/dist/toolbar/assets/eventsource.css-38cd0a36.map +12 -0
  16. package/dist/toolbar/assets/execution.css-0ebe522f.map +12 -0
  17. package/dist/toolbar/assets/focus.css-3f9c156d.map +12 -0
  18. package/dist/toolbar/assets/light-theme.css-78b19a80.map +12 -0
  19. package/dist/toolbar/assets/overflow-menu.css-d9688a1c.map +12 -0
  20. package/dist/toolbar/assets/s.js-749702e8.map +242 -0
  21. package/dist/toolbar/assets/settings.css-2b81b245.map +12 -0
  22. package/dist/toolbar/assets/toolbar.main.css-846920e9.map +28 -0
  23. package/dist/toolbar/assets/tooltip.css-03395ee6.map +12 -0
  24. package/dist/toolbar/toolbar-29e91dcd.html +4779 -0
  25. package/dist/toolbar/toolbar.main-53e1ab2b.js.map +795 -0
  26. package/dist/toolbar_injector/assets/jsenv-logo-188b9ca6.svg +95 -0
  27. package/dist/{jsenv_toolbar_injector.js → toolbar_injector/toolbar_injector-0af91b43.js} +87 -65
  28. package/dist/toolbar_injector/toolbar_injector-0af91b43.js.map +294 -0
  29. package/main.js +0 -1
  30. package/package.json +2 -1
  31. package/readme.md +10 -7
  32. package/src/buildProject.js +6 -2
  33. package/src/dev_server.js +26 -130
  34. package/src/execute.js +7 -10
  35. package/src/importUsingChildProcess.js +1 -1
  36. package/src/internal/{runtime/detectBrowser/detectBrowser.js → browser_detection/browser_detection.js} +0 -0
  37. package/src/internal/{runtime/detectBrowser → browser_detection}/detectAndroid.js +0 -0
  38. package/src/internal/{runtime/detectBrowser → browser_detection}/detectChrome.js +0 -0
  39. package/src/internal/{runtime/detectBrowser → browser_detection}/detectEdge.js +0 -0
  40. package/src/internal/{runtime/detectBrowser → browser_detection}/detectElectron.js +0 -0
  41. package/src/internal/{runtime/detectBrowser → browser_detection}/detectFirefox.js +0 -0
  42. package/src/internal/{runtime/detectBrowser → browser_detection}/detectIOS.js +0 -0
  43. package/src/internal/{runtime/detectBrowser → browser_detection}/detectInternetExplorer.js +0 -0
  44. package/src/internal/{runtime/detectBrowser → browser_detection}/detectOpera.js +0 -0
  45. package/src/internal/{runtime/detectBrowser → browser_detection}/detectSafari.js +0 -0
  46. package/src/internal/{runtime/detectBrowser → browser_detection}/util.js +0 -0
  47. package/src/internal/{runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js → browser_feature_detection/browser_feature_detection.js} +116 -81
  48. package/src/internal/browser_feature_detection/compile_proxy.html +27 -0
  49. package/src/internal/browser_launcher/browser_runtime_report.js +75 -0
  50. package/src/internal/{browser-launcher → browser_launcher}/createSharing.js +0 -0
  51. package/src/internal/{browser-launcher → browser_launcher}/executeHtmlFile.js +13 -16
  52. package/src/internal/{browser-launcher → browser_launcher}/trackPageToNotify.js +0 -0
  53. package/src/internal/{browser-launcher/jsenv-browser-system.js → browser_runtime/browser_runtime.js} +4 -4
  54. package/src/internal/{runtime/createBrowserRuntime/createBrowserSystem.js → browser_runtime/browser_system.js} +3 -2
  55. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/createBrowserRuntime.js +7 -5
  56. package/src/internal/{browser-launcher → browser_runtime}/displayErrorInDocument.js +0 -0
  57. package/src/internal/{browser-launcher → browser_runtime}/displayErrorNotification.js +2 -4
  58. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/evalSource.js +2 -0
  59. package/src/internal/{runtime/createBrowserRuntime → browser_runtime}/makeNamespaceTransferable.js +0 -0
  60. package/src/internal/{browser-utils → browser_utils}/fetch-browser.js +2 -0
  61. package/src/internal/{browser-utils → browser_utils}/fetchAndEvalUsingFetch.js +3 -0
  62. package/src/internal/{browser-utils → browser_utils}/fetchAndEvalUsingScript.js +2 -0
  63. package/src/internal/{browser-utils → browser_utils}/fetchJson.js +0 -0
  64. package/src/internal/{browser-utils → browser_utils}/fetchUsingXHR.js +4 -4
  65. package/src/internal/building/buildUsingRollup.js +4 -0
  66. package/src/internal/building/createJsenvRollupPlugin.js +19 -9
  67. package/src/internal/building/css/applyPostCss.js +19 -8
  68. package/src/internal/building/css/moveCssUrls.js +44 -0
  69. package/src/internal/building/css/parseCssRessource.js +67 -17
  70. package/src/internal/building/css/parseCssUrls.js +29 -23
  71. package/src/internal/building/css/postcss_plugin_url_visitor.js +11 -20
  72. package/src/internal/building/css/replaceCssUrls.js +38 -19
  73. package/src/internal/building/css_module.js +6 -10
  74. package/src/internal/building/html/parseHtmlRessource.js +37 -11
  75. package/src/internal/building/parseRessource.js +3 -0
  76. package/src/internal/building/ressource_builder.js +12 -3
  77. package/src/internal/compiling/babel_plugin_import_assertions.js +1 -2
  78. package/src/internal/compiling/html_source_file_service.js +23 -21
  79. package/src/internal/compiling/jsenvCompilerForHtml.js +15 -22
  80. package/src/internal/compiling/startCompileServer.js +37 -32
  81. package/src/internal/dev_server/event_source_client/event_source_connection.js +28 -19
  82. package/src/internal/dev_server/exploring/exploring.html +7 -2
  83. package/src/internal/dev_server/exploring/fetchExploringJson.js +4 -9
  84. package/src/internal/dev_server/redirector/redirector.html +37 -2
  85. package/src/internal/dev_server/toolbar/compilation/toolbar.compilation.js +4 -7
  86. package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +2 -2
  87. package/src/internal/dev_server/toolbar/notification/toolbar.notification.js +75 -44
  88. package/src/internal/dev_server/toolbar/toolbar.html +31 -5
  89. package/src/internal/dev_server/toolbar/toolbar.injector.js +55 -36
  90. package/src/internal/dev_server/toolbar/toolbar.main.js +45 -31
  91. package/src/internal/dev_server/toolbar/util/fetching.js +1 -1
  92. package/src/internal/executing/executeConcurrently.js +5 -4
  93. package/src/internal/executing/executePlan.js +1 -2
  94. package/src/internal/generateGroupMap/one_runtime_compat.js +1 -1
  95. package/src/internal/generateGroupMap/runtime_compat_composition.js +1 -1
  96. package/src/internal/generateGroupMap/runtime_support.js +1 -1
  97. package/src/internal/jsenvInternalFiles.js +0 -26
  98. package/src/internal/jsenv_builds.js +19 -0
  99. package/src/internal/{runtime/node-feature-detect/feature-detect-dynamic-import.mjs → node_feature_detection/feature_detect_dynamic_import.mjs} +0 -0
  100. package/src/internal/{runtime/node-feature-detect/feature-detect-top-level-await.mjs → node_feature_detection/feature_detect_top_level_await.mjs} +0 -0
  101. package/src/internal/{runtime/node-feature-detect → node_feature_detection}/nodeSupportsDynamicImport.js +0 -0
  102. package/src/internal/node_feature_detection/nodeSupportsTopLevelAwait.js +16 -0
  103. package/src/internal/{runtime/createNodeRuntime/scanNodeRuntimeFeatures.js → node_feature_detection/node_feature_detection.js} +12 -13
  104. package/src/internal/{node-launcher → node_launcher}/createChildProcessOptions.js +0 -0
  105. package/src/internal/{node-launcher → node_launcher}/createControllableNodeProcess.js +9 -14
  106. package/src/internal/{node-launcher → node_launcher}/kill_process_tree.js +0 -0
  107. package/src/internal/node_launcher/node_runtime_report.js +71 -0
  108. package/src/internal/{node-launcher → node_launcher}/processOptions.js +0 -0
  109. package/src/internal/{runtime/detectNode → node_runtime}/detectNode.js +0 -0
  110. package/src/internal/{runtime/createNodeRuntime → node_runtime}/evalSource.js +1 -1
  111. package/src/internal/{runtime/createNodeRuntime → node_runtime}/fetchSource.js +1 -1
  112. package/src/internal/{node-launcher → node_runtime}/nodeControllableFile.mjs +14 -11
  113. package/src/internal/{runtime/createNodeRuntime/createNodeExecutionWithDynamicImport.js → node_runtime/node_execution_dynamic_import.js} +34 -6
  114. package/src/internal/node_runtime/node_execution_performance.js +67 -0
  115. package/src/internal/{runtime/createNodeRuntime/createNodeExecutionWithSystemJs.js → node_runtime/node_execution_systemjs.js} +38 -24
  116. package/src/internal/{runtime/createNodeRuntime/createNodeSystem.js → node_runtime/node_system.js} +4 -4
  117. package/src/internal/runtime/computeCompileIdFromGroupId.js +1 -0
  118. package/src/internal/runtime/resolveGroup.js +1 -1
  119. package/src/internal/runtime/resolveRuntimeGroup.js +2 -2
  120. package/src/internal/{semantic-versioning → semantic_versioning}/findHighestVersion.js +0 -0
  121. package/src/internal/{semantic-versioning → semantic_versioning}/findLowestVersion.js +0 -0
  122. package/src/internal/{semantic-versioning → semantic_versioning}/index.js +0 -0
  123. package/src/internal/{semantic-versioning → semantic_versioning}/valueToVersion.js +0 -0
  124. package/src/internal/{semantic-versioning → semantic_versioning}/versionCompare.js +0 -0
  125. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsAbove.js +0 -0
  126. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsBelow.js +0 -0
  127. package/src/internal/{semantic-versioning → semantic_versioning}/versionIsEqual.js +0 -0
  128. package/src/launchBrowser.js +12 -3
  129. package/src/launchNode.js +36 -7
  130. package/src/requireUsingChildProcess.js +1 -1
  131. package/dist/jsenv_compile_proxy.js +0 -1339
  132. package/dist/jsenv_compile_proxy.js.map +0 -378
  133. package/dist/jsenv_event_source_client.js.map +0 -126
  134. package/dist/jsenv_exploring_index.js +0 -1092
  135. package/dist/jsenv_exploring_index.js.map +0 -353
  136. package/dist/jsenv_exploring_redirector.js +0 -1386
  137. package/dist/jsenv_exploring_redirector.js.map +0 -384
  138. package/dist/jsenv_redirector.js +0 -1388
  139. package/dist/jsenv_redirector.js.map +0 -384
  140. package/dist/jsenv_toolbar.js +0 -2880
  141. package/dist/jsenv_toolbar.js.map +0 -771
  142. package/dist/jsenv_toolbar_injector.js.map +0 -301
  143. package/src/internal/browser-launcher/jsenv_compile_proxy.html +0 -13
  144. package/src/internal/browser-launcher/jsenv_compile_proxy.js +0 -5
  145. package/src/internal/dev_server/event_source_client/event_source_client_file_info.js +0 -17
  146. package/src/internal/dev_server/exploring/exploring_file_info.js +0 -21
  147. package/src/internal/dev_server/redirector/redirector.js +0 -30
  148. package/src/internal/dev_server/redirector/redirector_file_info.js +0 -24
  149. package/src/internal/dev_server/toolbar/backtolist/toolbar.backtolist.js +0 -33
  150. package/src/internal/dev_server/toolbar/toolbar_file_info.js +0 -37
  151. package/src/internal/node-launcher/node-js-file.js +0 -110
  152. package/src/internal/runtime/createNodeRuntime/createNodeRuntime.js +0 -32
  153. package/src/internal/runtime/node-feature-detect/nodeSupportsTopLevelAwait.js +0 -18
  154. package/src/nodeRuntime.js +0 -5
@@ -0,0 +1,75 @@
1
+ export const getBrowserRuntimeReport = async ({
2
+ page,
3
+ coverageHandledFromOutside,
4
+ runtime,
5
+ compileServerId,
6
+ }) => {
7
+ const cache = cacheFromParams({
8
+ runtime,
9
+ compileServerId,
10
+ coverageHandledFromOutside,
11
+ })
12
+ const entry = cache.read()
13
+ if (entry) {
14
+ return entry
15
+ }
16
+ const browserRuntimeFeaturesReport = await page.evaluate(
17
+ /* istanbul ignore next */
18
+ async ({ coverageHandledFromOutside }) => {
19
+ // eslint-disable-next-line no-undef
20
+ await window.readyPromise
21
+
22
+ // eslint-disable-next-line no-undef
23
+ return window.scanBrowserRuntimeFeatures({
24
+ coverageHandledFromOutside,
25
+ failFastOnFeatureDetection: true,
26
+ })
27
+ },
28
+ { coverageHandledFromOutside },
29
+ )
30
+ cache.write(browserRuntimeFeaturesReport)
31
+ return browserRuntimeFeaturesReport
32
+ }
33
+
34
+ let currentCacheParams
35
+ let currentCacheValue
36
+ const cacheFromParams = ({
37
+ runtime,
38
+ compileServerId,
39
+ coverageHandledFromOutside,
40
+ }) => {
41
+ const params = {
42
+ compileServerId,
43
+ coverageHandledFromOutside,
44
+ }
45
+ const runtimeLabel = `${runtime.name}/${runtime.version}`
46
+
47
+ if (!currentCacheParams) {
48
+ currentCacheParams = params
49
+ currentCacheValue = {}
50
+ return {
51
+ read: () => null,
52
+ write: (value) => {
53
+ currentCacheValue[runtimeLabel] = value
54
+ },
55
+ }
56
+ }
57
+
58
+ if (JSON.stringify(currentCacheParams) !== JSON.stringify(params)) {
59
+ return {
60
+ read: () => null,
61
+ write: (value) => {
62
+ currentCacheParams = params
63
+ currentCacheValue = {}
64
+ currentCacheValue[runtimeLabel] = value
65
+ },
66
+ }
67
+ }
68
+
69
+ return {
70
+ read: () => currentCacheValue[runtimeLabel],
71
+ write: (value) => {
72
+ currentCacheValue[runtimeLabel] = value
73
+ },
74
+ }
75
+ }
@@ -5,18 +5,21 @@ import {
5
5
  urlToExtension,
6
6
  } from "@jsenv/filesystem"
7
7
 
8
- import { jsenvCompileProxyHtmlFileInfo } from "@jsenv/core/src/internal/jsenvInternalFiles.js"
8
+ import { COMPILE_PROXY_BUILD_URL } from "@jsenv/core/dist/build_manifest.js"
9
9
  import { filterV8Coverage } from "@jsenv/core/src/internal/executing/coverage_utils/v8_coverage_from_directory.js"
10
10
  import { composeTwoFileByFileIstanbulCoverages } from "@jsenv/core/src/internal/executing/coverage_utils/istanbul_coverage_composition.js"
11
- import { evalSource } from "../runtime/createNodeRuntime/evalSource.js"
11
+ import { evalSource } from "../node_runtime/evalSource.js"
12
12
  import { escapeRegexpSpecialCharacters } from "../escapeRegexpSpecialCharacters.js"
13
+ import { getBrowserRuntimeReport } from "./browser_runtime_report.js"
13
14
 
14
15
  export const executeHtmlFile = async (
15
16
  fileRelativeUrl,
16
17
  {
18
+ runtime,
17
19
  executeOperation,
18
20
  projectDirectoryUrl,
19
21
  compileServerOrigin,
22
+ compileServerId,
20
23
  outDirectoryRelativeUrl,
21
24
  page,
22
25
 
@@ -39,7 +42,7 @@ export const executeHtmlFile = async (
39
42
  await assertFilePresence(fileUrl)
40
43
 
41
44
  const compileProxyProjectRelativeUrl = urlToRelativeUrl(
42
- jsenvCompileProxyHtmlFileInfo.url,
45
+ COMPILE_PROXY_BUILD_URL,
43
46
  projectDirectoryUrl,
44
47
  )
45
48
  const compileProxyClientUrl = resolveUrl(
@@ -48,22 +51,16 @@ export const executeHtmlFile = async (
48
51
  )
49
52
  executeOperation.throwIfAborted()
50
53
  await page.goto(compileProxyClientUrl)
54
+ executeOperation.throwIfAborted()
51
55
 
52
56
  const coverageHandledFromOutside =
53
57
  coveragePlaywrightAPIAvailable && !coverageForceIstanbul
54
-
55
- executeOperation.throwIfAborted()
56
- const browserRuntimeFeaturesReport = await page.evaluate(
57
- /* istanbul ignore next */
58
- ({ coverageHandledFromOutside }) => {
59
- // eslint-disable-next-line no-undef
60
- return window.scanBrowserRuntimeFeatures({
61
- coverageHandledFromOutside,
62
- failFastOnFeatureDetection: true,
63
- })
64
- },
65
- { coverageHandledFromOutside },
66
- )
58
+ const browserRuntimeFeaturesReport = await getBrowserRuntimeReport({
59
+ page,
60
+ coverageHandledFromOutside,
61
+ compileServerId,
62
+ runtime,
63
+ })
67
64
 
68
65
  try {
69
66
  let executionResult
@@ -1,14 +1,14 @@
1
1
  /* eslint-env browser */
2
2
 
3
- import { unevalException } from "../unevalException.js"
4
- import { createBrowserRuntime } from "../runtime/createBrowserRuntime/createBrowserRuntime.js"
5
3
  import { installBrowserErrorStackRemapping } from "../error-stack-remapping/installBrowserErrorStackRemapping.js"
6
- import { fetchUrl } from "../browser-utils/fetch-browser.js"
7
- import { fetchAndEvalUsingFetch } from "../browser-utils/fetchAndEvalUsingFetch.js"
4
+ import { fetchUrl } from "../browser_utils/fetch-browser.js"
5
+ import { fetchAndEvalUsingFetch } from "../browser_utils/fetchAndEvalUsingFetch.js"
6
+ import { unevalException } from "../unevalException.js"
8
7
  import { memoize } from "../memoize.js"
9
8
 
10
9
  import { displayErrorInDocument } from "./displayErrorInDocument.js"
11
10
  import { displayErrorNotification } from "./displayErrorNotification.js"
11
+ import { createBrowserRuntime } from "./createBrowserRuntime.js"
12
12
 
13
13
  const getNavigationStartTime = () => {
14
14
  try {
@@ -1,6 +1,7 @@
1
- import { getJavaScriptModuleResponseError } from "../module-registration.js"
1
+ /* eslint-env browser */
2
2
 
3
- import "../s.js"
3
+ import { getJavaScriptModuleResponseError } from "../runtime/module-registration.js"
4
+ import "../runtime/s.js"
4
5
 
5
6
  export const createBrowserSystem = ({
6
7
  compileServerOrigin,
@@ -1,12 +1,14 @@
1
+ /* eslint-env browser */
2
+
1
3
  import { normalizeImportMap } from "@jsenv/importmap/src/normalizeImportMap.js"
2
4
 
3
5
  // do not use memoize from @jsenv/filesystem to avoid pulling @jsenv/filesystem code into the browser build
4
- import { memoize } from "../../memoize.js"
5
- import { fetchUrl } from "../../browser-utils/fetch-browser.js"
6
- import { createImportResolverForImportmap } from "../../import-resolution/import-resolver-importmap.js"
7
- import { measureAsyncFnPerf } from "../../perf_browser.js"
6
+ import { fetchUrl } from "../browser_utils/fetch-browser.js"
7
+ import { createImportResolverForImportmap } from "../import-resolution/import-resolver-importmap.js"
8
+ import { memoize } from "../memoize.js"
9
+ import { measureAsyncFnPerf } from "../perf_browser.js"
8
10
 
9
- import { createBrowserSystem } from "./createBrowserSystem.js"
11
+ import { createBrowserSystem } from "./browser_system.js"
10
12
  import { makeNamespaceTransferable } from "./makeNamespaceTransferable.js"
11
13
 
12
14
  const memoizedCreateBrowserSystem = memoize(createBrowserSystem)
@@ -3,10 +3,8 @@ const { Notification } = window
3
3
 
4
4
  const displayErrorNotificationNotAvailable = () => {}
5
5
 
6
- const displayErrorNotificationImplementation = async (error, { icon } = {}) => {
7
- const permission = await Notification.requestPermission()
8
-
9
- if (permission === "granted") {
6
+ const displayErrorNotificationImplementation = (error, { icon } = {}) => {
7
+ if (Notification.permission === "granted") {
10
8
  const notification = new Notification("An error occured", {
11
9
  lang: "en",
12
10
  body: error.stack,
@@ -1,3 +1,5 @@
1
+ /* eslint-env browser */
2
+
1
3
  export const evalSource = (code, href) => {
2
4
  // eslint-disable-next-line no-eval
3
5
  return window.eval(appendSourceURL(code, href))
@@ -1,3 +1,5 @@
1
+ /* eslint-env browser */
2
+
1
3
  import { fetchUsingXHR } from "./fetchUsingXHR.js"
2
4
 
3
5
  const fetchNative = async (url, { mode = "cors", ...options } = {}) => {
@@ -1,4 +1,7 @@
1
+ /* eslint-env browser */
2
+
1
3
  import { createDetailedMessage } from "@jsenv/logger"
4
+
2
5
  import { fetchUrl } from "./fetch-browser.js"
3
6
 
4
7
  export const fetchAndEvalUsingFetch = async (url) => {
@@ -1,3 +1,5 @@
1
+ /* eslint-env browser */
2
+
1
3
  export const fetchAndEvalUsingScript = async (src) => {
2
4
  return new Promise((resolve, reject) => {
3
5
  const script = document.createElement("script")
@@ -1,4 +1,4 @@
1
- import { createDetailedMessage } from "@jsenv/logger"
1
+ /* eslint-env browser */
2
2
 
3
3
  export const fetchUsingXHR = async (
4
4
  url,
@@ -206,9 +206,9 @@ const hasSearchParams = typeof window.URLSearchParams === "function"
206
206
 
207
207
  const createRequestError = (error, { url }) => {
208
208
  return new Error(
209
- createDetailedMessage(`error during xhr request on ${url}.`, {
210
- ["error stack"]: error.stack,
211
- }),
209
+ `error during xhr request on ${url}.
210
+ --- error stack ---
211
+ ${error.stack}`,
212
212
  )
213
213
  }
214
214
 
@@ -50,8 +50,10 @@ export const buildUsingRollup = async ({
50
50
  importPaths,
51
51
 
52
52
  urlVersioning,
53
+ urlVersionningForEntryPoints,
53
54
  lineBreakNormalization,
54
55
  jsConcatenation,
56
+ cssConcatenation,
55
57
  useImportMapToMaximizeCacheReuse,
56
58
  preserveEntrySignatures,
57
59
  treeshake,
@@ -121,8 +123,10 @@ export const buildUsingRollup = async ({
121
123
  importPaths,
122
124
 
123
125
  urlVersioning,
126
+ urlVersionningForEntryPoints,
124
127
  lineBreakNormalization,
125
128
  jsConcatenation,
129
+ cssConcatenation,
126
130
  useImportMapToMaximizeCacheReuse,
127
131
 
128
132
  minify,
@@ -12,6 +12,7 @@ import {
12
12
  urlIsInsideOf,
13
13
  normalizeStructuredMetaMap,
14
14
  urlToMeta,
15
+ urlToBasename,
15
16
  } from "@jsenv/filesystem"
16
17
  import { UNICODE } from "@jsenv/log"
17
18
 
@@ -72,8 +73,10 @@ export const createJsenvRollupPlugin = async ({
72
73
  importAssertionsSupport,
73
74
 
74
75
  urlVersioning,
76
+ urlVersionningForEntryPoints,
75
77
  lineBreakNormalization,
76
78
  jsConcatenation,
79
+ cssConcatenation,
77
80
  useImportMapToMaximizeCacheReuse,
78
81
 
79
82
  minify,
@@ -468,6 +471,7 @@ export const createJsenvRollupPlugin = async ({
468
471
  minifyJs,
469
472
  minifyHtml,
470
473
  minifyCssOptions,
474
+ cssConcatenation,
471
475
  })
472
476
  },
473
477
  },
@@ -586,9 +590,10 @@ export const createJsenvRollupPlugin = async ({
586
590
  atleastOneChunkEmitted = true
587
591
  emitChunk({
588
592
  id: ensureRelativeUrlNotation(entryProjectRelativeUrl),
589
- name: entryBuildRelativeUrl,
590
- // don't hash js entry points
591
- fileName: entryBuildRelativeUrl,
593
+ name: urlToBasename(`file:///${entryBuildRelativeUrl}`),
594
+ ...(urlVersionningForEntryPoints
595
+ ? {}
596
+ : { fileName: entryBuildRelativeUrl }),
592
597
  })
593
598
  return
594
599
  }
@@ -601,15 +606,16 @@ export const createJsenvRollupPlugin = async ({
601
606
  `Unusual content type for entry point, got "${entryContentType}" for ${entryProjectRelativeUrl}`,
602
607
  )
603
608
  }
604
- const entryUrl = resolveUrl(
605
- entryProjectRelativeUrl,
606
- compileServerOrigin,
607
- )
609
+ const entryUrl =
610
+ entryContentType === "text/html"
611
+ ? resolveUrl(entryProjectRelativeUrl, compileServerOrigin)
612
+ : resolveUrl(entryProjectRelativeUrl, compileDirectoryRemoteUrl)
608
613
  await ressourceBuilder.createReferenceForEntryPoint({
609
614
  entryContentType,
610
615
  entryUrl,
611
616
  entryBuffer,
612
617
  entryBuildRelativeUrl,
618
+ urlVersionningForEntryPoints,
613
619
  })
614
620
  },
615
621
  ),
@@ -1015,6 +1021,9 @@ export const createJsenvRollupPlugin = async ({
1015
1021
  return id
1016
1022
  }
1017
1023
  outputOptions.entryFileNames = () => {
1024
+ if (urlVersionningForEntryPoints) {
1025
+ return `[name]-[hash]${outputExtension}`
1026
+ }
1018
1027
  return `[name]${outputExtension}`
1019
1028
  }
1020
1029
  outputOptions.chunkFileNames = () => {
@@ -1097,7 +1106,9 @@ export const createJsenvRollupPlugin = async ({
1097
1106
  const file = jsChunks[fileName]
1098
1107
  let buildRelativeUrl
1099
1108
  const canBeVersioned =
1100
- asRollupUrl(file.url) in jsModulesFromEntry || !file.isEntry
1109
+ asRollupUrl(file.url) in jsModulesFromEntry ||
1110
+ urlVersionningForEntryPoints ||
1111
+ !file.isEntry
1101
1112
 
1102
1113
  if (urlVersioning) {
1103
1114
  if (canBeVersioned && useImportMapToMaximizeCacheReuse) {
@@ -1133,7 +1144,6 @@ export const createJsenvRollupPlugin = async ({
1133
1144
  buildInlineFileContents[buildRelativeUrl] = file.code
1134
1145
  } else {
1135
1146
  markBuildRelativeUrlAsUsedByJs(buildRelativeUrl)
1136
- buildManifest[fileName] = buildRelativeUrl
1137
1147
  buildMappings[originalProjectRelativeUrl] = buildRelativeUrl
1138
1148
  }
1139
1149
  })
@@ -1,23 +1,35 @@
1
1
  import { urlToFileSystemPath } from "@jsenv/filesystem"
2
2
 
3
- export const applyPostCss = async (
4
- cssString,
5
- cssUrl,
3
+ export const applyPostCss = async ({
4
+ code,
5
+ url,
6
+ map,
7
+ sourcemapMethod = "comment",
6
8
  plugins,
7
9
  // https://github.com/postcss/postcss#options
8
10
  options = {},
9
- ) => {
11
+ }) => {
10
12
  const { default: postcss } = await import("postcss")
11
13
 
12
- let result
13
14
  try {
14
- const cssFileUrl = urlToFileUrl(cssUrl)
15
- result = await postcss(plugins).process(cssString, {
15
+ const cssFileUrl = urlToFileUrl(url)
16
+ const result = await postcss(plugins).process(code, {
16
17
  collectUrls: true,
17
18
  from: urlToFileSystemPath(cssFileUrl),
18
19
  to: urlToFileSystemPath(cssFileUrl),
20
+ map: {
21
+ annotation: sourcemapMethod === "comment",
22
+ inline: sourcemapMethod === "inline",
23
+ // https://postcss.org/api/#sourcemapoptions
24
+ ...(map ? { prev: JSON.stringify(map) } : {}),
25
+ },
19
26
  ...options,
20
27
  })
28
+ return {
29
+ code: result.css,
30
+ map: result.map.toJSON(),
31
+ postCssMessages: result.messages,
32
+ }
21
33
  } catch (error) {
22
34
  if (error.name === "CssSyntaxError") {
23
35
  console.error(String(error))
@@ -25,7 +37,6 @@ export const applyPostCss = async (
25
37
  }
26
38
  throw error
27
39
  }
28
- return result
29
40
  }
30
41
 
31
42
  // the goal of this function is to take an url that is likely an http url
@@ -0,0 +1,44 @@
1
+ import { urlToRelativeUrl } from "@jsenv/filesystem"
2
+
3
+ import { applyPostCss } from "./applyPostCss.js"
4
+ import { postCssPluginUrlVisitor } from "./postcss_plugin_url_visitor.js"
5
+
6
+ export const moveCssUrls = async ({
7
+ code,
8
+ from,
9
+ to,
10
+ map,
11
+ sourcemapMethod,
12
+ } = {}) => {
13
+ const fromDirectoryUrl = new URL("./", from).href
14
+ const toDirectoryUrl = new URL("./", to).href
15
+ // same directory, nothing to do
16
+ if (fromDirectoryUrl === toDirectoryUrl) {
17
+ return { code, map }
18
+ }
19
+
20
+ const result = await applyPostCss({
21
+ code,
22
+ url: from,
23
+ map,
24
+ sourcemapMethod,
25
+ plugins: [
26
+ postCssPluginUrlVisitor({
27
+ urlVisitor: ({ specifier }) => {
28
+ if (specifier[0] === "#") {
29
+ return null
30
+ }
31
+ const url = new URL(specifier, fromDirectoryUrl).href
32
+ const relativeUrl = urlToRelativeUrl(url, toDirectoryUrl)
33
+ return relativeUrl
34
+ },
35
+ }),
36
+ ],
37
+ })
38
+ code = result.code
39
+ map = result.map
40
+ return {
41
+ code,
42
+ map,
43
+ }
44
+ }
@@ -1,4 +1,9 @@
1
- import { urlToFilename, urlToRelativeUrl, resolveUrl } from "@jsenv/filesystem"
1
+ import {
2
+ urlToFilename,
3
+ urlToRelativeUrl,
4
+ resolveUrl,
5
+ fileSystemPathToUrl,
6
+ } from "@jsenv/filesystem"
2
7
 
3
8
  import {
4
9
  getCssSourceMappingUrl,
@@ -7,14 +12,18 @@ import {
7
12
  import { getRessourceAsBase64Url } from "../ressource_builder_util.js"
8
13
  import { parseCssUrls } from "./parseCssUrls.js"
9
14
  import { replaceCssUrls } from "./replaceCssUrls.js"
15
+ import { moveCssUrls } from "./moveCssUrls.js"
10
16
 
11
17
  export const parseCssRessource = async (
12
18
  cssRessource,
13
19
  { notifyReferenceFound },
14
- { asProjectUrl, asOriginalUrl, minify, minifyCssOptions },
20
+ { asProjectUrl, asOriginalUrl, minify, minifyCssOptions, cssConcatenation },
15
21
  ) => {
16
22
  const cssString = String(cssRessource.bufferBeforeBuild)
17
23
  const cssSourcemapUrl = getCssSourceMappingUrl(cssString)
24
+ const url = cssRessource.url
25
+ let code = cssString
26
+ let map
18
27
  let sourcemapReference
19
28
  if (cssSourcemapUrl) {
20
29
  sourcemapReference = notifyReferenceFound({
@@ -26,6 +35,8 @@ export const parseCssRessource = async (
26
35
  referenceColumn: 0,
27
36
  isSourcemap: true,
28
37
  })
38
+ await sourcemapReference.ressource.getBufferAvailablePromise()
39
+ map = JSON.parse(String(sourcemapReference.ressource.bufferBeforeBuild))
29
40
  } else {
30
41
  sourcemapReference = notifyReferenceFound({
31
42
  contentType: "application/octet-stream",
@@ -35,20 +46,25 @@ export const parseCssRessource = async (
35
46
  })
36
47
  }
37
48
 
38
- const { atImports, urlDeclarations } = await parseCssUrls(
39
- cssString,
40
- cssRessource.url,
41
- )
42
-
49
+ const { atImports, urlDeclarations } = await parseCssUrls({
50
+ code,
51
+ url,
52
+ })
43
53
  const urlNodeReferenceMapping = new Map()
54
+ const atImportReferences = []
44
55
  atImports.forEach((atImport) => {
45
56
  const importReference = notifyReferenceFound({
46
57
  ressourceSpecifier: atImport.specifier,
47
58
  ...cssNodeToReferenceLocation(atImport.urlDeclarationNode),
48
59
  })
49
60
  urlNodeReferenceMapping.set(atImport.urlNode, importReference)
61
+ atImportReferences.push(importReference)
50
62
  })
51
63
  urlDeclarations.forEach((urlDeclaration) => {
64
+ if (urlDeclaration.specifier[0] === "#") {
65
+ return
66
+ }
67
+
52
68
  const urlReference = notifyReferenceFound({
53
69
  ressourceSpecifier: urlDeclaration.specifier,
54
70
  ...cssNodeToReferenceLocation(urlDeclaration.urlDeclarationNode),
@@ -56,22 +72,20 @@ export const parseCssRessource = async (
56
72
  urlNodeReferenceMapping.set(urlDeclaration.urlNode, urlReference)
57
73
  })
58
74
 
59
- return async ({ getUrlRelativeToImporter, buildDirectoryUrl }) => {
75
+ return async ({
76
+ getUrlRelativeToImporter,
77
+ precomputeBuildRelativeUrl,
78
+ buildDirectoryUrl,
79
+ }) => {
60
80
  const sourcemapRessource = sourcemapReference.ressource
61
-
62
- let code = cssString
63
- let map = sourcemapRessource.isPlaceholder
64
- ? undefined
65
- : JSON.parse(String(sourcemapRessource.bufferBeforeBuild))
66
-
67
81
  const cssCompiledUrl = cssRessource.url
68
82
  const cssOriginalUrl = asOriginalUrl(cssCompiledUrl)
69
83
 
70
84
  const replaceCssResult = await replaceCssUrls({
71
- url: map ? asProjectUrl(cssCompiledUrl) : cssOriginalUrl,
72
- code: cssString,
85
+ url: asProjectUrl(cssCompiledUrl),
86
+ code,
73
87
  map,
74
- getUrlReplacementValue: ({ urlNode }) => {
88
+ urlVisitor: ({ urlNode }) => {
75
89
  const nodeCandidates = Array.from(urlNodeReferenceMapping.keys())
76
90
  const urlNodeFound = nodeCandidates.find((urlNodeCandidate) =>
77
91
  isSameCssDocumentUrlNode(urlNodeCandidate, urlNode),
@@ -95,6 +109,42 @@ export const parseCssRessource = async (
95
109
  }
96
110
  return getUrlRelativeToImporter(cssUrlRessource)
97
111
  },
112
+ cssConcatenation,
113
+ loadCssImport: async (path) => {
114
+ // const cssFileUrl = asProjectUrl(url)
115
+ const importedCssFileUrl = fileSystemPathToUrl(path)
116
+ const atImportReference = atImportReferences.find(
117
+ (atImportReference) => {
118
+ return (
119
+ asProjectUrl(atImportReference.ressource.url) ===
120
+ importedCssFileUrl
121
+ )
122
+ },
123
+ )
124
+ atImportReference.inlinedCallback()
125
+ let code = String(atImportReference.ressource.bufferAfterBuild)
126
+ const moveResult = await moveCssUrls({
127
+ code,
128
+ from: resolveUrl(
129
+ atImportReference.ressource.buildRelativeUrl,
130
+ buildDirectoryUrl,
131
+ ),
132
+ to: resolveUrl(
133
+ precomputeBuildRelativeUrl(cssRessource),
134
+ buildDirectoryUrl,
135
+ ),
136
+ // moveCssUrls will change the css source code
137
+ // Ideally we should update the sourcemap referenced by css
138
+ // to target the one after css urls are moved.
139
+ // It means we should force sourcemap ressource to the new one
140
+ // until it's supported we prevent postcss from updating the
141
+ // sourcemap comment, othwise css would reference a sourcemap
142
+ // that won't by in the build directory
143
+ sourcemapMethod: null,
144
+ })
145
+ code = moveResult.code
146
+ return code
147
+ },
98
148
  cssMinification: minify,
99
149
  cssMinificationOptions: minifyCssOptions,
100
150
  })