@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/dist/event_source_client.js +14 -10
- package/dist/event_source_client.js.map +16 -15
- package/package.json +11 -6
- package/src/build/build.js +26 -12
- package/src/build/start_build_server.js +17 -7
- package/src/dev/start_dev_server.js +18 -6
- package/src/execute/execute.js +2 -0
- package/src/omega/kitchen.js +7 -18
- package/src/omega/server/file_service.js +4 -1
- package/src/omega/url_graph/url_graph_report.js +2 -9
- package/src/plugins/autoreload/dev_sse/client/event_source_client.js +17 -10
- package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +1 -1
- package/src/plugins/cache_control/jsenv_plugin_cache_control.js +1 -1
- package/src/plugins/commonjs_globals/jsenv_plugin_commonjs_globals.js +1 -1
- package/src/plugins/import_meta_hot/html_hot_dependencies.js +5 -2
- package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +1 -1
- package/src/test/execute_plan.js +9 -2
- package/src/test/execute_test_plan.js +2 -0
- package/src/test/logs_file_execution.js +1 -4
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/core",
|
|
3
|
-
"version": "27.0.0-alpha.
|
|
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.
|
|
71
|
+
"@jsenv/log": "1.6.1",
|
|
67
72
|
"@jsenv/logger": "4.0.1",
|
|
68
|
-
"@jsenv/node-esm-resolution": "0.0.
|
|
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.
|
|
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.
|
|
101
|
+
"@jsenv/https-local": "1.0.11",
|
|
97
102
|
"@jsenv/importmap-node-module": "5.1.3",
|
|
98
|
-
"@jsenv/package-workspace": "0.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",
|
package/src/build/build.js
CHANGED
|
@@ -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/
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
825
|
-
watchFilesTask = createTaskLog(
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
205
|
+
startDevServerTask.done()
|
|
194
206
|
logger.info(``)
|
|
195
207
|
Object.keys(server.origins).forEach((key) => {
|
|
196
208
|
logger.info(`- ${server.origins[key]}`)
|
package/src/execute/execute.js
CHANGED
|
@@ -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({
|
package/src/omega/kitchen.js
CHANGED
|
@@ -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
|
-
|
|
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 {
|
|
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
|
-
|
|
518
|
-
|
|
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 (!
|
|
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:
|
|
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
|
|
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
|
-
|
|
30
|
-
await previous
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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.
|
|
99
|
+
console.groupCollapsed(
|
|
100
|
+
`[jsenv] prune: ${boundary} (inside ${acceptedBy})`,
|
|
101
|
+
)
|
|
97
102
|
} else if (acceptedBy === boundary) {
|
|
98
|
-
console.
|
|
103
|
+
console.groupCollapsed(`[jsenv] hot reloading: ${boundary}`)
|
|
99
104
|
} else {
|
|
100
|
-
console.
|
|
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.
|
|
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 === "
|
|
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" ? "
|
|
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
|
|
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
|
|
28
|
+
const hotReferences = collectHotDataFromHtmlAst(htmlAst)
|
|
29
29
|
htmlUrlInfo.data.hotDecline = false
|
|
30
30
|
htmlUrlInfo.data.hotAcceptSelf = false
|
|
31
31
|
htmlUrlInfo.data.hotAcceptDependencies = hotReferences.map(
|
package/src/test/execute_plan.js
CHANGED
|
@@ -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
|
-
|
|
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 &&
|
|
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
|
|