@jsenv/core 24.6.4 → 25.0.0-alpha.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/browser_runtime/asset-manifest.json +2 -1
- package/dist/browser_runtime/{browser_runtime-bb0e3aa4.js → browser_runtime_91c5a3b8.js} +137 -26
- package/dist/browser_runtime/browser_runtime_91c5a3b8.js.map +1089 -0
- package/dist/build_manifest.js +6 -6
- package/dist/compile_proxy/asset-manifest.json +2 -1
- package/dist/compile_proxy/{compile_proxy-6eb67db4.html → compile_proxy_7ad5faa6.html} +119 -26
- package/dist/compile_proxy/{compile_proxy.html__inline__20-9e168143.js.map → compile_proxy_e3b0c442_809f35f7.js.map} +6 -6
- package/dist/event_source_client/asset-manifest.json +2 -1
- package/dist/event_source_client/{event_source_client-9f14c8b9.js → event_source_client_80644aee.js} +2 -2
- package/dist/event_source_client/{event_source_client-9f14c8b9.js.map → event_source_client_80644aee.js.map} +4 -3
- package/dist/redirector/asset-manifest.json +2 -1
- package/dist/redirector/{redirector.html__inline__15-3a34a156.js.map → redirector_e3b0c442_e391410e.js.map} +6 -6
- package/dist/redirector/{redirector-b6ad84bf.html → redirector_eb92e8a7.html} +119 -26
- package/dist/toolbar/asset-manifest.json +11 -10
- package/dist/toolbar/assets/{compilation.css-209d68b4.map → compilation.css_e37c747b.map} +1 -1
- package/dist/toolbar/assets/{eventsource.css-38cd0a36.map → eventsource.css_c0c71e7b.map} +1 -1
- package/dist/toolbar/assets/{execution.css-0ebe522f.map → execution.css_f3377c10.map} +1 -1
- package/dist/toolbar/assets/{focus.css-3f9c156d.map → focus.css_896f3e45.map} +1 -1
- package/dist/toolbar/assets/{light-theme.css-78b19a80.map → light-theme.css_72a60fa3.map} +1 -1
- package/dist/toolbar/assets/{overflow-menu.css-d9688a1c.map → overflow-menu.css_2859d519.map} +1 -1
- package/dist/toolbar/assets/{settings.css-2b81b245.map → settings.css_61548139.map} +1 -1
- package/dist/toolbar/assets/{toolbar.main.css-846920e9.map → toolbar.main.css_269d7ce2.map} +9 -9
- package/dist/toolbar/assets/{tooltip.css-03395ee6.map → tooltip.css_a94a8bdd.map} +1 -1
- package/dist/toolbar/{toolbar.main-a5ef2c60.js.map → toolbar.main2_6c1b3d82.js.map} +8 -8
- package/dist/toolbar/{toolbar-1fbf8dcb.html → toolbar_04ba410c.html} +129 -36
- package/dist/toolbar_injector/asset-manifest.json +3 -2
- package/dist/toolbar_injector/assets/{jsenv-logo-188b9ca6.svg → jsenv-logo_188b9ca6.svg} +0 -0
- package/dist/toolbar_injector/{toolbar_injector-997dbaa0.js → toolbar_injector_4a48bc53.js} +3 -3
- package/dist/toolbar_injector/{toolbar_injector-997dbaa0.js.map → toolbar_injector_4a48bc53.js.map} +2 -2
- package/package.json +5 -4
- package/readme.md +24 -91
- package/src/buildProject.js +42 -27
- package/src/dev_server.js +8 -2
- package/src/execute.js +7 -1
- package/src/executeTestPlan.js +17 -0
- package/src/internal/browser_feature_detection/browser_feature_detection.js +18 -25
- package/src/internal/browser_runtime/browser_runtime.js +2 -2
- package/src/internal/browser_runtime/createBrowserRuntime.js +1 -1
- package/src/internal/browser_runtime/displayErrorInDocument.js +2 -0
- package/src/internal/browser_runtime/displayErrorNotification.js +1 -1
- package/src/internal/building/buildUsingRollup.js +12 -15
- package/src/internal/building/build_logs.js +2 -2
- package/src/internal/building/build_stats.js +11 -1
- package/src/internal/building/html/parseHtmlRessource.js +2 -26
- package/src/internal/building/js/parseJsRessource.js +3 -2
- package/src/internal/building/json_module.js +11 -0
- package/src/internal/building/parseRessource.js +1 -1
- package/src/internal/building/ressource_builder.js +210 -216
- package/src/internal/building/rollup_plugin_jsenv.js +530 -365
- package/src/internal/building/url_loader.js +8 -145
- package/src/internal/building/url_versioning.js +220 -0
- package/src/internal/compiling/compileHtml.js +8 -1
- package/src/internal/compiling/createCompiledFileService.js +28 -40
- package/src/internal/compiling/html_source_file_service.js +66 -51
- package/src/internal/compiling/js-compilation-service/babel_plugin_systemjs_prepend.js +23 -0
- package/src/internal/compiling/js-compilation-service/jsenvTransform.js +16 -12
- package/src/internal/compiling/js-compilation-service/transformJs.js +2 -0
- package/src/internal/compiling/jsenvCompilerForHtml.js +43 -44
- package/src/internal/compiling/jsenvCompilerForImportmap.js +15 -76
- package/src/internal/compiling/jsenvCompilerForJavaScript.js +9 -0
- package/src/internal/compiling/startCompileServer.js +29 -5
- package/src/internal/dev_server/event_source_client/livereload_preference.js +1 -1
- package/src/internal/dev_server/toolbar/compilation/toolbar.compilation.js +9 -9
- package/src/internal/executing/executePlan.js +6 -0
- package/src/internal/generateGroupMap/{jsenvBabelPluginCompatMap.js → babel_plugins_compatibility.js} +0 -0
- package/src/internal/generateGroupMap/{featuresCompatMap.js → features_compatibility.js} +9 -1
- package/src/internal/generateGroupMap/generateGroupMap.js +6 -35
- package/src/internal/generateGroupMap/one_runtime_compat.js +9 -12
- package/src/internal/generateGroupMap/runtime_compat.js +10 -15
- package/src/internal/generateGroupMap/runtime_compat_composition.js +2 -2
- package/src/internal/generateGroupMap/shake_babel_plugin_map.js +21 -0
- package/src/internal/import-resolution/importmap_default.js +52 -0
- package/src/internal/node_feature_detection/node_feature_detection.js +25 -19
- package/src/internal/runtime/s.js +101 -6
- package/src/internal/unevalException.js +1 -1
- package/src/jsenvServiceWorkerFinalizer.js +10 -9
- package/dist/browser_runtime/browser_runtime-bb0e3aa4.js.map +0 -1067
- package/src/internal/building/asset_url_versioning.js +0 -50
- package/src/internal/building/rollup_build_sourcemap.js +0 -54
- package/src/internal/building/url-versioning.js +0 -96
- package/src/internal/generateGroupMap/jsenvPluginCompatMap.js +0 -1
- package/src/internal/import-resolution/importmap-default.js +0 -34
- package/src/internal/renderNamePattern.js +0 -6
package/src/buildProject.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createLogger, createDetailedMessage } from "@jsenv/logger"
|
|
|
2
2
|
import { resolveDirectoryUrl } from "@jsenv/filesystem"
|
|
3
3
|
import { Abort, raceProcessTeardownEvents } from "@jsenv/abort"
|
|
4
4
|
|
|
5
|
+
import { shakeBabelPluginMap } from "@jsenv/core/src/internal/generateGroupMap/shake_babel_plugin_map.js"
|
|
5
6
|
import { COMPILE_ID_BEST } from "./internal/CONSTANTS.js"
|
|
6
7
|
import {
|
|
7
8
|
assertProjectDirectoryUrl,
|
|
@@ -22,7 +23,13 @@ export const buildProject = async ({
|
|
|
22
23
|
logger,
|
|
23
24
|
|
|
24
25
|
projectDirectoryUrl,
|
|
25
|
-
|
|
26
|
+
entryPoints,
|
|
27
|
+
workers = [],
|
|
28
|
+
serviceWorkers = [],
|
|
29
|
+
serviceWorkerFinalizer,
|
|
30
|
+
classicWorkers = [],
|
|
31
|
+
classicServiceWorkers = [],
|
|
32
|
+
importMapInWebWorkers = false,
|
|
26
33
|
buildDirectoryRelativeUrl,
|
|
27
34
|
buildDirectoryClean = true,
|
|
28
35
|
assetManifestFile = false,
|
|
@@ -57,7 +64,6 @@ export const buildProject = async ({
|
|
|
57
64
|
urlVersioning = format === "systemjs" ||
|
|
58
65
|
format === "esmodule" ||
|
|
59
66
|
format === "global",
|
|
60
|
-
urlVersionningForEntryPoints = false,
|
|
61
67
|
lineBreakNormalization = process.platform === "win32",
|
|
62
68
|
// when jsConcatenation is disabled rollup becomes almost useless
|
|
63
69
|
// except it can still do tree shaking
|
|
@@ -78,10 +84,6 @@ export const buildProject = async ({
|
|
|
78
84
|
// https://github.com/cssnano/cssnano/tree/master/packages/cssnano-preset-default
|
|
79
85
|
minifyCssOptions,
|
|
80
86
|
|
|
81
|
-
workers = {},
|
|
82
|
-
serviceWorkers = {},
|
|
83
|
-
serviceWorkerFinalizer,
|
|
84
|
-
|
|
85
87
|
env = {},
|
|
86
88
|
protocol,
|
|
87
89
|
privateKey,
|
|
@@ -113,14 +115,19 @@ export const buildProject = async ({
|
|
|
113
115
|
`runtimeSupport must be an object, got ${runtimeSupport}`,
|
|
114
116
|
)
|
|
115
117
|
}
|
|
118
|
+
if (format !== "systemjs" && importMapInWebWorkers) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`format must be "systemjs" when importMapInWebWorkers is enabled`,
|
|
121
|
+
)
|
|
122
|
+
}
|
|
116
123
|
|
|
117
124
|
projectDirectoryUrl = assertProjectDirectoryUrl({ projectDirectoryUrl })
|
|
118
125
|
await assertProjectDirectoryExists({ projectDirectoryUrl })
|
|
119
126
|
|
|
120
|
-
|
|
127
|
+
assertentryPoints({ entryPoints })
|
|
121
128
|
|
|
122
|
-
if (Object.keys(
|
|
123
|
-
logger.error(`
|
|
129
|
+
if (Object.keys(entryPoints).length === 0) {
|
|
130
|
+
logger.error(`entryPoints is an empty object`)
|
|
124
131
|
return {
|
|
125
132
|
rollupBuilds: {},
|
|
126
133
|
}
|
|
@@ -165,6 +172,7 @@ export const buildProject = async ({
|
|
|
165
172
|
moduleOutFormat: "esmodule", // rollup will transform into the right format
|
|
166
173
|
importMetaFormat: "esmodule", // rollup will transform into the right format
|
|
167
174
|
topLevelAwait: "ignore", // rollup will transform if needed
|
|
175
|
+
prependSystemJs: false,
|
|
168
176
|
|
|
169
177
|
protocol,
|
|
170
178
|
privateKey,
|
|
@@ -173,9 +181,10 @@ export const buildProject = async ({
|
|
|
173
181
|
port,
|
|
174
182
|
env,
|
|
175
183
|
babelPluginMap,
|
|
176
|
-
|
|
184
|
+
workers,
|
|
185
|
+
serviceWorkers,
|
|
177
186
|
runtimeSupport,
|
|
178
|
-
|
|
187
|
+
customCompilers,
|
|
179
188
|
compileServerCanReadFromFilesystem: filesystemCache,
|
|
180
189
|
compileServerCanWriteOnFilesystem: filesystemCache,
|
|
181
190
|
// keep source html untouched
|
|
@@ -197,7 +206,7 @@ export const buildProject = async ({
|
|
|
197
206
|
buildOperation,
|
|
198
207
|
logger,
|
|
199
208
|
|
|
200
|
-
|
|
209
|
+
entryPoints,
|
|
201
210
|
projectDirectoryUrl,
|
|
202
211
|
compileServerOrigin,
|
|
203
212
|
compileDirectoryRelativeUrl: `${outDirectoryRelativeUrl}${COMPILE_ID_BEST}/`,
|
|
@@ -218,11 +227,21 @@ export const buildProject = async ({
|
|
|
218
227
|
systemJsUrl,
|
|
219
228
|
globalName,
|
|
220
229
|
globals,
|
|
221
|
-
babelPluginMap:
|
|
230
|
+
babelPluginMap: shakeBabelPluginMap({
|
|
231
|
+
babelPluginMap: compileServer.babelPluginMap,
|
|
232
|
+
missingFeatureNames:
|
|
233
|
+
compileServer.compileServerGroupMap[COMPILE_ID_BEST]
|
|
234
|
+
.missingFeatureNames,
|
|
235
|
+
}),
|
|
222
236
|
runtimeSupport,
|
|
237
|
+
workers,
|
|
238
|
+
serviceWorkers,
|
|
239
|
+
serviceWorkerFinalizer,
|
|
240
|
+
classicWorkers,
|
|
241
|
+
classicServiceWorkers,
|
|
242
|
+
importMapInWebWorkers,
|
|
223
243
|
|
|
224
244
|
urlVersioning,
|
|
225
|
-
urlVersionningForEntryPoints,
|
|
226
245
|
lineBreakNormalization,
|
|
227
246
|
useImportMapToMaximizeCacheReuse,
|
|
228
247
|
preserveEntrySignatures,
|
|
@@ -235,10 +254,6 @@ export const buildProject = async ({
|
|
|
235
254
|
minifyJsOptions,
|
|
236
255
|
minifyCssOptions,
|
|
237
256
|
|
|
238
|
-
workers,
|
|
239
|
-
serviceWorkers,
|
|
240
|
-
serviceWorkerFinalizer,
|
|
241
|
-
|
|
242
257
|
writeOnFileSystem,
|
|
243
258
|
sourcemapExcludeSources,
|
|
244
259
|
})
|
|
@@ -255,27 +270,27 @@ export const buildProject = async ({
|
|
|
255
270
|
}
|
|
256
271
|
}
|
|
257
272
|
|
|
258
|
-
const
|
|
259
|
-
if (typeof
|
|
260
|
-
throw new TypeError(`
|
|
273
|
+
const assertentryPoints = ({ entryPoints }) => {
|
|
274
|
+
if (typeof entryPoints !== "object") {
|
|
275
|
+
throw new TypeError(`entryPoints must be an object, got ${entryPoints}`)
|
|
261
276
|
}
|
|
262
|
-
const keys = Object.keys(
|
|
277
|
+
const keys = Object.keys(entryPoints)
|
|
263
278
|
keys.forEach((key) => {
|
|
264
279
|
if (!key.startsWith("./")) {
|
|
265
280
|
throw new TypeError(
|
|
266
|
-
`unexpected key in
|
|
281
|
+
`unexpected key in entryPoints, all keys must start with ./ but found ${key}`,
|
|
267
282
|
)
|
|
268
283
|
}
|
|
269
284
|
|
|
270
|
-
const value =
|
|
285
|
+
const value = entryPoints[key]
|
|
271
286
|
if (typeof value !== "string") {
|
|
272
287
|
throw new TypeError(
|
|
273
|
-
`unexpected value in
|
|
288
|
+
`unexpected value in entryPoints, all values must be strings found ${value} for key ${key}`,
|
|
274
289
|
)
|
|
275
290
|
}
|
|
276
|
-
if (
|
|
291
|
+
if (value.includes("/")) {
|
|
277
292
|
throw new TypeError(
|
|
278
|
-
`unexpected value in
|
|
293
|
+
`unexpected value in entryPoints, all values must be plain strings (no "/") but found ${value} for key ${key}`,
|
|
279
294
|
)
|
|
280
295
|
}
|
|
281
296
|
})
|
package/src/dev_server.js
CHANGED
|
@@ -45,17 +45,20 @@ export const startDevServer = async ({
|
|
|
45
45
|
keepProcessAlive = true,
|
|
46
46
|
|
|
47
47
|
babelPluginMap,
|
|
48
|
+
workers,
|
|
49
|
+
serviceWorkers,
|
|
50
|
+
importMapInWebWorkers,
|
|
51
|
+
customCompilers,
|
|
48
52
|
runtimeSupportDuringDev = {
|
|
49
53
|
// this allows to compile nothing or almost nothing when opening files
|
|
50
54
|
// with a recent chrome. Without this we would compile all the things not yet unsupported
|
|
51
55
|
// by Firefox and Safari such as top level await, importmap, etc
|
|
52
|
-
chrome: "
|
|
56
|
+
chrome: "96",
|
|
53
57
|
},
|
|
54
58
|
logLevel,
|
|
55
59
|
compileServerCanReadFromFilesystem,
|
|
56
60
|
compileServerCanWriteOnFilesystem,
|
|
57
61
|
sourcemapMethod,
|
|
58
|
-
customCompilers,
|
|
59
62
|
livereloadWatchConfig,
|
|
60
63
|
livereloadLogLevel,
|
|
61
64
|
jsenvDirectoryClean,
|
|
@@ -124,6 +127,9 @@ export const startDevServer = async ({
|
|
|
124
127
|
customCompilers,
|
|
125
128
|
sourcemapMethod,
|
|
126
129
|
babelPluginMap,
|
|
130
|
+
workers,
|
|
131
|
+
serviceWorkers,
|
|
132
|
+
importMapInWebWorkers,
|
|
127
133
|
runtimeSupport: runtimeSupportDuringDev,
|
|
128
134
|
livereloadWatchConfig,
|
|
129
135
|
livereloadLogLevel,
|
package/src/execute.js
CHANGED
|
@@ -46,6 +46,9 @@ export const execute = async ({
|
|
|
46
46
|
port,
|
|
47
47
|
babelPluginMap,
|
|
48
48
|
customCompilers,
|
|
49
|
+
workers,
|
|
50
|
+
serviceWorkers,
|
|
51
|
+
importMapInWebWorkers,
|
|
49
52
|
compileServerCanReadFromFilesystem,
|
|
50
53
|
compileServerCanWriteOnFilesystem,
|
|
51
54
|
|
|
@@ -105,10 +108,13 @@ export const execute = async ({
|
|
|
105
108
|
ip,
|
|
106
109
|
port,
|
|
107
110
|
babelPluginMap,
|
|
108
|
-
customCompilers,
|
|
109
111
|
runtimeSupport: normalizeRuntimeSupport({
|
|
110
112
|
[runtime.name]: runtime.version,
|
|
111
113
|
}),
|
|
114
|
+
customCompilers,
|
|
115
|
+
workers,
|
|
116
|
+
serviceWorkers,
|
|
117
|
+
importMapInWebWorkers,
|
|
112
118
|
compileServerCanReadFromFilesystem,
|
|
113
119
|
compileServerCanWriteOnFilesystem,
|
|
114
120
|
})
|
package/src/executeTestPlan.js
CHANGED
|
@@ -19,6 +19,17 @@ import { generateCoverageHtmlDirectory } from "./internal/executing/coverage_rep
|
|
|
19
19
|
import { generateCoverageTextLog } from "./internal/executing/coverage_reporter/coverage_reporter_text_log.js"
|
|
20
20
|
import { jsenvCoverageConfig } from "./jsenvCoverageConfig.js"
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Execute a list of files and log how it goes
|
|
24
|
+
* @param {object} testPlan Configure files to execute and their runtimes (browsers/node)
|
|
25
|
+
* @param {string|url} projectDirectoryUrl Root directory of your files
|
|
26
|
+
* @param {number} [maxExecutionsInParallel=1] Maximum amount of execution in parallel
|
|
27
|
+
* @param {number} [defaultMsAllocatedPerExecution=30000] Milliseconds after which execution is aborted and considered as failed by timeout
|
|
28
|
+
* @param {number} [cooldownBetweenExecutions=0] Millisecond to wait between each execution
|
|
29
|
+
* @param {boolean} [logMemoryHeapUsage=false] Add memory heap usage during logs
|
|
30
|
+
* @param {boolean} [coverage=false] Controls if coverage is collected during files executions
|
|
31
|
+
* @param {boolean} [coverageV8ConflictWarning=true] Warn when coverage from 2 executions cannot be merged
|
|
32
|
+
*/
|
|
22
33
|
export const executeTestPlan = async ({
|
|
23
34
|
signal = new AbortController().signal,
|
|
24
35
|
handleSIGINT = true,
|
|
@@ -79,6 +90,9 @@ export const executeTestPlan = async ({
|
|
|
79
90
|
compileServerCanWriteOnFilesystem,
|
|
80
91
|
babelPluginMap,
|
|
81
92
|
babelConfigFileUrl,
|
|
93
|
+
workers,
|
|
94
|
+
serviceWorkers,
|
|
95
|
+
importMapInWebWorkers,
|
|
82
96
|
customCompilers,
|
|
83
97
|
jsenvDirectoryClean,
|
|
84
98
|
}) => {
|
|
@@ -179,6 +193,9 @@ export const executeTestPlan = async ({
|
|
|
179
193
|
compileServerCanWriteOnFilesystem,
|
|
180
194
|
babelPluginMap,
|
|
181
195
|
babelConfigFileUrl,
|
|
196
|
+
workers,
|
|
197
|
+
serviceWorkers,
|
|
198
|
+
importMapInWebWorkers,
|
|
182
199
|
customCompilers,
|
|
183
200
|
})
|
|
184
201
|
|
|
@@ -36,17 +36,14 @@ export const scanBrowserRuntimeFeatures = async ({
|
|
|
36
36
|
failFastOnFeatureDetection,
|
|
37
37
|
inlineImportMapIntoHTML,
|
|
38
38
|
})
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
coverageHandledFromOutside,
|
|
44
|
-
},
|
|
45
|
-
)
|
|
39
|
+
const missingFeatureNames = await adjustMissingFeatureNames(groupInfo, {
|
|
40
|
+
featuresReport,
|
|
41
|
+
coverageHandledFromOutside,
|
|
42
|
+
})
|
|
46
43
|
|
|
47
44
|
const canAvoidCompilation =
|
|
48
45
|
customCompilerPatterns.length === 0 &&
|
|
49
|
-
|
|
46
|
+
missingFeatureNames.length === 0 &&
|
|
50
47
|
featuresReport.importmap &&
|
|
51
48
|
featuresReport.dynamicImport &&
|
|
52
49
|
featuresReport.topLevelAwait
|
|
@@ -55,7 +52,7 @@ export const scanBrowserRuntimeFeatures = async ({
|
|
|
55
52
|
canAvoidCompilation,
|
|
56
53
|
featuresReport,
|
|
57
54
|
customCompilerPatterns,
|
|
58
|
-
|
|
55
|
+
missingFeatureNames,
|
|
59
56
|
inlineImportMapIntoHTML,
|
|
60
57
|
outDirectoryRelativeUrl,
|
|
61
58
|
compileId,
|
|
@@ -63,27 +60,25 @@ export const scanBrowserRuntimeFeatures = async ({
|
|
|
63
60
|
}
|
|
64
61
|
}
|
|
65
62
|
|
|
66
|
-
const
|
|
63
|
+
const adjustMissingFeatureNames = async (
|
|
67
64
|
groupInfo,
|
|
68
65
|
{ featuresReport, coverageHandledFromOutside },
|
|
69
66
|
) => {
|
|
70
|
-
const {
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const index =
|
|
67
|
+
const { missingFeatureNames } = groupInfo
|
|
68
|
+
const missingFeatureNamesCopy = missingFeatureNames.slice()
|
|
69
|
+
const markAsSupported = (name) => {
|
|
70
|
+
const index = missingFeatureNamesCopy.indexOf(name)
|
|
74
71
|
if (index > -1) {
|
|
75
|
-
|
|
72
|
+
missingFeatureNamesCopy.splice(index, 1)
|
|
76
73
|
}
|
|
77
74
|
}
|
|
78
|
-
|
|
79
75
|
// When instrumentation CAN be handed by playwright
|
|
80
76
|
// https://playwright.dev/docs/api/class-chromiumcoverage#chromiumcoveragestartjscoverageoptions
|
|
81
77
|
// coverageHandledFromOutside is true and "transform-instrument" becomes non mandatory
|
|
82
78
|
if (coverageHandledFromOutside) {
|
|
83
|
-
|
|
79
|
+
markAsSupported("transform-instrument")
|
|
84
80
|
}
|
|
85
|
-
|
|
86
|
-
if (pluginRequiredNameArray.includes("transform-import-assertions")) {
|
|
81
|
+
if (missingFeatureNames.includes("transform-import-assertions")) {
|
|
87
82
|
const jsonImportAssertions = await supportsJsonImportAssertions()
|
|
88
83
|
featuresReport.jsonImportAssertions = jsonImportAssertions
|
|
89
84
|
|
|
@@ -91,17 +86,15 @@ const pluginRequiredNamesFromGroupInfo = async (
|
|
|
91
86
|
featuresReport.cssImportAssertions = cssImportAssertions
|
|
92
87
|
|
|
93
88
|
if (jsonImportAssertions && cssImportAssertions) {
|
|
94
|
-
|
|
89
|
+
markAsSupported("transform-import-assertions")
|
|
95
90
|
}
|
|
96
91
|
}
|
|
97
|
-
|
|
98
|
-
if (pluginRequiredNameArray.includes("new-stylesheet-as-jsenv-import")) {
|
|
92
|
+
if (missingFeatureNames.includes("new-stylesheet-as-jsenv-import")) {
|
|
99
93
|
const newStylesheet = supportsNewStylesheet()
|
|
100
94
|
featuresReport.newStylesheet = newStylesheet
|
|
101
|
-
|
|
95
|
+
markAsSupported("new-stylesheet-as-jsenv-import")
|
|
102
96
|
}
|
|
103
|
-
|
|
104
|
-
return requiredPluginNames
|
|
97
|
+
return missingFeatureNamesCopy
|
|
105
98
|
}
|
|
106
99
|
|
|
107
100
|
const detectSupportedFeatures = async ({
|
|
@@ -127,12 +127,12 @@ const onExecutionError = (
|
|
|
127
127
|
},
|
|
128
128
|
) => {
|
|
129
129
|
const error = executionResult.error
|
|
130
|
-
if (error.code === "NETWORK_FAILURE") {
|
|
130
|
+
if (error && error.code === "NETWORK_FAILURE") {
|
|
131
131
|
if (currentScript) {
|
|
132
132
|
const errorEvent = new Event("error")
|
|
133
133
|
currentScript.dispatchEvent(errorEvent)
|
|
134
134
|
}
|
|
135
|
-
} else {
|
|
135
|
+
} else if (typeof error === "object") {
|
|
136
136
|
const { parsingError } = error
|
|
137
137
|
const globalErrorEvent = new Event("error")
|
|
138
138
|
if (parsingError) {
|
|
@@ -40,7 +40,7 @@ export const createBrowserRuntime = async ({
|
|
|
40
40
|
// if there is an importmap in the document we use it instead of fetching.
|
|
41
41
|
// systemjs style with systemjs-importmap
|
|
42
42
|
const importmapScript = document.querySelector(
|
|
43
|
-
`script[type="
|
|
43
|
+
`script[type="systemjs-importmap"]`,
|
|
44
44
|
)
|
|
45
45
|
let importMap
|
|
46
46
|
let importMapUrl
|
|
@@ -7,7 +7,7 @@ const displayErrorNotificationImplementation = (error, { icon } = {}) => {
|
|
|
7
7
|
if (Notification.permission === "granted") {
|
|
8
8
|
const notification = new Notification("An error occured", {
|
|
9
9
|
lang: "en",
|
|
10
|
-
body: error.stack,
|
|
10
|
+
body: error ? error.stack : "undefined",
|
|
11
11
|
icon,
|
|
12
12
|
})
|
|
13
13
|
notification.onclick = () => {
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
isNodePartOfSupportedRuntimes,
|
|
14
14
|
isBrowserPartOfSupportedRuntimes,
|
|
15
15
|
} from "@jsenv/core/src/internal/generateGroupMap/runtime_support.js"
|
|
16
|
-
import { featuresCompatMap } from "@jsenv/core/src/internal/generateGroupMap/featuresCompatMap.js"
|
|
17
16
|
import { createRuntimeCompat } from "@jsenv/core/src/internal/generateGroupMap/runtime_compat.js"
|
|
18
17
|
import { createRollupPlugins } from "./rollup_plugin_jsenv.js"
|
|
19
18
|
|
|
@@ -22,7 +21,7 @@ export const buildUsingRollup = async ({
|
|
|
22
21
|
logger,
|
|
23
22
|
|
|
24
23
|
projectDirectoryUrl,
|
|
25
|
-
|
|
24
|
+
entryPoints,
|
|
26
25
|
compileServerOrigin,
|
|
27
26
|
compileDirectoryRelativeUrl,
|
|
28
27
|
buildDirectoryUrl,
|
|
@@ -49,9 +48,10 @@ export const buildUsingRollup = async ({
|
|
|
49
48
|
workers,
|
|
50
49
|
serviceWorkers,
|
|
51
50
|
serviceWorkerFinalizer,
|
|
51
|
+
classicWorkers,
|
|
52
|
+
classicServiceWorkers,
|
|
52
53
|
|
|
53
54
|
urlVersioning,
|
|
54
|
-
urlVersionningForEntryPoints,
|
|
55
55
|
lineBreakNormalization,
|
|
56
56
|
jsConcatenation,
|
|
57
57
|
cssConcatenation,
|
|
@@ -69,21 +69,17 @@ export const buildUsingRollup = async ({
|
|
|
69
69
|
|
|
70
70
|
const runtimeCompatMap = createRuntimeCompat({
|
|
71
71
|
runtimeSupport,
|
|
72
|
-
|
|
73
|
-
import_assertion_type_json: true,
|
|
74
|
-
import_assertion_type_css: true,
|
|
75
|
-
},
|
|
76
|
-
pluginCompatMap: featuresCompatMap,
|
|
72
|
+
featureNames: ["import_assertion_type_json", "import_assertion_type_css"],
|
|
77
73
|
})
|
|
78
74
|
const importAssertionsSupport = {
|
|
79
75
|
json:
|
|
80
76
|
format === "esmodule" &&
|
|
81
|
-
!runtimeCompatMap.
|
|
77
|
+
!runtimeCompatMap.missingFeatureNames.includes(
|
|
82
78
|
"import_assertion_type_json",
|
|
83
79
|
),
|
|
84
80
|
css:
|
|
85
81
|
format === "esmodule" &&
|
|
86
|
-
!runtimeCompatMap.
|
|
82
|
+
!runtimeCompatMap.missingFeatureNames.includes(
|
|
87
83
|
"import_assertion_type_json",
|
|
88
84
|
),
|
|
89
85
|
}
|
|
@@ -99,7 +95,7 @@ export const buildUsingRollup = async ({
|
|
|
99
95
|
logger,
|
|
100
96
|
|
|
101
97
|
projectDirectoryUrl,
|
|
102
|
-
|
|
98
|
+
entryPoints,
|
|
103
99
|
compileServerOrigin,
|
|
104
100
|
compileDirectoryRelativeUrl,
|
|
105
101
|
buildDirectoryUrl,
|
|
@@ -121,9 +117,10 @@ export const buildUsingRollup = async ({
|
|
|
121
117
|
workers,
|
|
122
118
|
serviceWorkers,
|
|
123
119
|
serviceWorkerFinalizer,
|
|
120
|
+
classicWorkers,
|
|
121
|
+
classicServiceWorkers,
|
|
124
122
|
|
|
125
123
|
urlVersioning,
|
|
126
|
-
urlVersionningForEntryPoints,
|
|
127
124
|
lineBreakNormalization,
|
|
128
125
|
jsConcatenation,
|
|
129
126
|
cssConcatenation,
|
|
@@ -204,7 +201,7 @@ export const buildUsingRollup = async ({
|
|
|
204
201
|
buildFileContents,
|
|
205
202
|
buildInlineFileContents,
|
|
206
203
|
buildStats,
|
|
207
|
-
} = getResult()
|
|
204
|
+
} = await getResult()
|
|
208
205
|
|
|
209
206
|
if (writeOnFileSystem) {
|
|
210
207
|
if (buildDirectoryClean) {
|
|
@@ -264,7 +261,7 @@ const useRollup = async ({
|
|
|
264
261
|
|
|
265
262
|
const rollupInputOptions = {
|
|
266
263
|
// about cache here, we should/could reuse previous rollup call
|
|
267
|
-
// to get the cache from the
|
|
264
|
+
// to get the cache from the entryPoints
|
|
268
265
|
// as shown here: https://rollupjs.org/guide/en#cache
|
|
269
266
|
// it could be passed in arguments to this function
|
|
270
267
|
// however parallelism and having different rollup options per
|
|
@@ -307,7 +304,7 @@ const useRollup = async ({
|
|
|
307
304
|
logger.warn(String(warning))
|
|
308
305
|
},
|
|
309
306
|
// on passe input: [] car c'est le plugin jsenv qui se chargera d'emit des chunks
|
|
310
|
-
// en fonction de
|
|
307
|
+
// en fonction de entryPoints
|
|
311
308
|
// on fait cela car sinon rollup est pénible si on passe un input de type html
|
|
312
309
|
input: [],
|
|
313
310
|
preserveEntrySignatures,
|
|
@@ -5,8 +5,8 @@ import { byteAsFileSize } from "../logs/byteAsFileSize.js"
|
|
|
5
5
|
import { msAsDuration } from "../logs/msAsDuration.js"
|
|
6
6
|
import { stringifyUrlSite } from "./url_trace.js"
|
|
7
7
|
|
|
8
|
-
export const formatBuildStartLog = ({
|
|
9
|
-
const entryFileRelativeUrls = Object.keys(
|
|
8
|
+
export const formatBuildStartLog = ({ entryPoints }) => {
|
|
9
|
+
const entryFileRelativeUrls = Object.keys(entryPoints)
|
|
10
10
|
if (entryFileRelativeUrls.length === 1) {
|
|
11
11
|
return `
|
|
12
12
|
building ${entryFileRelativeUrls[0]}...`
|
|
@@ -59,7 +59,13 @@ const getProjectFileContents = (ressourceBuilder) => {
|
|
|
59
59
|
|
|
60
60
|
Object.keys(ressourceMap).forEach((url) => {
|
|
61
61
|
const ressource = ressourceMap[url]
|
|
62
|
-
const {
|
|
62
|
+
const {
|
|
63
|
+
isInline,
|
|
64
|
+
isExternal,
|
|
65
|
+
isPlaceholder,
|
|
66
|
+
isSourcemap,
|
|
67
|
+
bufferBeforeBuild,
|
|
68
|
+
} = ressource
|
|
63
69
|
if (isInline) {
|
|
64
70
|
// inline ressources are not files
|
|
65
71
|
return
|
|
@@ -80,6 +86,10 @@ const getProjectFileContents = (ressourceBuilder) => {
|
|
|
80
86
|
// to generate it in the build
|
|
81
87
|
return
|
|
82
88
|
}
|
|
89
|
+
if (isSourcemap && !bufferBeforeBuild) {
|
|
90
|
+
// sourcemap generated by rollup do not have bufferBeforeBuild
|
|
91
|
+
return
|
|
92
|
+
}
|
|
83
93
|
projectFileContents[url] = bufferBeforeBuild
|
|
84
94
|
})
|
|
85
95
|
return projectFileContents
|
|
@@ -16,12 +16,7 @@ Or be sure to also reference this url somewhere in the html file like
|
|
|
16
16
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import {
|
|
20
|
-
urlToFilename,
|
|
21
|
-
urlToRelativeUrl,
|
|
22
|
-
resolveUrl,
|
|
23
|
-
urlToParentUrl,
|
|
24
|
-
} from "@jsenv/filesystem"
|
|
19
|
+
import { urlToFilename, urlToRelativeUrl, resolveUrl } from "@jsenv/filesystem"
|
|
25
20
|
|
|
26
21
|
import {
|
|
27
22
|
parseHtmlString,
|
|
@@ -255,7 +250,7 @@ const regularScriptTextNodeVisitor = (
|
|
|
255
250
|
})
|
|
256
251
|
return () => {
|
|
257
252
|
const { bufferAfterBuild } = jsReference.ressource
|
|
258
|
-
textNode.value = bufferAfterBuild
|
|
253
|
+
textNode.value = String(bufferAfterBuild)
|
|
259
254
|
}
|
|
260
255
|
}
|
|
261
256
|
|
|
@@ -359,8 +354,6 @@ const moduleScriptTextNodeVisitor = (
|
|
|
359
354
|
}
|
|
360
355
|
const { bufferAfterBuild } = jsReference.ressource
|
|
361
356
|
const jsText = String(bufferAfterBuild)
|
|
362
|
-
// ici on voudrait pouvoir ajouter le commentaire de la sourcemap
|
|
363
|
-
// sauf que cela se produit un poil plus tard je crois?
|
|
364
357
|
textNode.value = jsText
|
|
365
358
|
}
|
|
366
359
|
}
|
|
@@ -386,23 +379,6 @@ const importmapScriptSrcVisitor = (
|
|
|
386
379
|
contentTypeExpected: "application/importmap+json",
|
|
387
380
|
ressourceSpecifier: srcAttribute.value,
|
|
388
381
|
...referenceLocationFromHtmlNode(script, "src"),
|
|
389
|
-
// here we want to force the fileName for the importmap
|
|
390
|
-
// so that we don't have to rewrite its content
|
|
391
|
-
// the goal is to put the importmap at the same relative path
|
|
392
|
-
// than in the project
|
|
393
|
-
fileNamePattern: () => {
|
|
394
|
-
const importmapReferenceUrl = importmapReference.referenceUrl
|
|
395
|
-
const importmapRessourceUrl = importmapReference.ressource.url
|
|
396
|
-
const importmapUrlRelativeToImporter = urlToRelativeUrl(
|
|
397
|
-
importmapRessourceUrl,
|
|
398
|
-
importmapReferenceUrl,
|
|
399
|
-
)
|
|
400
|
-
const importmapParentRelativeUrl = urlToRelativeUrl(
|
|
401
|
-
urlToParentUrl(resolveUrl(importmapUrlRelativeToImporter, "file://")),
|
|
402
|
-
"file://",
|
|
403
|
-
)
|
|
404
|
-
return `${importmapParentRelativeUrl}[name]-[hash][extname]`
|
|
405
|
-
},
|
|
406
382
|
})
|
|
407
383
|
return ({ getUrlRelativeToImporter }) => {
|
|
408
384
|
const { ressource } = importmapReference
|
|
@@ -103,9 +103,10 @@ export const parseJsRessource = async (
|
|
|
103
103
|
map.file = urlToFilename(jsBuildUrl)
|
|
104
104
|
if (map.sources) {
|
|
105
105
|
map.sources = map.sources.map((source) => {
|
|
106
|
-
const sourceUrl = resolveUrl(source,
|
|
106
|
+
const sourceUrl = resolveUrl(source, jsUrl)
|
|
107
|
+
const sourceOriginalUrl = asOriginalUrl(sourceUrl)
|
|
107
108
|
const sourceUrlRelativeToSourceMap = urlToRelativeUrl(
|
|
108
|
-
|
|
109
|
+
sourceOriginalUrl,
|
|
109
110
|
sourcemapPrecomputedBuildUrl,
|
|
110
111
|
)
|
|
111
112
|
return sourceUrlRelativeToSourceMap
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const convertJsonTextToJavascriptModule = ({ code }) => {
|
|
2
|
+
// here we could do the following
|
|
3
|
+
// return export default jsonText
|
|
4
|
+
// This would return valid js, that would be minified later
|
|
5
|
+
// however we will prefer using JSON.parse because it's faster
|
|
6
|
+
// for js engine to parse JSON than JS
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
code: `export default JSON.parse(${JSON.stringify(code.trim())})`,
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -22,7 +22,7 @@ import { parseJsRessource } from "./js/parseJsRessource.js"
|
|
|
22
22
|
import { parseJsonRessource } from "./json/parseJsonRessource.js"
|
|
23
23
|
import { parseWebmanifestRessource } from "./webmanifest/parseWebmanifestRessource.js"
|
|
24
24
|
|
|
25
|
-
export const parseRessource = (
|
|
25
|
+
export const parseRessource = async (
|
|
26
26
|
ressource,
|
|
27
27
|
notifiers,
|
|
28
28
|
{
|