@jsenv/core 27.4.0 → 27.5.2
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/js/autoreload.js +359 -0
- package/dist/js/execute_using_dynamic_import.js +1 -1
- package/dist/js/html_supervisor_installer.js +469 -254
- package/dist/js/html_supervisor_setup.js +3 -4
- package/dist/js/new_stylesheet.js +26 -58
- package/dist/js/server_events_client.js +307 -0
- package/dist/main.js +7558 -7311
- package/package.json +12 -10
- package/{README.md → readme.md} +8 -9
- package/src/build/build.js +12 -16
- package/src/build/start_build_server.js +24 -28
- package/src/dev/start_dev_server.js +34 -96
- package/src/execute/execute.js +17 -35
- package/src/omega/errors.js +20 -18
- package/src/omega/kitchen.js +7 -6
- package/src/omega/omega_server.js +96 -127
- package/src/omega/server/file_service.js +247 -46
- package/src/omega/url_graph.js +33 -20
- package/src/plugins/autoreload/client/autoreload.js +201 -0
- package/src/plugins/autoreload/{dev_sse/client → client}/autoreload_preference.js +0 -0
- package/src/plugins/autoreload/{dev_sse/client → client}/reload.js +29 -10
- package/src/plugins/autoreload/{dev_sse/client → client}/url_helpers.js +0 -0
- package/src/plugins/autoreload/jsenv_plugin_autoreload.js +4 -4
- package/src/plugins/autoreload/{dev_sse/jsenv_plugin_dev_sse_client.js → jsenv_plugin_autoreload_client.js} +8 -8
- package/src/plugins/autoreload/jsenv_plugin_autoreload_server.js +196 -0
- package/src/{dev/plugins → plugins}/explorer/client/explorer.html +0 -0
- package/src/{dev/plugins → plugins}/explorer/client/jsenv.png +0 -0
- package/src/{dev/plugins → plugins}/explorer/jsenv_plugin_explorer.js +1 -3
- package/src/plugins/html_supervisor/client/error_formatter.js +300 -0
- package/src/plugins/html_supervisor/client/error_overlay.js +172 -0
- package/src/plugins/html_supervisor/client/html_supervisor_installer.js +124 -54
- package/src/plugins/html_supervisor/client/html_supervisor_setup.js +3 -4
- package/src/plugins/html_supervisor/jsenv_plugin_html_supervisor.js +72 -27
- package/src/plugins/inline/jsenv_plugin_html_inline_content.js +97 -117
- package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +66 -58
- package/src/plugins/plugin_controller.js +102 -67
- package/src/plugins/plugins.js +10 -8
- package/src/{helpers/event_source/event_source.js → plugins/server_events/client/event_source_connection.js} +102 -31
- package/src/plugins/server_events/client/server_events_client.js +17 -0
- package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +48 -0
- package/src/plugins/server_events/server_events_dispatcher.js +69 -0
- package/src/{dev/plugins → plugins}/toolbar/client/animation/toolbar_animation.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/eventsource/eventsource.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/eventsource/toolbar_eventsource.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/execution/execution.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/execution/toolbar_execution.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/focus/focus.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/focus/toolbar_focus.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/jsenv_logo.svg +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/notification/toolbar_notification.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/responsive/overflow_menu.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/responsive/toolbar_responsive.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/settings/settings.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/settings/toolbar_settings.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/theme/jsenv_theme.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/theme/light_theme.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/theme/toolbar_theme.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/toolbar.html +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/toolbar_injector.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/toolbar_main.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/toolbar_main.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/tooltip/tooltip.css +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/tooltip/tooltip.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/animation.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/dom.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/fetch_using_xhr.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/fetching.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/iframe_to_parent_href.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/jsenv_logger.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/preferences.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/responsive.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/util/util.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/client/variant/variant.js +0 -0
- package/src/{dev/plugins → plugins}/toolbar/jsenv_plugin_toolbar.js +0 -0
- package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +4 -3
- package/src/plugins/transpilation/babel/new_stylesheet/client/new_stylesheet.js +25 -55
- package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +44 -24
- package/src/plugins/transpilation/jsenv_plugin_transpilation.js +6 -1
- package/src/plugins/url_analysis/html/html_urls.js +8 -8
- package/src/test/execute_plan.js +36 -54
- package/src/test/execute_test_plan.js +2 -2
- package/dist/js/event_source_client.js +0 -549
- package/src/helpers/event_source/sse_service.js +0 -53
- package/src/plugins/autoreload/dev_sse/client/event_source_client.js +0 -193
- package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +0 -192
- package/src/plugins/html_supervisor/client/error_in_document.js +0 -345
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/core",
|
|
3
|
-
"version": "27.
|
|
3
|
+
"version": "27.5.2",
|
|
4
4
|
"description": "Tool to develop, test and build js projects",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"performances": "node --expose-gc ./scripts/performance/generate_performance_report.mjs --log --once",
|
|
51
51
|
"file-size": "node ./scripts/file_size/file_size.mjs --log",
|
|
52
52
|
"start_file_server": "node ./scripts/dev/start_file_server.mjs",
|
|
53
|
+
"generate-dev-errors-snapshot-files": "node --conditions=development ./tests/dev_server/errors/generate_snapshot_files.mjs",
|
|
53
54
|
"prettier": "prettier --write .",
|
|
54
55
|
"playwright-install": "npx playwright install-deps && npx playwright install",
|
|
55
56
|
"certificate-install": "node ./scripts/dev/install_certificate_authority.mjs",
|
|
@@ -65,32 +66,33 @@
|
|
|
65
66
|
"@c88/v8-coverage": "0.1.1",
|
|
66
67
|
"@financial-times/polyfill-useragent-normaliser": "2.0.1",
|
|
67
68
|
"@jsenv/abort": "4.2.3",
|
|
68
|
-
"@jsenv/ast": "1.1.
|
|
69
|
+
"@jsenv/ast": "1.1.3",
|
|
69
70
|
"@jsenv/babel-plugins": "1.0.6",
|
|
70
71
|
"@jsenv/filesystem": "4.1.1",
|
|
71
72
|
"@jsenv/importmap": "1.2.1",
|
|
72
73
|
"@jsenv/integrity": "0.0.1",
|
|
73
74
|
"@jsenv/log": "3.1.0",
|
|
74
75
|
"@jsenv/node-esm-resolution": "0.1.0",
|
|
75
|
-
"@jsenv/server": "
|
|
76
|
+
"@jsenv/server": "13.0.0",
|
|
76
77
|
"@jsenv/sourcemap": "1.0.2",
|
|
77
78
|
"@jsenv/uneval": "1.6.0",
|
|
78
79
|
"@jsenv/url-meta": "7.0.0",
|
|
79
80
|
"@jsenv/urls": "1.2.7",
|
|
80
81
|
"@jsenv/utils": "2.0.1",
|
|
81
82
|
"acorn-import-assertions": "1.8.0",
|
|
83
|
+
"construct-style-sheets-polyfill": "3.1.0",
|
|
82
84
|
"cuid": "2.1.8",
|
|
83
85
|
"html-minifier": "4.0.0",
|
|
84
86
|
"istanbul-lib-coverage": "3.2.0",
|
|
85
87
|
"istanbul-lib-instrument": "5.2.0",
|
|
86
88
|
"istanbul-lib-report": "3.0.0",
|
|
87
|
-
"istanbul-reports": "3.1.
|
|
89
|
+
"istanbul-reports": "3.1.5",
|
|
88
90
|
"launch-editor": "2.4.0",
|
|
89
91
|
"pidtree": "0.6.0",
|
|
90
|
-
"rollup": "2.
|
|
92
|
+
"rollup": "2.77.0",
|
|
91
93
|
"string-width": "5.1.2",
|
|
92
94
|
"strip-ansi": "7.0.1",
|
|
93
|
-
"terser": "5.14.
|
|
95
|
+
"terser": "5.14.2",
|
|
94
96
|
"v8-to-istanbul": "9.0.1",
|
|
95
97
|
"wrap-ansi": "8.0.1"
|
|
96
98
|
},
|
|
@@ -98,16 +100,16 @@
|
|
|
98
100
|
"@babel/eslint-parser": "7.18.2",
|
|
99
101
|
"@babel/plugin-syntax-import-assertions": "7.18.6",
|
|
100
102
|
"@jsenv/assert": "2.6.0",
|
|
101
|
-
"@jsenv/eslint-config": "16.1
|
|
103
|
+
"@jsenv/eslint-config": "16.2.1",
|
|
102
104
|
"@jsenv/file-size-impact": "13.0.1",
|
|
103
105
|
"@jsenv/https-local": "2.1.0",
|
|
104
106
|
"@jsenv/package-workspace": "0.4.1",
|
|
105
107
|
"@jsenv/performance-impact": "3.0.1",
|
|
106
|
-
"eslint": "8.
|
|
107
|
-
"eslint-plugin-html": "
|
|
108
|
+
"eslint": "8.20.0",
|
|
109
|
+
"eslint-plugin-html": "7.0.0",
|
|
108
110
|
"eslint-plugin-import": "2.26.0",
|
|
109
111
|
"eslint-plugin-react": "7.30.1",
|
|
110
|
-
"playwright": "1.23.
|
|
112
|
+
"playwright": "1.23.4",
|
|
111
113
|
"prettier": "2.7.1"
|
|
112
114
|
}
|
|
113
115
|
}
|
package/{README.md → readme.md}
RENAMED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
# @jsenv/core [](https://www.npmjs.com/package/@jsenv/core)
|
|
2
2
|
|
|
3
|
-
Jsenv was first created to write tests that could be executed in different runtimes.
|
|
3
|
+
Jsenv was first created to write tests that could be executed in different runtimes.
|
|
4
|
+
It has naturally evolved to cover the core needs of a JavaScript project: developement, testing and building for production.
|
|
4
5
|
|
|
5
|
-
- :exploding_head:
|
|
6
|
-
- :
|
|
7
|
-
- :sparkles: Same dev experience for source and test files
|
|
6
|
+
- :exploding_head: Execute HTML files as tests
|
|
7
|
+
- :sparkles: A single tool for the whole developer experience
|
|
8
8
|
- :ok_hand: Seamless integration with standard HTML, CSS and JS
|
|
9
9
|
|
|
10
|
-
Jsenv is NOT a tool for fullstack projects where client and server code are in the same files.<br />
|
|
11
|
-
Jsenv is designed for projects where client and server codebases are independent.
|
|
12
|
-
|
|
13
10
|
# Demo
|
|
14
11
|
|
|
15
12
|
The following command can be used to create a jsenv project on a machine.
|
|
@@ -18,14 +15,16 @@ The following command can be used to create a jsenv project on a machine.
|
|
|
18
15
|
npm create jsenv@latest
|
|
19
16
|
```
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
This command prompts to choose a demo from a list.
|
|
19
|
+
Each demo contains preconfigured scripts such as:
|
|
22
20
|
|
|
23
21
|
- `npm run dev`: starts a dev server with autoreload.
|
|
24
22
|
- `npm run test`: execute test files on browsers(s) and/or Node.js.
|
|
25
23
|
- `npm run build`: generate files optimized for production.
|
|
26
24
|
|
|
27
25
|
> **Info**
|
|
28
|
-
> Executing "npm install" in web demos can take time.
|
|
26
|
+
> Executing "npm install" in web demos can take time.
|
|
27
|
+
> It is because in these demos tests are runned in headless browsers that needs to be installed first.
|
|
29
28
|
|
|
30
29
|
See also [packages/create-jsenv](./packages/create-jsenv).
|
|
31
30
|
|
package/src/build/build.js
CHANGED
|
@@ -102,7 +102,7 @@ export const build = async ({
|
|
|
102
102
|
sourcemaps = false,
|
|
103
103
|
sourcemapsSourcesContent,
|
|
104
104
|
urlAnalysis = {},
|
|
105
|
-
nodeEsmResolution,
|
|
105
|
+
nodeEsmResolution = true,
|
|
106
106
|
fileSystemMagicResolution,
|
|
107
107
|
directoryReferenceAllowed,
|
|
108
108
|
transpilation = {},
|
|
@@ -417,8 +417,6 @@ build ${entryPointKeys.length} entry points`)
|
|
|
417
417
|
})
|
|
418
418
|
const postBuildRedirections = {}
|
|
419
419
|
const finalGraph = createUrlGraph()
|
|
420
|
-
const optimizeUrlContentHooks =
|
|
421
|
-
rawGraphKitchen.pluginController.addHook("optimizeUrlContent")
|
|
422
420
|
const finalGraphKitchen = createKitchen({
|
|
423
421
|
logger,
|
|
424
422
|
rootDirectoryUrl,
|
|
@@ -694,19 +692,17 @@ build ${entryPointKeys.length} entry points`)
|
|
|
694
692
|
name: "jsenv:optimize",
|
|
695
693
|
appliesDuring: "build",
|
|
696
694
|
finalizeUrlContent: async (urlInfo, context) => {
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
)
|
|
709
|
-
}
|
|
695
|
+
await rawGraphKitchen.pluginController.callAsyncHooks(
|
|
696
|
+
"optimizeUrlContent",
|
|
697
|
+
urlInfo,
|
|
698
|
+
context,
|
|
699
|
+
async (optimizeReturnValue) => {
|
|
700
|
+
await finalGraphKitchen.urlInfoTransformer.applyFinalTransformations(
|
|
701
|
+
urlInfo,
|
|
702
|
+
optimizeReturnValue,
|
|
703
|
+
)
|
|
704
|
+
},
|
|
705
|
+
)
|
|
710
706
|
},
|
|
711
707
|
},
|
|
712
708
|
],
|
|
@@ -17,12 +17,9 @@ import { parentPort } from "node:worker_threads"
|
|
|
17
17
|
import {
|
|
18
18
|
jsenvAccessControlAllowedHeaders,
|
|
19
19
|
startServer,
|
|
20
|
-
pluginServerTiming,
|
|
21
|
-
pluginRequestWaitingCheck,
|
|
22
|
-
pluginCORS,
|
|
23
20
|
fetchFileSystem,
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
jsenvServiceCORS,
|
|
22
|
+
jsenvServiceErrorHandler,
|
|
26
23
|
} from "@jsenv/server"
|
|
27
24
|
import {
|
|
28
25
|
assertAndNormalizeDirectoryUrl,
|
|
@@ -43,10 +40,10 @@ export const startBuildServer = async ({
|
|
|
43
40
|
http2,
|
|
44
41
|
certificate,
|
|
45
42
|
privateKey,
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
acceptAnyIp,
|
|
44
|
+
host,
|
|
48
45
|
port = 9779,
|
|
49
|
-
services =
|
|
46
|
+
services = [],
|
|
50
47
|
keepProcessAlive = true,
|
|
51
48
|
|
|
52
49
|
rootDirectoryUrl,
|
|
@@ -94,9 +91,6 @@ export const startBuildServer = async ({
|
|
|
94
91
|
)
|
|
95
92
|
})
|
|
96
93
|
}
|
|
97
|
-
if (port === 0) {
|
|
98
|
-
port = await findFreePort(port, { signal: operation.signal })
|
|
99
|
-
}
|
|
100
94
|
|
|
101
95
|
let reloadableWorker
|
|
102
96
|
if (buildServerAutoreload) {
|
|
@@ -137,12 +131,12 @@ export const startBuildServer = async ({
|
|
|
137
131
|
const messagePromise = new Promise((resolve) => {
|
|
138
132
|
worker.once("message", resolve)
|
|
139
133
|
})
|
|
140
|
-
await messagePromise
|
|
134
|
+
const origin = await messagePromise
|
|
141
135
|
// if (!keepProcessAlive) {
|
|
142
136
|
// worker.unref()
|
|
143
137
|
// }
|
|
144
138
|
return {
|
|
145
|
-
origin
|
|
139
|
+
origin,
|
|
146
140
|
stop: () => {
|
|
147
141
|
stopWatchingBuildServerFiles()
|
|
148
142
|
reloadableWorker.terminate()
|
|
@@ -168,30 +162,32 @@ export const startBuildServer = async ({
|
|
|
168
162
|
http2,
|
|
169
163
|
certificate,
|
|
170
164
|
privateKey,
|
|
171
|
-
|
|
172
|
-
|
|
165
|
+
acceptAnyIp,
|
|
166
|
+
host,
|
|
173
167
|
port,
|
|
174
|
-
|
|
175
|
-
|
|
168
|
+
serverTiming: true,
|
|
169
|
+
requestWaitingMs: 60_000,
|
|
170
|
+
services: [
|
|
171
|
+
jsenvServiceCORS({
|
|
176
172
|
accessControlAllowRequestOrigin: true,
|
|
177
173
|
accessControlAllowRequestMethod: true,
|
|
178
174
|
accessControlAllowRequestHeaders: true,
|
|
179
175
|
accessControlAllowedRequestHeaders: jsenvAccessControlAllowedHeaders,
|
|
180
176
|
accessControlAllowCredentials: true,
|
|
177
|
+
timingAllowOrigin: true,
|
|
181
178
|
}),
|
|
182
|
-
...pluginServerTiming(),
|
|
183
|
-
...pluginRequestWaitingCheck({
|
|
184
|
-
requestWaitingMs: 60 * 1000,
|
|
185
|
-
}),
|
|
186
|
-
},
|
|
187
|
-
sendErrorDetails: true,
|
|
188
|
-
requestToResponse: composeServices({
|
|
189
179
|
...services,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
180
|
+
{
|
|
181
|
+
name: "jsenv:build_files_service",
|
|
182
|
+
handleRequest: createBuildFilesService({
|
|
183
|
+
buildDirectoryUrl,
|
|
184
|
+
buildIndexPath,
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
jsenvServiceErrorHandler({
|
|
188
|
+
sendErrorDetails: true,
|
|
193
189
|
}),
|
|
194
|
-
|
|
190
|
+
],
|
|
195
191
|
})
|
|
196
192
|
startBuildServerTask.done()
|
|
197
193
|
logger.info(``)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { parentPort } from "node:worker_threads"
|
|
2
|
-
import { findFreePort } from "@jsenv/server"
|
|
3
2
|
import {
|
|
4
3
|
assertAndNormalizeDirectoryUrl,
|
|
5
4
|
registerDirectoryLifecycle,
|
|
@@ -9,29 +8,24 @@ import { createLogger, loggerToLevels, createTaskLog } from "@jsenv/log"
|
|
|
9
8
|
import { getCallerPosition } from "@jsenv/urls"
|
|
10
9
|
|
|
11
10
|
import { createReloadableWorker } from "@jsenv/core/src/helpers/worker_reload.js"
|
|
12
|
-
import { getCorePlugins } from "@jsenv/core/src/plugins/plugins.js"
|
|
13
|
-
import { createUrlGraph } from "@jsenv/core/src/omega/url_graph.js"
|
|
14
|
-
import { createKitchen } from "@jsenv/core/src/omega/kitchen.js"
|
|
15
11
|
import { startOmegaServer } from "@jsenv/core/src/omega/omega_server.js"
|
|
16
12
|
|
|
17
|
-
import { jsenvPluginExplorer } from "./plugins/explorer/jsenv_plugin_explorer.js"
|
|
18
|
-
// import { jsenvPluginToolbar } from "./plugins/toolbar/jsenv_plugin_toolbar.js"
|
|
19
|
-
|
|
20
13
|
export const startDevServer = async ({
|
|
21
14
|
signal = new AbortController().signal,
|
|
22
15
|
handleSIGINT = true,
|
|
23
16
|
logLevel = "info",
|
|
24
17
|
omegaServerLogLevel = "warn",
|
|
25
|
-
port = 3456,
|
|
26
18
|
protocol = "http",
|
|
27
|
-
listenAnyIp,
|
|
28
19
|
// it's better to use http1 by default because it allows to get statusText in devtools
|
|
29
20
|
// which gives valuable information when there is errors
|
|
30
21
|
http2 = false,
|
|
31
22
|
certificate,
|
|
32
23
|
privateKey,
|
|
24
|
+
host,
|
|
25
|
+
port = 3456,
|
|
26
|
+
acceptAnyIp,
|
|
33
27
|
keepProcessAlive = true,
|
|
34
|
-
|
|
28
|
+
services,
|
|
35
29
|
|
|
36
30
|
rootDirectoryUrl,
|
|
37
31
|
clientFiles = {
|
|
@@ -47,7 +41,6 @@ export const startDevServer = async ({
|
|
|
47
41
|
devServerMainFile = getCallerPosition().url,
|
|
48
42
|
cooldownBetweenFileEvents,
|
|
49
43
|
|
|
50
|
-
sourcemaps = "inline",
|
|
51
44
|
// default runtimeCompat assume dev server will be request by recent browsers
|
|
52
45
|
// Used by "jsenv_plugin_node_runtime.js" to deactivate itself
|
|
53
46
|
// If dev server can be requested by Node.js to exec files
|
|
@@ -64,16 +57,19 @@ export const startDevServer = async ({
|
|
|
64
57
|
nodeEsmResolution,
|
|
65
58
|
fileSystemMagicResolution,
|
|
66
59
|
transpilation,
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
60
|
+
explorer = {
|
|
61
|
+
groups: {
|
|
62
|
+
src: {
|
|
63
|
+
"./src/**/*.html": true,
|
|
64
|
+
},
|
|
65
|
+
tests: {
|
|
66
|
+
"./tests/**/*.test.html": true,
|
|
67
|
+
},
|
|
74
68
|
},
|
|
75
69
|
},
|
|
76
70
|
// toolbar = false,
|
|
71
|
+
|
|
72
|
+
sourcemaps = "inline",
|
|
77
73
|
writeGeneratedFiles = true,
|
|
78
74
|
}) => {
|
|
79
75
|
const logger = createLogger({ logLevel })
|
|
@@ -90,9 +86,6 @@ export const startDevServer = async ({
|
|
|
90
86
|
)
|
|
91
87
|
})
|
|
92
88
|
}
|
|
93
|
-
if (port === 0) {
|
|
94
|
-
port = await findFreePort(port, { signal: operation.signal })
|
|
95
|
-
}
|
|
96
89
|
|
|
97
90
|
let reloadableWorker
|
|
98
91
|
if (devServerAutoreload) {
|
|
@@ -134,12 +127,12 @@ export const startDevServer = async ({
|
|
|
134
127
|
const messagePromise = new Promise((resolve) => {
|
|
135
128
|
worker.once("message", resolve)
|
|
136
129
|
})
|
|
137
|
-
await messagePromise
|
|
130
|
+
const origin = await messagePromise
|
|
138
131
|
// if (!keepProcessAlive) {
|
|
139
132
|
// worker.unref()
|
|
140
133
|
// }
|
|
141
134
|
return {
|
|
142
|
-
origin
|
|
135
|
+
origin,
|
|
143
136
|
stop: () => {
|
|
144
137
|
stopWatchingDevServerFiles()
|
|
145
138
|
reloadableWorker.terminate()
|
|
@@ -152,82 +145,33 @@ export const startDevServer = async ({
|
|
|
152
145
|
disabled: !loggerToLevels(logger).info,
|
|
153
146
|
})
|
|
154
147
|
|
|
155
|
-
const clientFileChangeCallbackList = []
|
|
156
|
-
const clientFilesPruneCallbackList = []
|
|
157
|
-
const clientFileChangeCallback = ({ relativeUrl, event }) => {
|
|
158
|
-
const url = new URL(relativeUrl, rootDirectoryUrl).href
|
|
159
|
-
clientFileChangeCallbackList.forEach((callback) => {
|
|
160
|
-
callback({ url, event })
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
const stopWatchingClientFiles = registerDirectoryLifecycle(rootDirectoryUrl, {
|
|
164
|
-
watchPatterns: {
|
|
165
|
-
...clientFiles,
|
|
166
|
-
".jsenv/": false,
|
|
167
|
-
},
|
|
168
|
-
cooldownBetweenFileEvents,
|
|
169
|
-
keepProcessAlive: false,
|
|
170
|
-
recursive: true,
|
|
171
|
-
added: ({ relativeUrl }) => {
|
|
172
|
-
clientFileChangeCallback({ event: "added", relativeUrl })
|
|
173
|
-
},
|
|
174
|
-
updated: ({ relativeUrl }) => {
|
|
175
|
-
clientFileChangeCallback({ event: "modified", relativeUrl })
|
|
176
|
-
},
|
|
177
|
-
removed: ({ relativeUrl }) => {
|
|
178
|
-
clientFileChangeCallback({ event: "removed", relativeUrl })
|
|
179
|
-
},
|
|
180
|
-
})
|
|
181
|
-
const urlGraph = createUrlGraph({
|
|
182
|
-
clientFileChangeCallbackList,
|
|
183
|
-
clientFilesPruneCallbackList,
|
|
184
|
-
})
|
|
185
|
-
const kitchen = createKitchen({
|
|
186
|
-
signal,
|
|
187
|
-
logger,
|
|
188
|
-
rootDirectoryUrl,
|
|
189
|
-
urlGraph,
|
|
190
|
-
scenario: "dev",
|
|
191
|
-
runtimeCompat,
|
|
192
|
-
sourcemaps,
|
|
193
|
-
writeGeneratedFiles,
|
|
194
|
-
plugins: [
|
|
195
|
-
...plugins,
|
|
196
|
-
...getCorePlugins({
|
|
197
|
-
rootDirectoryUrl,
|
|
198
|
-
urlGraph,
|
|
199
|
-
scenario: "dev",
|
|
200
|
-
runtimeCompat,
|
|
201
|
-
|
|
202
|
-
urlAnalysis,
|
|
203
|
-
htmlSupervisor,
|
|
204
|
-
nodeEsmResolution,
|
|
205
|
-
fileSystemMagicResolution,
|
|
206
|
-
transpilation,
|
|
207
|
-
clientAutoreload,
|
|
208
|
-
clientFileChangeCallbackList,
|
|
209
|
-
clientFilesPruneCallbackList,
|
|
210
|
-
}),
|
|
211
|
-
jsenvPluginExplorer({
|
|
212
|
-
groups: explorerGroups,
|
|
213
|
-
}),
|
|
214
|
-
// ...(toolbar ? [jsenvPluginToolbar(toolbar)] : []),
|
|
215
|
-
],
|
|
216
|
-
})
|
|
217
148
|
const server = await startOmegaServer({
|
|
218
149
|
logLevel: omegaServerLogLevel,
|
|
219
150
|
keepProcessAlive,
|
|
220
|
-
|
|
221
|
-
port,
|
|
151
|
+
acceptAnyIp,
|
|
222
152
|
protocol,
|
|
223
153
|
http2,
|
|
224
154
|
certificate,
|
|
225
155
|
privateKey,
|
|
156
|
+
host,
|
|
157
|
+
port,
|
|
158
|
+
services,
|
|
159
|
+
|
|
226
160
|
rootDirectoryUrl,
|
|
227
|
-
urlGraph,
|
|
228
|
-
kitchen,
|
|
229
161
|
scenario: "dev",
|
|
230
|
-
|
|
162
|
+
runtimeCompat,
|
|
163
|
+
plugins,
|
|
164
|
+
urlAnalysis,
|
|
165
|
+
htmlSupervisor,
|
|
166
|
+
nodeEsmResolution,
|
|
167
|
+
fileSystemMagicResolution,
|
|
168
|
+
transpilation,
|
|
169
|
+
clientFiles,
|
|
170
|
+
clientAutoreload,
|
|
171
|
+
cooldownBetweenFileEvents,
|
|
172
|
+
explorer,
|
|
173
|
+
sourcemaps,
|
|
174
|
+
writeGeneratedFiles,
|
|
231
175
|
})
|
|
232
176
|
startDevServerTask.done()
|
|
233
177
|
logger.info(``)
|
|
@@ -235,18 +179,12 @@ export const startDevServer = async ({
|
|
|
235
179
|
logger.info(`- ${server.origins[key]}`)
|
|
236
180
|
})
|
|
237
181
|
logger.info(``)
|
|
238
|
-
server.addEffect(() => {
|
|
239
|
-
return () => {
|
|
240
|
-
kitchen.pluginController.callHooks("destroy", {})
|
|
241
|
-
}
|
|
242
|
-
})
|
|
243
182
|
if (reloadableWorker && reloadableWorker.isWorker) {
|
|
244
183
|
parentPort.postMessage(server.origin)
|
|
245
184
|
}
|
|
246
185
|
return {
|
|
247
186
|
origin: server.origin,
|
|
248
187
|
stop: () => {
|
|
249
|
-
stopWatchingClientFiles()
|
|
250
188
|
server.stop()
|
|
251
189
|
},
|
|
252
190
|
}
|
package/src/execute/execute.js
CHANGED
|
@@ -2,11 +2,8 @@ import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
|
|
|
2
2
|
|
|
3
3
|
import { assertAndNormalizeDirectoryUrl } from "@jsenv/filesystem"
|
|
4
4
|
import { createLogger } from "@jsenv/log"
|
|
5
|
-
import { getCorePlugins } from "@jsenv/core/src/plugins/plugins.js"
|
|
6
|
-
import { createUrlGraph } from "@jsenv/core/src/omega/url_graph.js"
|
|
7
|
-
import { createKitchen } from "@jsenv/core/src/omega/kitchen.js"
|
|
8
|
-
import { startOmegaServer } from "@jsenv/core/src/omega/omega_server.js"
|
|
9
5
|
|
|
6
|
+
import { startOmegaServer } from "@jsenv/core/src/omega/omega_server.js"
|
|
10
7
|
import { run } from "./run.js"
|
|
11
8
|
|
|
12
9
|
export const execute = async ({
|
|
@@ -19,6 +16,7 @@ export const execute = async ({
|
|
|
19
16
|
allocatedMs,
|
|
20
17
|
mirrorConsole = true,
|
|
21
18
|
keepRunning = false,
|
|
19
|
+
services,
|
|
22
20
|
collectConsole,
|
|
23
21
|
collectCoverage,
|
|
24
22
|
coverageTempDirectoryUrl,
|
|
@@ -27,12 +25,12 @@ export const execute = async ({
|
|
|
27
25
|
runtimeParams,
|
|
28
26
|
|
|
29
27
|
scenario = "dev",
|
|
30
|
-
sourcemaps = "inline",
|
|
31
28
|
plugins = [],
|
|
32
29
|
nodeEsmResolution,
|
|
33
30
|
fileSystemMagicResolution,
|
|
34
31
|
transpilation,
|
|
35
32
|
htmlSupervisor = true,
|
|
33
|
+
sourcemaps = "inline",
|
|
36
34
|
writeGeneratedFiles = false,
|
|
37
35
|
|
|
38
36
|
port,
|
|
@@ -65,45 +63,29 @@ export const execute = async ({
|
|
|
65
63
|
...runtimeParams,
|
|
66
64
|
}
|
|
67
65
|
if (runtime.needsServer) {
|
|
68
|
-
const urlGraph = createUrlGraph()
|
|
69
|
-
const runtimeCompat = { [runtime.name]: runtime.version }
|
|
70
|
-
const kitchen = createKitchen({
|
|
71
|
-
signal,
|
|
72
|
-
logger,
|
|
73
|
-
rootDirectoryUrl,
|
|
74
|
-
urlGraph,
|
|
75
|
-
scenario,
|
|
76
|
-
sourcemaps,
|
|
77
|
-
runtimeCompat,
|
|
78
|
-
writeGeneratedFiles,
|
|
79
|
-
plugins: [
|
|
80
|
-
...plugins,
|
|
81
|
-
...getCorePlugins({
|
|
82
|
-
rootDirectoryUrl,
|
|
83
|
-
urlGraph,
|
|
84
|
-
scenario,
|
|
85
|
-
runtimeCompat,
|
|
86
|
-
|
|
87
|
-
htmlSupervisor,
|
|
88
|
-
nodeEsmResolution,
|
|
89
|
-
fileSystemMagicResolution,
|
|
90
|
-
transpilation,
|
|
91
|
-
}),
|
|
92
|
-
],
|
|
93
|
-
})
|
|
94
66
|
const server = await startOmegaServer({
|
|
95
67
|
signal: executeOperation.signal,
|
|
96
68
|
logLevel: "warn",
|
|
97
|
-
rootDirectoryUrl,
|
|
98
|
-
urlGraph,
|
|
99
|
-
kitchen,
|
|
100
|
-
scenario,
|
|
101
69
|
keepProcessAlive: false,
|
|
70
|
+
services,
|
|
102
71
|
port,
|
|
103
72
|
protocol,
|
|
104
73
|
http2,
|
|
105
74
|
certificate,
|
|
106
75
|
privateKey,
|
|
76
|
+
|
|
77
|
+
rootDirectoryUrl,
|
|
78
|
+
scenario,
|
|
79
|
+
runtimeCompat: { [runtime.name]: runtime.version },
|
|
80
|
+
|
|
81
|
+
plugins,
|
|
82
|
+
|
|
83
|
+
htmlSupervisor,
|
|
84
|
+
nodeEsmResolution,
|
|
85
|
+
fileSystemMagicResolution,
|
|
86
|
+
transpilation,
|
|
87
|
+
sourcemaps,
|
|
88
|
+
writeGeneratedFiles,
|
|
107
89
|
})
|
|
108
90
|
executeOperation.addEndCallback(async () => {
|
|
109
91
|
await server.stop("execution done")
|
package/src/omega/errors.js
CHANGED
|
@@ -59,10 +59,11 @@ export const createFetchUrlContentError = ({
|
|
|
59
59
|
fetchError.name = "FETCH_URL_CONTENT_ERROR"
|
|
60
60
|
fetchError.code = code
|
|
61
61
|
fetchError.reason = reason
|
|
62
|
-
fetchError.url =
|
|
63
|
-
fetchError.
|
|
64
|
-
fetchError.
|
|
65
|
-
fetchError.
|
|
62
|
+
fetchError.url = urlInfo.url
|
|
63
|
+
fetchError.traceUrl = reference.trace.url
|
|
64
|
+
fetchError.traceLine = reference.trace.line
|
|
65
|
+
fetchError.traceColumn = reference.trace.column
|
|
66
|
+
fetchError.traceMessage = reference.trace.message
|
|
66
67
|
return fetchError
|
|
67
68
|
}
|
|
68
69
|
|
|
@@ -116,29 +117,30 @@ export const createTransformUrlContentError = ({
|
|
|
116
117
|
transformError.name = "TRANSFORM_URL_CONTENT_ERROR"
|
|
117
118
|
transformError.code = code
|
|
118
119
|
transformError.reason = reason
|
|
119
|
-
transformError.url = reference.trace.url
|
|
120
|
-
transformError.line = reference.trace.line
|
|
121
|
-
transformError.column = reference.trace.column
|
|
122
120
|
transformError.stack = error.stack
|
|
123
|
-
transformError.
|
|
121
|
+
transformError.url = urlInfo.url
|
|
122
|
+
transformError.traceUrl = reference.trace.url
|
|
123
|
+
transformError.traceLine = reference.trace.line
|
|
124
|
+
transformError.traceColumn = reference.trace.column
|
|
125
|
+
transformError.traceMessage = reference.trace.message
|
|
124
126
|
if (code === "PARSE_ERROR") {
|
|
125
127
|
transformError.reason = error.message
|
|
126
128
|
if (urlInfo.isInline) {
|
|
127
|
-
transformError.
|
|
128
|
-
transformError.
|
|
129
|
-
transformError.
|
|
129
|
+
transformError.traceLine = reference.trace.line + error.line - 1
|
|
130
|
+
transformError.traceColumn = reference.trace.column + error.column
|
|
131
|
+
transformError.traceMessage = stringifyUrlSite({
|
|
130
132
|
url: urlInfo.inlineUrlSite.url,
|
|
131
|
-
line: transformError.
|
|
132
|
-
column: transformError.
|
|
133
|
+
line: transformError.traceLine,
|
|
134
|
+
column: transformError.traceColumn,
|
|
133
135
|
content: urlInfo.inlineUrlSite.content,
|
|
134
136
|
})
|
|
135
137
|
} else {
|
|
136
|
-
transformError.
|
|
137
|
-
transformError.
|
|
138
|
-
transformError.
|
|
138
|
+
transformError.traceLine = error.line
|
|
139
|
+
transformError.traceColumn = error.column
|
|
140
|
+
transformError.traceMessage = stringifyUrlSite({
|
|
139
141
|
url: urlInfo.url,
|
|
140
|
-
line:
|
|
141
|
-
column:
|
|
142
|
+
line: error.line - 1,
|
|
143
|
+
column: error.column,
|
|
142
144
|
content: urlInfo.content,
|
|
143
145
|
})
|
|
144
146
|
}
|
package/src/omega/kitchen.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
setUrlFilename,
|
|
8
8
|
} from "@jsenv/urls"
|
|
9
9
|
import { writeFileSync, ensureWindowsDriveLetter } from "@jsenv/filesystem"
|
|
10
|
-
import { createDetailedMessage } from "@jsenv/log"
|
|
10
|
+
import { createLogger, createDetailedMessage } from "@jsenv/log"
|
|
11
11
|
import { CONTENT_TYPE } from "@jsenv/utils/src/content_type/content_type.js"
|
|
12
12
|
|
|
13
13
|
import { createPluginController } from "../plugins/plugin_controller.js"
|
|
@@ -25,12 +25,13 @@ import { isWebWorkerEntryPointReference } from "./web_workers.js"
|
|
|
25
25
|
|
|
26
26
|
export const createKitchen = ({
|
|
27
27
|
signal,
|
|
28
|
-
|
|
28
|
+
logLevel,
|
|
29
|
+
|
|
29
30
|
rootDirectoryUrl,
|
|
31
|
+
scenario,
|
|
32
|
+
runtimeCompat,
|
|
30
33
|
urlGraph,
|
|
31
|
-
|
|
32
34
|
plugins,
|
|
33
|
-
scenario,
|
|
34
35
|
sourcemaps = {
|
|
35
36
|
dev: "inline", // "programmatic" and "file" also allowed
|
|
36
37
|
test: "inline",
|
|
@@ -44,9 +45,9 @@ export const createKitchen = ({
|
|
|
44
45
|
build: true,
|
|
45
46
|
}[scenario],
|
|
46
47
|
sourcemapsRelativeSources,
|
|
47
|
-
runtimeCompat,
|
|
48
48
|
writeGeneratedFiles,
|
|
49
49
|
}) => {
|
|
50
|
+
const logger = createLogger({ logLevel })
|
|
50
51
|
const pluginController = createPluginController({
|
|
51
52
|
plugins,
|
|
52
53
|
scenario,
|
|
@@ -56,13 +57,13 @@ export const createKitchen = ({
|
|
|
56
57
|
signal,
|
|
57
58
|
logger,
|
|
58
59
|
rootDirectoryUrl,
|
|
59
|
-
sourcemaps,
|
|
60
60
|
urlGraph,
|
|
61
61
|
scenario,
|
|
62
62
|
runtimeCompat,
|
|
63
63
|
isSupportedOnFutureClients: (feature) => {
|
|
64
64
|
return RUNTIME_COMPAT.isSupported(runtimeCompat, feature)
|
|
65
65
|
},
|
|
66
|
+
sourcemaps,
|
|
66
67
|
}
|
|
67
68
|
pluginController.callHooks("init", kitchenContext)
|
|
68
69
|
const createReference = ({
|