@jsenv/core 27.0.0-alpha.60 → 27.0.0-alpha.63

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.
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "27.0.0-alpha.60",
3
+ "version": "27.0.0-alpha.63",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
+ "author": {
7
+ "name": "dmail",
8
+ "email": "dmaillard06@gmail.com",
9
+ "url": "https://twitter.com/damienmaillard"
10
+ },
6
11
  "repository": {
7
12
  "type": "git",
8
13
  "url": "https://github.com/jsenv/jsenv-core"
@@ -63,12 +68,12 @@
63
68
  "@jsenv/filesystem": "3.2.2",
64
69
  "@jsenv/importmap": "1.2.0",
65
70
  "@jsenv/integrity": "0.0.1",
66
- "@jsenv/log": "1.5.2",
71
+ "@jsenv/log": "1.6.1",
67
72
  "@jsenv/logger": "4.0.1",
68
- "@jsenv/node-esm-resolution": "0.0.6",
73
+ "@jsenv/node-esm-resolution": "0.0.7",
69
74
  "@jsenv/server": "12.6.2",
70
75
  "@jsenv/uneval": "1.6.0",
71
- "@jsenv/utils": "1.7.5",
76
+ "@jsenv/utils": "1.7.7",
72
77
  "construct-style-sheets-polyfill": "3.1.0",
73
78
  "cssnano": "5.1.7",
74
79
  "cssnano-preset-default": "5.2.7",
@@ -93,9 +98,9 @@
93
98
  "@jsenv/assert": "2.5.4",
94
99
  "@jsenv/eslint-config": "16.0.9",
95
100
  "@jsenv/file-size-impact": "12.1.11",
96
- "@jsenv/https-local": "1.0.8",
101
+ "@jsenv/https-local": "1.0.11",
97
102
  "@jsenv/importmap-node-module": "5.1.3",
98
- "@jsenv/package-workspace": "0.1.1",
103
+ "@jsenv/package-workspace": "0.1.2",
99
104
  "@jsenv/performance-impact": "2.2.10",
100
105
  "@jsenv/pwa": "5.0.0",
101
106
  "eslint": "8.13.0",
@@ -17,9 +17,9 @@ import {
17
17
  registerDirectoryLifecycle,
18
18
  } from "@jsenv/filesystem"
19
19
  import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
20
- import { createLogger } from "@jsenv/logger"
20
+ import { createLogger, loggerToLevels } from "@jsenv/logger"
21
21
 
22
- import { createTaskLog } from "@jsenv/utils/logs/task_log.js"
22
+ import { createTaskLog } from "@jsenv/log"
23
23
  import {
24
24
  injectQueryParams,
25
25
  setUrlFilename,
@@ -109,8 +109,9 @@ export const build = async ({
109
109
  cooldownBetweenFileEvents,
110
110
  watch = false,
111
111
 
112
- writeOnFileSystem = true,
113
112
  buildDirectoryClean = true,
113
+ writeOnFileSystem = true,
114
+ writeGeneratedFiles = false,
114
115
  baseUrl = "/",
115
116
  assetManifest = true,
116
117
  assetManifestFileRelativeUrl = "asset-manifest.json",
@@ -140,6 +141,7 @@ export const build = async ({
140
141
  const runBuild = async ({ signal, logLevel }) => {
141
142
  const logger = createLogger({ logLevel })
142
143
  const buildOperation = Abort.startOperation()
144
+ const infoLogsAreDisabled = !loggerToLevels(logger).info
143
145
  buildOperation.addAbortSignal(signal)
144
146
  const entryPointKeys = Object.keys(entryPoints)
145
147
  if (entryPointKeys.length === 1) {
@@ -151,7 +153,9 @@ build ${entryPointKeys.length} entry points`)
151
153
  }
152
154
 
153
155
  const rawGraph = createUrlGraph()
154
- const prebuildTask = createTaskLog(logger, "prebuild")
156
+ const prebuildTask = createTaskLog("prebuild", {
157
+ disabled: infoLogsAreDisabled,
158
+ })
155
159
  let urlCount = 0
156
160
  const rawGraphKitchen = createKitchen({
157
161
  signal,
@@ -161,6 +165,7 @@ build ${entryPointKeys.length} entry points`)
161
165
  scenario: "build",
162
166
  sourcemaps,
163
167
  runtimeCompat,
168
+ writeGeneratedFiles,
164
169
  plugins: [
165
170
  ...plugins,
166
171
  {
@@ -316,7 +321,9 @@ build ${entryPointKeys.length} entry points`)
316
321
  if (urlInfosToBundle.length === 0) {
317
322
  return
318
323
  }
319
- const bundleTask = createTaskLog(logger, `bundle "${type}"`)
324
+ const bundleTask = createTaskLog(`bundle "${type}"`, {
325
+ disabled: infoLogsAreDisabled,
326
+ })
320
327
  try {
321
328
  const bundlerGeneratedUrlInfos =
322
329
  await rawGraphKitchen.pluginController.callAsyncHook(
@@ -378,6 +385,7 @@ build ${entryPointKeys.length} entry points`)
378
385
  sourcemaps,
379
386
  sourcemapsRelativeSources: !versioning,
380
387
  runtimeCompat,
388
+ writeGeneratedFiles,
381
389
  plugins: [
382
390
  jsenvPluginUrlAnalysis(),
383
391
  jsenvPluginAsJsClassic({
@@ -636,7 +644,7 @@ build ${entryPointKeys.length} entry points`)
636
644
  },
637
645
  ],
638
646
  })
639
- const buildTask = createTaskLog(logger, "build")
647
+ const buildTask = createTaskLog("build", { disabled: infoLogsAreDisabled })
640
648
  const postBuildEntryUrls = []
641
649
  try {
642
650
  await loadUrlGraph({
@@ -670,6 +678,7 @@ ${Object.keys(finalGraph.urlInfos).join("\n")}`,
670
678
  await applyUrlVersioning({
671
679
  buildOperation,
672
680
  logger,
681
+ infoLogsAreDisabled,
673
682
  buildDirectoryUrl,
674
683
  rawUrls,
675
684
  buildUrls,
@@ -677,6 +686,7 @@ ${Object.keys(finalGraph.urlInfos).join("\n")}`,
677
686
  postBuildEntryUrls,
678
687
  sourcemaps,
679
688
  runtimeCompat,
689
+ writeGeneratedFiles,
680
690
  rawGraph,
681
691
  finalGraph,
682
692
  finalGraphKitchen,
@@ -802,11 +812,10 @@ ${Object.keys(finalGraph.urlInfos).join("\n")}`,
802
812
  resolveFirstBuild = resolve
803
813
  rejectFirstBuild = reject
804
814
  })
805
- const watchLogger = createLogger({ logLevel: "info" })
806
815
  let buildAbortController
807
816
  let watchFilesTask
808
817
  const startBuild = async () => {
809
- const buildTask = createTaskLog(watchLogger, "build")
818
+ const buildTask = createTaskLog("build")
810
819
  buildAbortController = new AbortController()
811
820
  try {
812
821
  const result = await runBuild({
@@ -815,14 +824,14 @@ ${Object.keys(finalGraph.urlInfos).join("\n")}`,
815
824
  })
816
825
  buildTask.done()
817
826
  resolveFirstBuild(result)
818
- watchFilesTask = createTaskLog(watchLogger, "watch files")
827
+ watchFilesTask = createTaskLog("watch files")
819
828
  } catch (e) {
820
829
  if (Abort.isAbortError(e)) {
821
830
  buildTask.fail(`build aborted`)
822
831
  } else if (e.code === "PARSE_ERROR") {
823
832
  buildTask.fail()
824
- watchLogger.error(e.stack)
825
- watchFilesTask = createTaskLog(watchLogger, "watch files")
833
+ console.error(e.stack)
834
+ watchFilesTask = createTaskLog("watch files")
826
835
  } else {
827
836
  buildTask.fail()
828
837
  rejectFirstBuild(e)
@@ -871,6 +880,7 @@ ${Object.keys(finalGraph.urlInfos).join("\n")}`,
871
880
  const applyUrlVersioning = async ({
872
881
  buildOperation,
873
882
  logger,
883
+ infoLogsAreDisabled,
874
884
  buildDirectoryUrl,
875
885
  rawUrls,
876
886
  buildUrls,
@@ -878,13 +888,16 @@ const applyUrlVersioning = async ({
878
888
  postBuildEntryUrls,
879
889
  sourcemaps,
880
890
  runtimeCompat,
891
+ writeGeneratedFiles,
881
892
  rawGraph,
882
893
  finalGraph,
883
894
  finalGraphKitchen,
884
895
  lineBreakNormalization,
885
896
  versioningMethod,
886
897
  }) => {
887
- const versioningTask = createTaskLog(logger, "inject version in urls")
898
+ const versioningTask = createTaskLog("inject version in urls", {
899
+ disabled: infoLogsAreDisabled,
900
+ })
888
901
  try {
889
902
  const urlsSorted = sortByDependencies(finalGraph.urlInfos)
890
903
  urlsSorted.forEach((url) => {
@@ -980,6 +993,7 @@ const applyUrlVersioning = async ({
980
993
  sourcemaps,
981
994
  sourcemapsRelativeSources: true,
982
995
  runtimeCompat,
996
+ writeGeneratedFiles,
983
997
  plugins: [
984
998
  jsenvPluginUrlAnalysis(),
985
999
  jsenvPluginInline({
@@ -13,6 +13,7 @@
13
13
  * we want to be in the user shoes and we should not alter build files.
14
14
  */
15
15
 
16
+ import { parentPort } from "node:worker_threads"
16
17
  import {
17
18
  jsenvAccessControlAllowedHeaders,
18
19
  startServer,
@@ -25,10 +26,11 @@ import {
25
26
  assertAndNormalizeDirectoryUrl,
26
27
  registerDirectoryLifecycle,
27
28
  } from "@jsenv/filesystem"
28
- import { createLogger } from "@jsenv/logger"
29
+ import { createLogger, loggerToLevels } from "@jsenv/logger"
29
30
 
31
+ import { createTaskLog } from "@jsenv/log"
32
+ import { getCallerPosition } from "@jsenv/utils/src/caller_position.js"
30
33
  import { initReloadableProcess } from "@jsenv/utils/process_reload/process_reload.js"
31
- import { createTaskLog } from "@jsenv/utils/logs/task_log.js"
32
34
 
33
35
  export const startBuildServer = async ({
34
36
  signal = new AbortController().signal,
@@ -45,14 +47,20 @@ export const startBuildServer = async ({
45
47
 
46
48
  rootDirectoryUrl,
47
49
  buildDirectoryUrl,
50
+ mainBuildFileUrl = "/index.html",
48
51
  buildServerFiles = {
49
52
  "./package.json": true,
50
53
  "./jsenv.config.mjs": true,
51
54
  },
52
- buildServerMainFile,
53
- buildServerAutoreload = false,
55
+ buildServerMainFile = getCallerPosition().url,
56
+ // force disable server autoreload when this code is executed:
57
+ // - inside a forked child process
58
+ // - inside a worker thread
59
+ // (because node cluster won't work)
60
+ buildServerAutoreload = typeof process.send !== "function" &&
61
+ !parentPort &&
62
+ !process.debugPort,
54
63
  cooldownBetweenFileEvents,
55
- mainBuildFileUrl = "/index.html",
56
64
  }) => {
57
65
  const logger = createLogger({ logLevel })
58
66
  rootDirectoryUrl = assertAndNormalizeDirectoryUrl(rootDirectoryUrl)
@@ -114,7 +122,9 @@ export const startBuildServer = async ({
114
122
  }
115
123
  signal = reloadableProcess.signal
116
124
 
117
- const startServerTask = createTaskLog(logger, "start build server")
125
+ const startBuildServerTask = createTaskLog("start build server", {
126
+ disabled: !loggerToLevels(logger).info,
127
+ })
118
128
  const server = await startServer({
119
129
  signal,
120
130
  stopOnExit: false,
@@ -174,7 +184,7 @@ export const startBuildServer = async ({
174
184
  )
175
185
  },
176
186
  })
177
- startServerTask.done()
187
+ startBuildServerTask.done()
178
188
  logger.info(``)
179
189
  Object.keys(server.origins).forEach((key) => {
180
190
  logger.info(`- ${server.origins[key]}`)
@@ -1,11 +1,13 @@
1
+ import { parentPort } from "node:worker_threads"
1
2
  import {
2
3
  assertAndNormalizeDirectoryUrl,
3
4
  registerDirectoryLifecycle,
4
5
  } from "@jsenv/filesystem"
5
- import { createLogger } from "@jsenv/logger"
6
+ import { createLogger, loggerToLevels } from "@jsenv/logger"
6
7
 
8
+ import { createTaskLog } from "@jsenv/log"
9
+ import { getCallerPosition } from "@jsenv/utils/src/caller_position.js"
7
10
  import { initReloadableProcess } from "@jsenv/utils/process_reload/process_reload.js"
8
- import { createTaskLog } from "@jsenv/utils/logs/task_log.js"
9
11
  import { getCorePlugins } from "@jsenv/core/src/plugins/plugins.js"
10
12
  import { createUrlGraph } from "@jsenv/core/src/omega/url_graph.js"
11
13
  import { createKitchen } from "@jsenv/core/src/omega/kitchen.js"
@@ -33,8 +35,14 @@ export const startDevServer = async ({
33
35
  "./package.json": true,
34
36
  "./jsenv.config.mjs": true,
35
37
  },
36
- devServerMainFile,
37
- devServerAutoreload = false,
38
+ devServerMainFile = getCallerPosition().url,
39
+ // force disable server autoreload when this code is executed:
40
+ // - inside a forked child process
41
+ // - inside a worker thread
42
+ // (because node cluster won't work)
43
+ devServerAutoreload = typeof process.send !== "function" &&
44
+ !parentPort &&
45
+ !process.debugPort,
38
46
  clientFiles = {
39
47
  "./**": true,
40
48
  "./**/.*/": false, // any folder starting with a dot is ignored (includes .git,.jsenv for instance)
@@ -61,6 +69,7 @@ export const startDevServer = async ({
61
69
  },
62
70
  },
63
71
  toolbar = false,
72
+ writeGeneratedFiles = true,
64
73
  }) => {
65
74
  const logger = createLogger({ logLevel })
66
75
  rootDirectoryUrl = assertAndNormalizeDirectoryUrl(rootDirectoryUrl)
@@ -118,7 +127,9 @@ export const startDevServer = async ({
118
127
  }
119
128
  }
120
129
 
121
- const startServerTask = createTaskLog(logger, "start server")
130
+ const startDevServerTask = createTaskLog("start dev server", {
131
+ disabled: !loggerToLevels(logger).info,
132
+ })
122
133
 
123
134
  const clientFileChangeCallbackList = []
124
135
  const clientFilesPruneCallbackList = []
@@ -154,6 +165,7 @@ export const startDevServer = async ({
154
165
  urlGraph,
155
166
  scenario: "dev",
156
167
  sourcemaps,
168
+ writeGeneratedFiles,
157
169
  plugins: [
158
170
  ...plugins,
159
171
  ...getCorePlugins({
@@ -190,7 +202,7 @@ export const startDevServer = async ({
190
202
  kitchen,
191
203
  scenario: "dev",
192
204
  })
193
- startServerTask.done()
205
+ startDevServerTask.done()
194
206
  logger.info(``)
195
207
  Object.keys(server.origins).forEach((key) => {
196
208
  logger.info(`- ${server.origins[key]}`)
@@ -35,6 +35,7 @@ export const execute = async ({
35
35
  injectedGlobals,
36
36
  transpilation,
37
37
  htmlSupervisor = true,
38
+ writeGeneratedFiles = false,
38
39
 
39
40
  port,
40
41
  protocol,
@@ -74,6 +75,7 @@ export const execute = async ({
74
75
  urlGraph,
75
76
  scenario,
76
77
  sourcemaps,
78
+ writeGeneratedFiles,
77
79
  plugins: [
78
80
  ...plugins,
79
81
  ...getCorePlugins({
@@ -1,13 +1,12 @@
1
1
  import {
2
2
  urlIsInsideOf,
3
3
  writeFileSync,
4
- isFileSystemPath,
5
- fileSystemPathToUrl,
6
4
  moveUrl,
7
5
  ensureWindowsDriveLetter,
8
6
  } from "@jsenv/filesystem"
9
7
  import { createDetailedMessage } from "@jsenv/logger"
10
8
 
9
+ import { getCallerPosition } from "@jsenv/utils/src/caller_position.js"
11
10
  import { stringifyUrlSite } from "@jsenv/utils/urls/url_trace.js"
12
11
  import { CONTENT_TYPE } from "@jsenv/utils/content_type/content_type.js"
13
12
  import { normalizeUrl, setUrlFilename } from "@jsenv/utils/urls/url_utils.js"
@@ -47,7 +46,7 @@ export const createKitchen = ({
47
46
  }[scenario],
48
47
  sourcemapsRelativeSources,
49
48
  runtimeCompat = defaultRuntimeCompat,
50
- writeOnFileSystem = true,
49
+ writeGeneratedFiles,
51
50
  }) => {
52
51
  const pluginController = createPluginController({
53
52
  plugins,
@@ -504,21 +503,11 @@ export const createKitchen = ({
504
503
  },
505
504
  inject: ({ trace, ...rest }) => {
506
505
  if (trace === undefined) {
507
- const { prepareStackTrace } = Error
508
- Error.prepareStackTrace = (error, stack) => {
509
- Error.prepareStackTrace = prepareStackTrace
510
- return stack
511
- }
512
- const { stack } = new Error()
513
- const callerCallsite = stack[1]
514
- const fileName = callerCallsite.getFileName()
506
+ const { url, line, column } = getCallerPosition()
515
507
  trace = stringifyUrlSite({
516
- url:
517
- fileName && isFileSystemPath(fileName)
518
- ? fileSystemPathToUrl(fileName)
519
- : fileName,
520
- line: callerCallsite.getLineNumber(),
521
- column: callerCallsite.getColumnNumber(),
508
+ url,
509
+ line,
510
+ column,
522
511
  })
523
512
  }
524
513
  return addReference({
@@ -613,7 +602,7 @@ export const createKitchen = ({
613
602
  outDirectoryUrl = outDirectoryUrl ? String(outDirectoryUrl) : undefined
614
603
 
615
604
  const writeFiles = ({ gotError }) => {
616
- if (!writeOnFileSystem || !outDirectoryUrl) {
605
+ if (!writeGeneratedFiles || !outDirectoryUrl) {
617
606
  return
618
607
  }
619
608
  const { generatedUrl } = urlInfo
@@ -83,7 +83,10 @@ export const createFileService = ({
83
83
  await kitchen.cook({
84
84
  reference: referenceFromGraph || reference,
85
85
  urlInfo,
86
- outDirectoryUrl: `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`,
86
+ outDirectoryUrl:
87
+ scenario === "dev"
88
+ ? `${rootDirectoryUrl}.jsenv/${runtimeName}@${runtimeVersion}/`
89
+ : `${rootDirectoryUrl}.jsenv/${scenario}/${runtimeName}@${runtimeVersion}/`,
87
90
  clientRuntimeCompat: {
88
91
  [runtimeName]: runtimeVersion,
89
92
  },
@@ -1,7 +1,4 @@
1
- import { ANSI } from "@jsenv/log"
2
-
3
- import { byteAsFileSize } from "@jsenv/utils/logs/size_log.js"
4
- import { distributeNumbers } from "@jsenv/utils/logs/number_distribution.js"
1
+ import { ANSI, byteAsFileSize, distributePercentages } from "@jsenv/log"
5
2
 
6
3
  export const createUrlGraphSummary = (
7
4
  urlGraph,
@@ -96,11 +93,7 @@ const createUrlGraphReport = (urlGraph) => {
96
93
  sizesToDistribute[groupName] = sizeGroups[groupName]
97
94
  }
98
95
  })
99
- const ratios = distributeNumbers(sizesToDistribute)
100
- const percentageGroups = {}
101
- Object.keys(ratios).forEach((groupName) => {
102
- percentageGroups[groupName] = parseFloat(ratios[groupName]) * 100
103
- })
96
+ const percentageGroups = distributePercentages(sizesToDistribute)
104
97
 
105
98
  return {
106
99
  // sourcemaps are special, there size are ignored
@@ -26,13 +26,16 @@ const dequeue = async () => {
26
26
  const callbacks = pendingCallbacks.slice()
27
27
  pendingCallbacks = []
28
28
  running = true
29
- await callbacks.reduce(async (previous, callback) => {
30
- await previous
31
- await callback()
32
- }, Promise.resolve())
33
- running = false
34
- if (pendingCallbacks.length) {
35
- dequeue()
29
+ try {
30
+ await callbacks.reduce(async (previous, callback) => {
31
+ await previous
32
+ await callback()
33
+ }, Promise.resolve())
34
+ } finally {
35
+ running = false
36
+ if (pendingCallbacks.length) {
37
+ dequeue()
38
+ }
36
39
  }
37
40
  }
38
41
 
@@ -93,11 +96,15 @@ const applyHotReload = async ({ hotInstructions }) => {
93
96
  // if (!urlHotMeta) {return }
94
97
 
95
98
  if (type === "prune") {
96
- console.group(`[jsenv] prune: ${boundary} (inside ${acceptedBy})`)
99
+ console.groupCollapsed(
100
+ `[jsenv] prune: ${boundary} (inside ${acceptedBy})`,
101
+ )
97
102
  } else if (acceptedBy === boundary) {
98
- console.group(`[jsenv] hot reloading: ${boundary}`)
103
+ console.groupCollapsed(`[jsenv] hot reloading: ${boundary}`)
99
104
  } else {
100
- console.group(`[jsenv] hot reloading: ${acceptedBy} inside ${boundary}`)
105
+ console.groupCollapsed(
106
+ `[jsenv] hot reloading: ${acceptedBy} inside ${boundary}`,
107
+ )
101
108
  }
102
109
  if (urlHotMeta && urlHotMeta.disposeCallback) {
103
110
  console.log(`call dispose callback`)
@@ -113,7 +113,7 @@ export const jsenvPluginDevSSEServer = ({
113
113
  return iterate(firstUrlInfo, trace)
114
114
  }
115
115
  clientFileChangeCallbackList.push(({ url, event }) => {
116
- const urlInfo = urlGraph.urlInfos[url]
116
+ const urlInfo = urlGraph.getUrlInfo(url)
117
117
  // file not part of dependency graph
118
118
  if (!urlInfo) {
119
119
  return
@@ -6,7 +6,7 @@ export const jsenvPluginCacheControl = () => {
6
6
  test: true,
7
7
  },
8
8
  augmentResponse: ({ reference }, context) => {
9
- if (context.scenario === "dev") {
9
+ if (context.scenario === "test") {
10
10
  // During dev, all files are put into browser cache for 1 hour because:
11
11
  // 1: Browser cache is a temporary directory created by playwright
12
12
  // 2: We assume source files won't be modified while tests are running
@@ -22,7 +22,7 @@ export const jsenvPluginCommonJsGlobals = () => {
22
22
  const isJsModule = urlInfo.type === "js_module"
23
23
  const replaceMap = {
24
24
  "process.env.NODE_ENV": `("${
25
- scenario === "dev" || scenario === "test" ? "dev" : "prod"
25
+ scenario === "dev" || scenario === "test" ? "development" : "production"
26
26
  }")`,
27
27
  "global": "globalThis",
28
28
  "__filename": isJsModule
@@ -103,7 +103,7 @@ export const collectHotDataFromHtmlAst = (htmlAst) => {
103
103
  }
104
104
  iterate(htmlAst, {})
105
105
 
106
- return { hotReferences }
106
+ return hotReferences
107
107
  }
108
108
 
109
109
  const nodeNamesWithHref = ["link", "a", "image", "use"]
@@ -125,7 +125,7 @@ const getNodeContext = (node) => {
125
125
 
126
126
  const htmlNodeCanHotReload = (node) => {
127
127
  if (node.nodeName === "link") {
128
- const { isStylesheet, isRessourceHint } = parseLinkNode(node)
128
+ const { isStylesheet, isRessourceHint, rel } = parseLinkNode(node)
129
129
  if (isStylesheet) {
130
130
  // stylesheets can be hot replaced by default
131
131
  return true
@@ -135,6 +135,9 @@ const htmlNodeCanHotReload = (node) => {
135
135
  // but we won't do anything (if the ressource is deleted we should?)
136
136
  return true
137
137
  }
138
+ if (rel === "icon") {
139
+ return true
140
+ }
138
141
  return false
139
142
  }
140
143
  return [
@@ -25,7 +25,7 @@ export const jsenvPluginImportMetaHot = ({ rootDirectoryUrl }) => {
25
25
  return
26
26
  }
27
27
  const htmlAst = parseHtmlString(htmlUrlInfo.content)
28
- const { hotReferences } = collectHotDataFromHtmlAst(htmlAst)
28
+ const hotReferences = collectHotDataFromHtmlAst(htmlAst)
29
29
  htmlUrlInfo.data.hotDecline = false
30
30
  htmlUrlInfo.data.hotAcceptSelf = false
31
31
  htmlUrlInfo.data.hotAcceptDependencies = hotReferences.map(
@@ -65,6 +65,7 @@ export const executePlan = async (
65
65
  nodeEsmResolution,
66
66
  fileSystemMagicResolution,
67
67
  transpilation,
68
+ writeGeneratedFiles,
68
69
 
69
70
  protocol,
70
71
  privateKey,
@@ -134,7 +135,7 @@ export const executePlan = async (
134
135
  urlGraph,
135
136
  scenario,
136
137
  sourcemaps,
137
- writeOnFileSystem: false,
138
+ writeGeneratedFiles,
138
139
  plugins: [
139
140
  ...plugins,
140
141
  ...getCorePlugins({
@@ -208,7 +209,13 @@ export const executePlan = async (
208
209
  const debugLogsEnabled = loggerToLevels(logger).debug
209
210
  const executionLogsEnabled = loggerToLevels(logger).info
210
211
  const executionSpinner =
211
- !debugLogsEnabled && executionLogsEnabled && process.stdout.isTTY
212
+ !debugLogsEnabled &&
213
+ executionLogsEnabled &&
214
+ process.stdout.isTTY &&
215
+ // if there is an error during execution npm will mess up the output
216
+ // (happens when npm runs several command in a workspace)
217
+ // so we enable spinner only when !process.exitCode (no error so far)
218
+ !process.exitCode
212
219
 
213
220
  const startMs = Date.now()
214
221
  const report = {}
@@ -87,6 +87,7 @@ export const executeTestPlan = async ({
87
87
  injectedGlobals,
88
88
  nodeEsmResolution,
89
89
  fileSystemMagicResolution,
90
+ writeGeneratedFiles = false,
90
91
 
91
92
  protocol,
92
93
  privateKey,
@@ -173,6 +174,7 @@ export const executeTestPlan = async ({
173
174
  injectedGlobals,
174
175
  nodeEsmResolution,
175
176
  fileSystemMagicResolution,
177
+ writeGeneratedFiles,
176
178
 
177
179
  protocol,
178
180
  privateKey,
@@ -1,7 +1,4 @@
1
- import { ANSI, UNICODE } from "@jsenv/log"
2
-
3
- import { msAsDuration } from "@jsenv/utils/logs/duration_log.js"
4
- import { byteAsMemoryUsage } from "@jsenv/utils/logs/size_log.js"
1
+ import { ANSI, UNICODE, msAsDuration, byteAsMemoryUsage } from "@jsenv/log"
5
2
 
6
3
  import { EXECUTION_COLORS } from "./execution_colors.js"
7
4