@jsenv/core 23.1.3 → 23.2.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/jsenv_browser_system.js +36 -99
- package/dist/jsenv_browser_system.js.map +12 -21
- package/dist/jsenv_compile_proxy.js +18 -82
- package/dist/jsenv_compile_proxy.js.map +11 -21
- package/dist/jsenv_exploring_index.js +127 -274
- package/dist/jsenv_exploring_index.js.map +76 -90
- package/dist/jsenv_exploring_redirector.js +21 -89
- package/dist/jsenv_exploring_redirector.js.map +13 -25
- package/dist/jsenv_toolbar.js +81 -149
- package/dist/jsenv_toolbar.js.map +50 -61
- package/dist/jsenv_toolbar_injector.js +185 -231
- package/dist/jsenv_toolbar_injector.js.map +30 -42
- package/package.json +8 -9
- package/src/abort/abortable.js +172 -0
- package/src/abort/callback_list.js +64 -0
- package/src/abort/callback_race.js +34 -0
- package/src/abort/cleaner.js +22 -0
- package/src/abort/main.js +32 -0
- package/src/abort/process_teardown_events.js +59 -0
- package/src/buildProject.js +132 -123
- package/src/execute.js +108 -107
- package/src/executeTestPlan.js +107 -125
- package/src/importUsingChildProcess.js +2 -1
- package/src/internal/browser-launcher/executeHtmlFile.js +33 -12
- package/src/internal/browser-utils/fetch-browser.js +4 -29
- package/src/internal/browser-utils/fetchUsingXHR.js +5 -7
- package/src/internal/building/buildUsingRollup.js +60 -24
- package/src/internal/building/createJsenvRollupPlugin.js +13 -31
- package/src/internal/building/ressource_builder.js +3 -6
- package/src/internal/building/sourcemap_loader.js +4 -5
- package/src/internal/building/url_fetcher.js +2 -5
- package/src/internal/building/url_loader.js +3 -6
- package/src/internal/compiling/compileFile.js +1 -2
- package/src/internal/compiling/createCompiledFileService.js +8 -9
- package/src/internal/compiling/startCompileServer.js +74 -135
- package/src/internal/executing/coverage/generateCoverageJsonFile.js +20 -3
- package/src/internal/executing/coverage/relativeUrlToEmptyCoverage.js +19 -30
- package/src/internal/executing/coverage/reportToCoverage.js +44 -24
- package/src/internal/executing/coverage/v8CoverageFromNodeV8Directory.js +2 -15
- package/src/internal/executing/createSummaryLog.js +50 -37
- package/src/internal/executing/executeConcurrently.js +89 -47
- package/src/internal/executing/executePlan.js +33 -7
- package/src/internal/executing/executionLogs.js +25 -28
- package/src/internal/executing/execution_colors.js +15 -0
- package/src/internal/executing/generateExecutionSteps.js +3 -2
- package/src/internal/executing/launchAndExecute.js +217 -261
- package/src/internal/exploring/fetchExploringJson.js +3 -4
- package/src/internal/fetchUrl.js +6 -2
- package/src/internal/logs/log_style.js +16 -28
- package/src/internal/logs/msAsDuration.js +1 -1
- package/src/internal/node-launcher/createChildProcessOptions.js +4 -5
- package/src/internal/node-launcher/createControllableNodeProcess.js +117 -229
- package/src/internal/node-launcher/kill_process_tree.js +76 -0
- package/src/internal/node-launcher/nodeControllableFile.mjs +16 -10
- package/src/internal/{promise_track_race.js → promise_race.js} +2 -2
- package/src/internal/runtime/s.js +25 -24
- package/src/internal/toolbar/toolbar.html +157 -61
- package/src/internal/toolbar/toolbar.injector.js +8 -0
- package/src/internal/toolbar/util/animation.js +3 -7
- package/src/internal/toolbar/util/fetching.js +1 -30
- package/src/jsenvServiceWorkerFinalizer.js +1 -2
- package/src/launchBrowser.js +131 -127
- package/src/launchNode.js +29 -17
- package/src/playwright_browser_versions.js +3 -3
- package/src/requireUsingChildProcess.js +2 -1
- package/src/signal/signal.js +65 -0
- package/src/startExploring.js +70 -72
- package/src/internal/executeJsenvAsyncFunction.js +0 -34
- package/src/internal/toolbar/animation/toolbar-movie-icon.svg +0 -15
- package/src/internal/toolbar/compilation/flask.svg +0 -7
- package/src/internal/toolbar/compilation/info.svg +0 -9
- package/src/internal/toolbar/compilation/loupe.svg +0 -11
- package/src/internal/toolbar/compilation/toolbar_compilation.svg +0 -11
- package/src/internal/toolbar/eventsource/toolbar-power-icon.svg +0 -10
- package/src/internal/toolbar/eventsource/toolbar-power-off-icon.svg +0 -10
- package/src/internal/toolbar/responsive/toolbar-dots-icon.svg +0 -10
- package/src/internal/toolbar/settings/toolbar-settings-icon.svg +0 -9
- package/src/internal/toolbar/theme/toolbar-palette-icon.svg +0 -10
- package/src/internal/toolbar/toolbar-cross-icon.svg +0 -10
- package/src/internal/toolbar/toolbar-loading-icon.svg +0 -102
- package/src/internal/toolbar/toolbar-notif-icon.svg +0 -9
- package/src/internal/trackRessources.js +0 -23
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
urlToExtension,
|
|
6
6
|
} from "@jsenv/filesystem"
|
|
7
7
|
|
|
8
|
+
import { Abortable } from "@jsenv/core/src/abort/main.js"
|
|
8
9
|
import { jsenvCompileProxyHtmlFileInfo } from "@jsenv/core/src/internal/jsenvInternalFiles.js"
|
|
9
10
|
import { v8CoverageFromAllV8Coverages } from "@jsenv/core/src/internal/executing/coverage/v8CoverageFromAllV8Coverages.js"
|
|
10
11
|
import { composeIstanbulCoverages } from "@jsenv/core/src/internal/executing/coverage/composeIstanbulCoverages.js"
|
|
@@ -14,7 +15,7 @@ import { escapeRegexpSpecialCharacters } from "../escapeRegexpSpecialCharacters.
|
|
|
14
15
|
export const executeHtmlFile = async (
|
|
15
16
|
fileRelativeUrl,
|
|
16
17
|
{
|
|
17
|
-
|
|
18
|
+
launchBrowserOperation,
|
|
18
19
|
projectDirectoryUrl,
|
|
19
20
|
compileServerOrigin,
|
|
20
21
|
outDirectoryRelativeUrl,
|
|
@@ -26,6 +27,7 @@ export const executeHtmlFile = async (
|
|
|
26
27
|
coverageConfig,
|
|
27
28
|
coverageForceIstanbul,
|
|
28
29
|
coveragePlaywrightAPIAvailable,
|
|
30
|
+
transformErrorHook,
|
|
29
31
|
},
|
|
30
32
|
) => {
|
|
31
33
|
const fileUrl = resolveUrl(fileRelativeUrl, projectDirectoryUrl)
|
|
@@ -45,11 +47,13 @@ export const executeHtmlFile = async (
|
|
|
45
47
|
compileProxyProjectRelativeUrl,
|
|
46
48
|
compileServerOrigin,
|
|
47
49
|
)
|
|
50
|
+
Abortable.throwIfAborted(launchBrowserOperation)
|
|
48
51
|
await page.goto(compileProxyClientUrl)
|
|
49
52
|
|
|
50
53
|
const coverageHandledFromOutside =
|
|
51
54
|
coveragePlaywrightAPIAvailable && !coverageForceIstanbul
|
|
52
55
|
|
|
56
|
+
Abortable.throwIfAborted(launchBrowserOperation)
|
|
53
57
|
const browserRuntimeFeaturesReport = await page.evaluate(
|
|
54
58
|
/* istanbul ignore next */
|
|
55
59
|
({ coverageHandledFromOutside }) => {
|
|
@@ -65,6 +69,7 @@ export const executeHtmlFile = async (
|
|
|
65
69
|
try {
|
|
66
70
|
let executionResult
|
|
67
71
|
const { canAvoidCompilation, compileId } = browserRuntimeFeaturesReport
|
|
72
|
+
Abortable.throwIfAborted(launchBrowserOperation)
|
|
68
73
|
if (canAvoidCompilation) {
|
|
69
74
|
executionResult = await executeSource({
|
|
70
75
|
projectDirectoryUrl,
|
|
@@ -73,6 +78,7 @@ export const executeHtmlFile = async (
|
|
|
73
78
|
page,
|
|
74
79
|
collectCoverage,
|
|
75
80
|
coverageConfig,
|
|
81
|
+
transformErrorHook,
|
|
76
82
|
})
|
|
77
83
|
} else {
|
|
78
84
|
executionResult = await executeCompiledVersion({
|
|
@@ -83,6 +89,7 @@ export const executeHtmlFile = async (
|
|
|
83
89
|
outDirectoryRelativeUrl,
|
|
84
90
|
compileId,
|
|
85
91
|
collectCoverage,
|
|
92
|
+
transformErrorHook,
|
|
86
93
|
})
|
|
87
94
|
}
|
|
88
95
|
|
|
@@ -114,19 +121,27 @@ export const executeHtmlFile = async (
|
|
|
114
121
|
}
|
|
115
122
|
|
|
116
123
|
return executionResult
|
|
117
|
-
} catch (
|
|
118
|
-
// if browser is closed due to
|
|
124
|
+
} catch (error) {
|
|
125
|
+
// if browser is closed due to abort
|
|
119
126
|
// before it is able to finish evaluate we can safely ignore
|
|
120
|
-
// and rethrow with current
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
cancellationToken.cancellationRequested
|
|
124
|
-
) {
|
|
125
|
-
cancellationToken.throwIfRequested()
|
|
127
|
+
// and rethrow with current abort error
|
|
128
|
+
if (launchBrowserOperation.signal.aborted && isBrowserClosedError(error)) {
|
|
129
|
+
Abortable.throwIfAborted(launchBrowserOperation)
|
|
126
130
|
}
|
|
131
|
+
throw error
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const isBrowserClosedError = (error) => {
|
|
136
|
+
if (error.message.match(/browserContext.newPage: Browser closed/)) {
|
|
137
|
+
return true
|
|
138
|
+
}
|
|
127
139
|
|
|
128
|
-
|
|
140
|
+
if (error.message.match(/^Protocol error \(.*?\): Target closed/)) {
|
|
141
|
+
return true
|
|
129
142
|
}
|
|
143
|
+
|
|
144
|
+
return false
|
|
130
145
|
}
|
|
131
146
|
|
|
132
147
|
const executeSource = async ({
|
|
@@ -136,6 +151,7 @@ const executeSource = async ({
|
|
|
136
151
|
page,
|
|
137
152
|
collectCoverage,
|
|
138
153
|
coverageConfig,
|
|
154
|
+
transformErrorHook,
|
|
139
155
|
}) => {
|
|
140
156
|
let transformResult = (result) => result
|
|
141
157
|
|
|
@@ -196,6 +212,7 @@ const executeSource = async ({
|
|
|
196
212
|
const error = evalException(exceptionSource, {
|
|
197
213
|
projectDirectoryUrl,
|
|
198
214
|
compileServerOrigin,
|
|
215
|
+
transformErrorHook,
|
|
199
216
|
})
|
|
200
217
|
return transformResult({
|
|
201
218
|
status: "errored",
|
|
@@ -218,6 +235,7 @@ const executeCompiledVersion = async ({
|
|
|
218
235
|
outDirectoryRelativeUrl,
|
|
219
236
|
compileId,
|
|
220
237
|
collectCoverage,
|
|
238
|
+
transformErrorHook,
|
|
221
239
|
}) => {
|
|
222
240
|
let transformResult = (result) => result
|
|
223
241
|
if (collectCoverage) {
|
|
@@ -264,6 +282,7 @@ const executeCompiledVersion = async ({
|
|
|
264
282
|
const error = evalException(exceptionSource, {
|
|
265
283
|
projectDirectoryUrl,
|
|
266
284
|
compileServerOrigin,
|
|
285
|
+
transformErrorHook,
|
|
267
286
|
})
|
|
268
287
|
return transformResult({
|
|
269
288
|
status: "errored",
|
|
@@ -292,9 +311,9 @@ const generateCoverageForPage = (fileExecutionResultMap) => {
|
|
|
292
311
|
|
|
293
312
|
const evalException = (
|
|
294
313
|
exceptionSource,
|
|
295
|
-
{ projectDirectoryUrl, compileServerOrigin },
|
|
314
|
+
{ projectDirectoryUrl, compileServerOrigin, transformErrorHook },
|
|
296
315
|
) => {
|
|
297
|
-
|
|
316
|
+
let error = evalSource(exceptionSource)
|
|
298
317
|
|
|
299
318
|
if (error && error instanceof Error) {
|
|
300
319
|
const remoteRootRegexp = new RegExp(
|
|
@@ -303,6 +322,8 @@ const evalException = (
|
|
|
303
322
|
)
|
|
304
323
|
error.stack = error.stack.replace(remoteRootRegexp, projectDirectoryUrl)
|
|
305
324
|
error.message = error.message.replace(remoteRootRegexp, projectDirectoryUrl)
|
|
325
|
+
|
|
326
|
+
error = transformErrorHook(error)
|
|
306
327
|
}
|
|
307
328
|
|
|
308
329
|
return error
|
|
@@ -1,36 +1,11 @@
|
|
|
1
|
-
import { createCancellationToken } from "@jsenv/cancellation/main.browser.js"
|
|
2
1
|
import { fetchUsingXHR } from "./fetchUsingXHR.js"
|
|
3
2
|
|
|
4
|
-
const fetchNative = async (
|
|
5
|
-
url,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
mode = "cors",
|
|
9
|
-
...options
|
|
10
|
-
} = {},
|
|
11
|
-
) => {
|
|
12
|
-
const abortController = new AbortController()
|
|
13
|
-
|
|
14
|
-
let cancelError
|
|
15
|
-
cancellationToken.register((reason) => {
|
|
16
|
-
cancelError = reason
|
|
17
|
-
abortController.abort(reason)
|
|
3
|
+
const fetchNative = async (url, { mode = "cors", ...options } = {}) => {
|
|
4
|
+
const response = await window.fetch(url, {
|
|
5
|
+
mode,
|
|
6
|
+
...options,
|
|
18
7
|
})
|
|
19
8
|
|
|
20
|
-
let response
|
|
21
|
-
try {
|
|
22
|
-
response = await window.fetch(url, {
|
|
23
|
-
signal: abortController.signal,
|
|
24
|
-
mode,
|
|
25
|
-
...options,
|
|
26
|
-
})
|
|
27
|
-
} catch (e) {
|
|
28
|
-
if (cancelError && e.name === "AbortError") {
|
|
29
|
-
throw cancelError
|
|
30
|
-
}
|
|
31
|
-
throw e
|
|
32
|
-
}
|
|
33
|
-
|
|
34
9
|
return {
|
|
35
10
|
url: response.url,
|
|
36
11
|
status: response.status,
|
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import { createCancellationToken } from "@jsenv/cancellation/main.browser.js"
|
|
2
1
|
import { createDetailedMessage } from "@jsenv/logger"
|
|
3
|
-
// ideally we should do some window.fetch detection (ensuring it has cancellation) and accordingly
|
|
4
|
-
// fallback to this polyfill (or even use an existing polyfill would be better)
|
|
5
|
-
// https://github.com/github/fetch/blob/master/fetch.js
|
|
6
2
|
|
|
7
3
|
export const fetchUsingXHR = async (
|
|
8
4
|
url,
|
|
9
5
|
{
|
|
10
|
-
|
|
6
|
+
signal,
|
|
11
7
|
method = "GET",
|
|
12
8
|
credentials = "same-origin",
|
|
13
9
|
headers = {},
|
|
@@ -52,9 +48,11 @@ export const fetchUsingXHR = async (
|
|
|
52
48
|
bodyPromise.resolve()
|
|
53
49
|
}
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
signal.addEventListener("abort", () => {
|
|
56
52
|
xhr.abort()
|
|
57
|
-
|
|
53
|
+
const abortError = new Error("aborted")
|
|
54
|
+
abortError.name = "AbortError"
|
|
55
|
+
failure(abortError)
|
|
58
56
|
})
|
|
59
57
|
|
|
60
58
|
xhr.onreadystatechange = () => {
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { createOperation } from "@jsenv/cancellation"
|
|
2
1
|
import {
|
|
3
2
|
urlToFileSystemPath,
|
|
4
3
|
ensureEmptyDirectory,
|
|
5
4
|
readFile,
|
|
6
5
|
urlToRelativeUrl,
|
|
6
|
+
writeFile,
|
|
7
|
+
resolveUrl,
|
|
7
8
|
} from "@jsenv/filesystem"
|
|
8
9
|
import { createDetailedMessage } from "@jsenv/logger"
|
|
9
10
|
|
|
11
|
+
import { Abortable } from "@jsenv/core/src/abort/main.js"
|
|
10
12
|
import { buildServiceWorker } from "@jsenv/core/src/internal/building/buildServiceWorker.js"
|
|
11
13
|
import { humanizeUrl } from "@jsenv/core/src/internal/building/url_trace.js"
|
|
12
14
|
import {
|
|
@@ -17,7 +19,7 @@ import { createRuntimeCompat } from "@jsenv/core/src/internal/generateGroupMap/r
|
|
|
17
19
|
import { createJsenvRollupPlugin } from "./createJsenvRollupPlugin.js"
|
|
18
20
|
|
|
19
21
|
export const buildUsingRollup = async ({
|
|
20
|
-
|
|
22
|
+
buildOperation,
|
|
21
23
|
logger,
|
|
22
24
|
|
|
23
25
|
projectDirectoryUrl,
|
|
@@ -101,7 +103,7 @@ export const buildUsingRollup = async ({
|
|
|
101
103
|
asOriginalUrl,
|
|
102
104
|
asProjectUrl,
|
|
103
105
|
} = await createJsenvRollupPlugin({
|
|
104
|
-
|
|
106
|
+
buildOperation,
|
|
105
107
|
logger,
|
|
106
108
|
|
|
107
109
|
projectDirectoryUrl,
|
|
@@ -109,9 +111,6 @@ export const buildUsingRollup = async ({
|
|
|
109
111
|
compileServerOrigin,
|
|
110
112
|
compileDirectoryRelativeUrl,
|
|
111
113
|
buildDirectoryUrl,
|
|
112
|
-
assetManifestFile,
|
|
113
|
-
assetManifestFileRelativeUrl,
|
|
114
|
-
writeOnFileSystem,
|
|
115
114
|
|
|
116
115
|
format,
|
|
117
116
|
systemJsUrl,
|
|
@@ -142,7 +141,7 @@ export const buildUsingRollup = async ({
|
|
|
142
141
|
|
|
143
142
|
try {
|
|
144
143
|
await useRollup({
|
|
145
|
-
|
|
144
|
+
buildOperation,
|
|
146
145
|
logger,
|
|
147
146
|
|
|
148
147
|
jsenvRollupPlugin,
|
|
@@ -189,9 +188,41 @@ export const buildUsingRollup = async ({
|
|
|
189
188
|
throw e
|
|
190
189
|
}
|
|
191
190
|
|
|
192
|
-
const
|
|
191
|
+
const {
|
|
192
|
+
rollupBuild,
|
|
193
|
+
urlResponseBodyMap,
|
|
194
|
+
buildMappings,
|
|
195
|
+
buildManifest,
|
|
196
|
+
buildImportMap,
|
|
197
|
+
buildFileContents,
|
|
198
|
+
buildInlineFileContents,
|
|
199
|
+
buildStats,
|
|
200
|
+
} = getResult()
|
|
193
201
|
|
|
194
202
|
if (writeOnFileSystem) {
|
|
203
|
+
if (buildDirectoryClean) {
|
|
204
|
+
await ensureEmptyDirectory(buildDirectoryUrl)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (assetManifestFile) {
|
|
208
|
+
const assetManifestFileUrl = resolveUrl(
|
|
209
|
+
assetManifestFileRelativeUrl,
|
|
210
|
+
buildDirectoryUrl,
|
|
211
|
+
)
|
|
212
|
+
await writeFile(
|
|
213
|
+
assetManifestFileUrl,
|
|
214
|
+
JSON.stringify(buildManifest, null, " "),
|
|
215
|
+
)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const buildRelativeUrls = Object.keys(buildFileContents)
|
|
219
|
+
await Promise.all(
|
|
220
|
+
buildRelativeUrls.map(async (buildRelativeUrl) => {
|
|
221
|
+
const fileBuildUrl = resolveUrl(buildRelativeUrl, buildDirectoryUrl)
|
|
222
|
+
await writeFile(fileBuildUrl, buildFileContents[buildRelativeUrl])
|
|
223
|
+
}),
|
|
224
|
+
)
|
|
225
|
+
|
|
195
226
|
await Promise.all(
|
|
196
227
|
Object.keys(serviceWorkers).map(
|
|
197
228
|
async (serviceWorkerProjectRelativeUrl) => {
|
|
@@ -203,7 +234,9 @@ export const buildUsingRollup = async ({
|
|
|
203
234
|
serviceWorkerProjectRelativeUrl,
|
|
204
235
|
serviceWorkerBuildRelativeUrl,
|
|
205
236
|
serviceWorkerTransformer: (code) =>
|
|
206
|
-
serviceWorkerFinalizer(code,
|
|
237
|
+
serviceWorkerFinalizer(code, {
|
|
238
|
+
buildManifest,
|
|
239
|
+
rollupBuild,
|
|
207
240
|
lineBreakNormalization,
|
|
208
241
|
}),
|
|
209
242
|
|
|
@@ -214,11 +247,20 @@ export const buildUsingRollup = async ({
|
|
|
214
247
|
)
|
|
215
248
|
}
|
|
216
249
|
|
|
217
|
-
return
|
|
250
|
+
return {
|
|
251
|
+
rollupBuild,
|
|
252
|
+
urlResponseBodyMap,
|
|
253
|
+
buildMappings,
|
|
254
|
+
buildManifest,
|
|
255
|
+
buildImportMap,
|
|
256
|
+
buildFileContents,
|
|
257
|
+
buildInlineFileContents,
|
|
258
|
+
buildStats,
|
|
259
|
+
}
|
|
218
260
|
}
|
|
219
261
|
|
|
220
262
|
const useRollup = async ({
|
|
221
|
-
|
|
263
|
+
buildOperation,
|
|
222
264
|
logger,
|
|
223
265
|
jsenvRollupPlugin,
|
|
224
266
|
format,
|
|
@@ -228,9 +270,9 @@ const useRollup = async ({
|
|
|
228
270
|
preserveEntrySignatures,
|
|
229
271
|
// jsConcatenation,
|
|
230
272
|
buildDirectoryUrl,
|
|
231
|
-
buildDirectoryClean,
|
|
232
273
|
asOriginalUrl,
|
|
233
274
|
}) => {
|
|
275
|
+
Abortable.throwIfAborted(buildOperation)
|
|
234
276
|
const { rollup } = await import("rollup")
|
|
235
277
|
const { importAssertions } = await import("acorn-import-assertions")
|
|
236
278
|
|
|
@@ -308,19 +350,13 @@ const useRollup = async ({
|
|
|
308
350
|
: {}),
|
|
309
351
|
}
|
|
310
352
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
start: () => rollup(rollupInputOptions),
|
|
314
|
-
})
|
|
353
|
+
Abortable.throwIfAborted(buildOperation)
|
|
354
|
+
const rollupReturnValue = await rollup(rollupInputOptions)
|
|
315
355
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
const rollupOutputArray = await createOperation({
|
|
321
|
-
cancellationToken,
|
|
322
|
-
start: () => rollupReturnValue.generate(rollupOutputOptions),
|
|
323
|
-
})
|
|
356
|
+
Abortable.throwIfAborted(buildOperation)
|
|
357
|
+
const rollupOutputArray = await rollupReturnValue.generate(
|
|
358
|
+
rollupOutputOptions,
|
|
359
|
+
)
|
|
324
360
|
|
|
325
361
|
return rollupOutputArray
|
|
326
362
|
}
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
resolveUrl,
|
|
10
10
|
urlToRelativeUrl,
|
|
11
11
|
resolveDirectoryUrl,
|
|
12
|
-
writeFile,
|
|
13
12
|
comparePathnames,
|
|
14
13
|
urlIsInsideOf,
|
|
15
14
|
normalizeStructuredMetaMap,
|
|
@@ -17,6 +16,7 @@ import {
|
|
|
17
16
|
} from "@jsenv/filesystem"
|
|
18
17
|
import { createWorkersForJavaScriptModules } from "@jsenv/workers"
|
|
19
18
|
|
|
19
|
+
import { Abortable } from "@jsenv/core/src/abort/main.js"
|
|
20
20
|
import { createUrlConverter } from "@jsenv/core/src/internal/url_conversion.js"
|
|
21
21
|
import { createUrlFetcher } from "@jsenv/core/src/internal/building/url_fetcher.js"
|
|
22
22
|
import { createUrlLoader } from "@jsenv/core/src/internal/building/url_loader.js"
|
|
@@ -50,7 +50,7 @@ import { injectSourcemapInRollupBuild } from "./rollup_build_sourcemap.js"
|
|
|
50
50
|
import { createBuildStats } from "./build_stats.js"
|
|
51
51
|
|
|
52
52
|
export const createJsenvRollupPlugin = async ({
|
|
53
|
-
|
|
53
|
+
buildOperation,
|
|
54
54
|
logger,
|
|
55
55
|
|
|
56
56
|
projectDirectoryUrl,
|
|
@@ -58,9 +58,6 @@ export const createJsenvRollupPlugin = async ({
|
|
|
58
58
|
compileServerOrigin,
|
|
59
59
|
compileDirectoryRelativeUrl,
|
|
60
60
|
buildDirectoryUrl,
|
|
61
|
-
assetManifestFile,
|
|
62
|
-
assetManifestFileRelativeUrl,
|
|
63
|
-
writeOnFileSystem,
|
|
64
61
|
|
|
65
62
|
urlMappings,
|
|
66
63
|
importResolutionMethod,
|
|
@@ -755,11 +752,17 @@ export const createJsenvRollupPlugin = async ({
|
|
|
755
752
|
}
|
|
756
753
|
|
|
757
754
|
let url = asServerUrl(rollupUrl)
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
755
|
+
|
|
756
|
+
const loadResult = await Abortable.asyncCallback(
|
|
757
|
+
buildOperation,
|
|
758
|
+
(signal) => {
|
|
759
|
+
return urlLoader.loadUrl(rollupUrl, {
|
|
760
|
+
signal,
|
|
761
|
+
logger,
|
|
762
|
+
ressourceBuilder,
|
|
763
|
+
})
|
|
764
|
+
},
|
|
765
|
+
)
|
|
763
766
|
|
|
764
767
|
url = loadResult.url
|
|
765
768
|
const code = loadResult.code
|
|
@@ -1266,27 +1269,6 @@ export const createJsenvRollupPlugin = async ({
|
|
|
1266
1269
|
buildDuration,
|
|
1267
1270
|
})
|
|
1268
1271
|
|
|
1269
|
-
if (assetManifestFile) {
|
|
1270
|
-
const assetManifestFileUrl = resolveUrl(
|
|
1271
|
-
assetManifestFileRelativeUrl,
|
|
1272
|
-
buildDirectoryUrl,
|
|
1273
|
-
)
|
|
1274
|
-
await writeFile(
|
|
1275
|
-
assetManifestFileUrl,
|
|
1276
|
-
JSON.stringify(buildManifest, null, " "),
|
|
1277
|
-
)
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
if (writeOnFileSystem) {
|
|
1281
|
-
const buildRelativeUrls = Object.keys(buildFileContents)
|
|
1282
|
-
await Promise.all(
|
|
1283
|
-
buildRelativeUrls.map(async (buildRelativeUrl) => {
|
|
1284
|
-
const fileBuildUrl = resolveUrl(buildRelativeUrl, buildDirectoryUrl)
|
|
1285
|
-
await writeFile(fileBuildUrl, buildFileContents[buildRelativeUrl])
|
|
1286
|
-
}),
|
|
1287
|
-
)
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
1272
|
logger.info(
|
|
1291
1273
|
formatBuildDoneInfo({
|
|
1292
1274
|
buildStats,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { createLogger } from "@jsenv/logger"
|
|
10
10
|
|
|
11
11
|
import { setJavaScriptSourceMappingUrl } from "@jsenv/core/src/internal/sourceMappingURLUtils.js"
|
|
12
|
-
import {
|
|
12
|
+
import { racePromises } from "../promise_race.js"
|
|
13
13
|
import { parseDataUrl } from "../dataUrl.utils.js"
|
|
14
14
|
|
|
15
15
|
import {
|
|
@@ -400,11 +400,8 @@ export const createRessourceBuilder = (
|
|
|
400
400
|
// and this asset builder fetching to avoid fetching twice.
|
|
401
401
|
// This scenario would be reproduced for every js module preloaded
|
|
402
402
|
const { usedPromise, rollupBuildDonePromise } = ressource
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
rollupBuildDonePromise,
|
|
406
|
-
])
|
|
407
|
-
if (winner === rollupBuildDonePromise) {
|
|
403
|
+
const winner = await racePromises([usedPromise, rollupBuildDonePromise])
|
|
404
|
+
if (winner.promise === rollupBuildDonePromise) {
|
|
408
405
|
return
|
|
409
406
|
}
|
|
410
407
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { createCancellationToken } from "@jsenv/cancellation"
|
|
2
1
|
import { resolveUrl } from "@jsenv/filesystem"
|
|
3
|
-
import {
|
|
2
|
+
import { createDetailedMessage } from "@jsenv/logger"
|
|
4
3
|
|
|
5
4
|
import {
|
|
6
5
|
dataUrlToRawData,
|
|
@@ -10,8 +9,8 @@ import { fetchUrl } from "@jsenv/core/src/internal/fetchUrl.js"
|
|
|
10
9
|
import { validateResponse } from "@jsenv/core/src/internal/response_validation.js"
|
|
11
10
|
|
|
12
11
|
export const loadSourcemap = async ({
|
|
13
|
-
|
|
14
|
-
logger
|
|
12
|
+
signal,
|
|
13
|
+
logger,
|
|
15
14
|
|
|
16
15
|
code,
|
|
17
16
|
url,
|
|
@@ -33,7 +32,7 @@ export const loadSourcemap = async ({
|
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
const sourcemapResponse = await fetchUrl(sourcemapUrl, {
|
|
36
|
-
|
|
35
|
+
signal,
|
|
37
36
|
ignoreHttpsError: true,
|
|
38
37
|
})
|
|
39
38
|
const { isValid, details } = await validateResponse(sourcemapResponse, {
|
|
@@ -13,14 +13,11 @@ export const createUrlFetcher = ({
|
|
|
13
13
|
}) => {
|
|
14
14
|
const urlRedirectionMap = {}
|
|
15
15
|
|
|
16
|
-
const fetchUrl = async (
|
|
17
|
-
url,
|
|
18
|
-
{ cancellationToken, urlTrace, contentTypeExpected },
|
|
19
|
-
) => {
|
|
16
|
+
const fetchUrl = async (url, { signal, urlTrace, contentTypeExpected }) => {
|
|
20
17
|
const urlToFetch = applyUrlMappings(url)
|
|
21
18
|
|
|
22
19
|
const response = await jsenvFetchUrl(urlToFetch, {
|
|
23
|
-
|
|
20
|
+
signal,
|
|
24
21
|
ignoreHttpsError: true,
|
|
25
22
|
})
|
|
26
23
|
const responseUrl = response.url
|
|
@@ -21,10 +21,7 @@ export const createUrlLoader = ({
|
|
|
21
21
|
}) => {
|
|
22
22
|
const urlResponseBodyMap = {}
|
|
23
23
|
|
|
24
|
-
const loadUrl = async (
|
|
25
|
-
rollupUrl,
|
|
26
|
-
{ cancellationToken, logger, ressourceBuilder },
|
|
27
|
-
) => {
|
|
24
|
+
const loadUrl = async (rollupUrl, { signal, logger, ressourceBuilder }) => {
|
|
28
25
|
let url = asServerUrl(rollupUrl)
|
|
29
26
|
const { importType, urlWithoutImportType } = extractImportTypeFromUrl(url)
|
|
30
27
|
|
|
@@ -133,7 +130,7 @@ export const createUrlLoader = ({
|
|
|
133
130
|
}
|
|
134
131
|
|
|
135
132
|
const response = await urlFetcher.fetchUrl(url, {
|
|
136
|
-
|
|
133
|
+
signal,
|
|
137
134
|
contentTypeExpected: [
|
|
138
135
|
"application/javascript",
|
|
139
136
|
...(allowJson ? ["application/json"] : []),
|
|
@@ -154,7 +151,7 @@ export const createUrlLoader = ({
|
|
|
154
151
|
const jsText = await response.text()
|
|
155
152
|
saveUrlResponseBody(response.url, jsText)
|
|
156
153
|
const map = await loadSourcemap({
|
|
157
|
-
|
|
154
|
+
signal,
|
|
158
155
|
logger,
|
|
159
156
|
|
|
160
157
|
url,
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { convertFileSystemErrorToResponseProperties } from "@jsenv/server"
|
|
2
1
|
import {
|
|
3
2
|
urlToRelativeUrl,
|
|
4
3
|
fileSystemPathToUrl,
|
|
5
4
|
resolveUrl,
|
|
6
5
|
bufferToEtag,
|
|
7
6
|
} from "@jsenv/filesystem"
|
|
7
|
+
import { convertFileSystemErrorToResponseProperties } from "@jsenv/server/src/internal/convertFileSystemErrorToResponseProperties.js"
|
|
8
8
|
|
|
9
9
|
import { getOrGenerateCompiledFile } from "./compile-directory/getOrGenerateCompiledFile.js"
|
|
10
10
|
import { updateMeta } from "./compile-directory/updateMeta.js"
|
|
11
11
|
|
|
12
12
|
export const compileFile = async ({
|
|
13
|
-
// cancellatioToken,
|
|
14
13
|
logger,
|
|
15
14
|
|
|
16
15
|
projectDirectoryUrl,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { serveFile } from "@jsenv/server"
|
|
1
|
+
import { serveFile, nextService } from "@jsenv/server"
|
|
2
2
|
import {
|
|
3
3
|
resolveUrl,
|
|
4
4
|
resolveDirectoryUrl,
|
|
@@ -31,8 +31,7 @@ const jsenvCompilers = {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export const createCompiledFileService = ({
|
|
34
|
-
|
|
35
|
-
cancellationToken,
|
|
34
|
+
compileServerOperation,
|
|
36
35
|
logger,
|
|
37
36
|
|
|
38
37
|
projectDirectoryUrl,
|
|
@@ -81,7 +80,7 @@ export const createCompiledFileService = ({
|
|
|
81
80
|
|
|
82
81
|
// not inside compile directory -> nothing to compile
|
|
83
82
|
if (!requestCompileInfo.insideCompileDirectory) {
|
|
84
|
-
return
|
|
83
|
+
return null
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
const { compileId, afterCompileId } = requestCompileInfo
|
|
@@ -111,7 +110,7 @@ export const createCompiledFileService = ({
|
|
|
111
110
|
|
|
112
111
|
// nothing after compileId, we don't know what to compile (not supposed to happen)
|
|
113
112
|
if (afterCompileId === "") {
|
|
114
|
-
return
|
|
113
|
+
return null
|
|
115
114
|
}
|
|
116
115
|
|
|
117
116
|
const originalFileRelativeUrl = afterCompileId
|
|
@@ -133,7 +132,7 @@ export const createCompiledFileService = ({
|
|
|
133
132
|
// we don't redirect otherwise it complexify ressource tracking
|
|
134
133
|
// and url resolution
|
|
135
134
|
if (!compiler) {
|
|
136
|
-
return
|
|
135
|
+
return nextService({
|
|
137
136
|
...request,
|
|
138
137
|
ressource: `/${originalFileRelativeUrl}`,
|
|
139
138
|
})
|
|
@@ -141,7 +140,7 @@ export const createCompiledFileService = ({
|
|
|
141
140
|
|
|
142
141
|
// compile this if needed
|
|
143
142
|
const compileResponsePromise = compileFile({
|
|
144
|
-
|
|
143
|
+
compileServerOperation,
|
|
145
144
|
logger,
|
|
146
145
|
|
|
147
146
|
projectDirectoryUrl,
|
|
@@ -153,9 +152,9 @@ export const createCompiledFileService = ({
|
|
|
153
152
|
compileCacheStrategy,
|
|
154
153
|
projectFileRequestedCallback,
|
|
155
154
|
request,
|
|
156
|
-
compile: ({ code, map }) => {
|
|
155
|
+
compile: ({ signal, code, map }) => {
|
|
157
156
|
return compiler({
|
|
158
|
-
|
|
157
|
+
signal,
|
|
159
158
|
logger,
|
|
160
159
|
|
|
161
160
|
code,
|