@jsenv/core 30.3.6 → 30.3.8

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.
Files changed (23) hide show
  1. package/dist/js/babel_plugin_transform_modules_systemjs.cjs +392 -0
  2. package/dist/main.js +92 -38
  3. package/package.json +2 -2
  4. package/src/build/build.js +1 -1
  5. package/src/kitchen/kitchen.js +4 -1
  6. package/src/plugins/autoreload/jsenv_plugin_autoreload_client.js +1 -1
  7. package/src/plugins/import_meta_hot/html_hot_dependencies.js +1 -1
  8. package/src/plugins/importmap/jsenv_plugin_importmap.js +1 -1
  9. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +37 -6
  10. package/src/plugins/inline/jsenv_plugin_inline_query_param.js +2 -1
  11. package/src/plugins/ribbon/jsenv_plugin_ribbon.js +1 -1
  12. package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +1 -1
  13. package/src/plugins/server_events/server_events_dispatcher.js +11 -2
  14. package/src/plugins/supervisor/jsenv_plugin_supervisor.js +3 -2
  15. package/src/plugins/transpilation/as_js_classic/babel_plugin_transform_modules_systemjs.cjs +608 -0
  16. package/src/plugins/transpilation/as_js_classic/convert_js_module_to_js_classic.js +31 -1
  17. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +0 -13
  18. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_conversion.js +1 -0
  19. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +3 -3
  20. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_library.js +1 -0
  21. package/src/plugins/url_analysis/html/html_urls.js +2 -2
  22. package/src/plugins/url_analysis/jsenv_plugin_reference_expected_types.js +1 -1
  23. package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +2 -1
@@ -0,0 +1,608 @@
1
+ "use strict"
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ })
6
+ exports.default = void 0
7
+ exports.getExportSpecifierName = getExportSpecifierName
8
+ var _helperPluginUtils = require("@babel/helper-plugin-utils")
9
+ var _helperHoistVariables = require("@babel/helper-hoist-variables")
10
+ var _core = require("@babel/core")
11
+ var _helperModuleTransforms = require("@babel/helper-module-transforms")
12
+ var _helperValidatorIdentifier = require("@babel/helper-validator-identifier")
13
+ const buildTemplate = _core.template.statement(`
14
+ SYSTEM_REGISTER(MODULE_NAME, SOURCES, function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {
15
+ "use strict";
16
+ BEFORE_BODY;
17
+ return {
18
+ setters: SETTERS,
19
+ execute: EXECUTE,
20
+ };
21
+ });
22
+ `)
23
+ const buildExportAll = _core.template.statement(`
24
+ for (var KEY in TARGET) {
25
+ if (KEY !== "default" && KEY !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];
26
+ }
27
+ `)
28
+ const MISSING_PLUGIN_WARNING = `\
29
+ WARNING: Dynamic import() transformation must be enabled using the
30
+ @babel/plugin-proposal-dynamic-import plugin. Babel 8 will
31
+ no longer transform import() without using that plugin.
32
+ `
33
+ const MISSING_PLUGIN_ERROR = `\
34
+ ERROR: Dynamic import() transformation must be enabled using the
35
+ @babel/plugin-proposal-dynamic-import plugin. Babel 8
36
+ no longer transforms import() without using that plugin.
37
+ `
38
+
39
+ function getExportSpecifierName(node, stringSpecifiers) {
40
+ if (node.type === "Identifier") {
41
+ return node.name
42
+ } else if (node.type === "StringLiteral") {
43
+ const stringValue = node.value
44
+ if (!(0, _helperValidatorIdentifier.isIdentifierName)(stringValue)) {
45
+ stringSpecifiers.add(stringValue)
46
+ }
47
+ return stringValue
48
+ } else {
49
+ throw new Error(
50
+ `Expected export specifier to be either Identifier or StringLiteral, got ${node.type}`,
51
+ )
52
+ }
53
+ }
54
+ function constructExportCall(
55
+ path,
56
+ exportIdent,
57
+ exportNames,
58
+ exportValues,
59
+ exportStarTarget,
60
+ stringSpecifiers,
61
+ ) {
62
+ const statements = []
63
+ if (!exportStarTarget) {
64
+ if (exportNames.length === 1) {
65
+ statements.push(
66
+ _core.types.expressionStatement(
67
+ _core.types.callExpression(exportIdent, [
68
+ _core.types.stringLiteral(exportNames[0]),
69
+ exportValues[0],
70
+ ]),
71
+ ),
72
+ )
73
+ } else {
74
+ const objectProperties = []
75
+ for (let i = 0; i < exportNames.length; i++) {
76
+ const exportName = exportNames[i]
77
+ const exportValue = exportValues[i]
78
+ objectProperties.push(
79
+ _core.types.objectProperty(
80
+ stringSpecifiers.has(exportName)
81
+ ? _core.types.stringLiteral(exportName)
82
+ : _core.types.identifier(exportName),
83
+ exportValue,
84
+ ),
85
+ )
86
+ }
87
+ statements.push(
88
+ _core.types.expressionStatement(
89
+ _core.types.callExpression(exportIdent, [
90
+ _core.types.objectExpression(objectProperties),
91
+ ]),
92
+ ),
93
+ )
94
+ }
95
+ } else {
96
+ const exportObj = path.scope.generateUid("exportObj")
97
+ statements.push(
98
+ _core.types.variableDeclaration("var", [
99
+ _core.types.variableDeclarator(
100
+ _core.types.identifier(exportObj),
101
+ _core.types.objectExpression([]),
102
+ ),
103
+ ]),
104
+ )
105
+ statements.push(
106
+ buildExportAll({
107
+ KEY: path.scope.generateUidIdentifier("key"),
108
+ EXPORT_OBJ: _core.types.identifier(exportObj),
109
+ TARGET: exportStarTarget,
110
+ }),
111
+ )
112
+ for (let i = 0; i < exportNames.length; i++) {
113
+ const exportName = exportNames[i]
114
+ const exportValue = exportValues[i]
115
+ statements.push(
116
+ _core.types.expressionStatement(
117
+ _core.types.assignmentExpression(
118
+ "=",
119
+ _core.types.memberExpression(
120
+ _core.types.identifier(exportObj),
121
+ _core.types.identifier(exportName),
122
+ ),
123
+ exportValue,
124
+ ),
125
+ ),
126
+ )
127
+ }
128
+ statements.push(
129
+ _core.types.expressionStatement(
130
+ _core.types.callExpression(exportIdent, [
131
+ _core.types.identifier(exportObj),
132
+ ]),
133
+ ),
134
+ )
135
+ }
136
+ return statements
137
+ }
138
+ var _default = (0, _helperPluginUtils.declare)((api, options) => {
139
+ api.assertVersion(7)
140
+ const { systemGlobal = "System", allowTopLevelThis = false } = options
141
+ const reassignmentVisited = new WeakSet()
142
+ const reassignmentVisitor = {
143
+ "AssignmentExpression|UpdateExpression"(path) {
144
+ if (reassignmentVisited.has(path.node)) return
145
+ reassignmentVisited.add(path.node)
146
+ const arg = path.isAssignmentExpression()
147
+ ? path.get("left")
148
+ : path.get("argument")
149
+ if (arg.isObjectPattern() || arg.isArrayPattern()) {
150
+ const exprs = [path.node]
151
+ for (const name of Object.keys(arg.getBindingIdentifiers())) {
152
+ if (this.scope.getBinding(name) !== path.scope.getBinding(name)) {
153
+ return
154
+ }
155
+ const exportedNames = this.exports[name]
156
+ if (!exportedNames) continue
157
+ for (const exportedName of exportedNames) {
158
+ exprs.push(
159
+ this.buildCall(exportedName, _core.types.identifier(name))
160
+ .expression,
161
+ )
162
+ }
163
+ }
164
+ path.replaceWith(_core.types.sequenceExpression(exprs))
165
+ return
166
+ }
167
+ if (!arg.isIdentifier()) return
168
+ const name = arg.node.name
169
+
170
+ if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return
171
+ const exportedNames = this.exports[name]
172
+ if (!exportedNames) return
173
+ let node = path.node
174
+
175
+ const isPostUpdateExpression = _core.types.isUpdateExpression(node, {
176
+ prefix: false,
177
+ })
178
+ if (isPostUpdateExpression) {
179
+ node = _core.types.binaryExpression(
180
+ node.operator[0],
181
+ _core.types.unaryExpression(
182
+ "+",
183
+ _core.types.cloneNode(node.argument),
184
+ ),
185
+ _core.types.numericLiteral(1),
186
+ )
187
+ }
188
+ for (const exportedName of exportedNames) {
189
+ node = this.buildCall(exportedName, node).expression
190
+ }
191
+ if (isPostUpdateExpression) {
192
+ node = _core.types.sequenceExpression([node, path.node])
193
+ }
194
+ path.replaceWith(node)
195
+ },
196
+ }
197
+ return {
198
+ name: "transform-modules-systemjs",
199
+ pre() {
200
+ this.file.set("@babel/plugin-transform-modules-*", "systemjs")
201
+ },
202
+ visitor: {
203
+ CallExpression(path, state) {
204
+ if (_core.types.isImport(path.node.callee)) {
205
+ if (!this.file.has("@babel/plugin-proposal-dynamic-import")) {
206
+ {
207
+ console.warn(MISSING_PLUGIN_WARNING)
208
+ }
209
+ }
210
+ path.replaceWith(
211
+ (0, _helperModuleTransforms.buildDynamicImport)(
212
+ path.node,
213
+ false,
214
+ true,
215
+ (specifier) =>
216
+ _core.types.callExpression(
217
+ _core.types.memberExpression(
218
+ _core.types.identifier(state.contextIdent),
219
+ _core.types.identifier("import"),
220
+ ),
221
+ [specifier],
222
+ ),
223
+ ),
224
+ )
225
+ }
226
+ },
227
+ MetaProperty(path, state) {
228
+ if (
229
+ path.node.meta.name === "import" &&
230
+ path.node.property.name === "meta"
231
+ ) {
232
+ path.replaceWith(
233
+ _core.types.memberExpression(
234
+ _core.types.identifier(state.contextIdent),
235
+ _core.types.identifier("meta"),
236
+ ),
237
+ )
238
+ }
239
+ },
240
+ ReferencedIdentifier(path, state) {
241
+ if (
242
+ path.node.name === "__moduleName" &&
243
+ !path.scope.hasBinding("__moduleName")
244
+ ) {
245
+ path.replaceWith(
246
+ _core.types.memberExpression(
247
+ _core.types.identifier(state.contextIdent),
248
+ _core.types.identifier("id"),
249
+ ),
250
+ )
251
+ }
252
+ },
253
+ Program: {
254
+ enter(path, state) {
255
+ state.contextIdent = path.scope.generateUid("context")
256
+ state.stringSpecifiers = new Set()
257
+ if (!allowTopLevelThis) {
258
+ ;(0, _helperModuleTransforms.rewriteThis)(path)
259
+ }
260
+ },
261
+ exit(path, state) {
262
+ const scope = path.scope
263
+ const exportIdent = scope.generateUid("export")
264
+ const { contextIdent, stringSpecifiers } = state
265
+ const exportMap = Object.create(null)
266
+ const modules = []
267
+ const beforeBody = []
268
+ const setters = []
269
+ const sources = []
270
+ const variableIds = []
271
+ const removedPaths = []
272
+ function addExportName(key, val) {
273
+ exportMap[key] = exportMap[key] || []
274
+ exportMap[key].push(val)
275
+ }
276
+ function pushModule(source, key, specifiers) {
277
+ let module
278
+ modules.forEach(function (m) {
279
+ if (m.key === source) {
280
+ module = m
281
+ }
282
+ })
283
+ if (!module) {
284
+ modules.push(
285
+ (module = {
286
+ key: source,
287
+ imports: [],
288
+ exports: [],
289
+ }),
290
+ )
291
+ }
292
+ module[key] = module[key].concat(specifiers)
293
+ }
294
+ function buildExportCall(name, val) {
295
+ return _core.types.expressionStatement(
296
+ _core.types.callExpression(_core.types.identifier(exportIdent), [
297
+ _core.types.stringLiteral(name),
298
+ val,
299
+ ]),
300
+ )
301
+ }
302
+ const exportNames = []
303
+ const exportValues = []
304
+ const body = path.get("body")
305
+ for (const path of body) {
306
+ if (path.isFunctionDeclaration()) {
307
+ beforeBody.push(path.node)
308
+ removedPaths.push(path)
309
+ } else if (path.isClassDeclaration()) {
310
+ variableIds.push(_core.types.cloneNode(path.node.id))
311
+ path.replaceWith(
312
+ _core.types.expressionStatement(
313
+ _core.types.assignmentExpression(
314
+ "=",
315
+ _core.types.cloneNode(path.node.id),
316
+ _core.types.toExpression(path.node),
317
+ ),
318
+ ),
319
+ )
320
+ } else if (path.isVariableDeclaration()) {
321
+ path.node.kind = "var"
322
+ } else if (path.isImportDeclaration()) {
323
+ const source = path.node.source.value
324
+ pushModule(source, "imports", path.node.specifiers)
325
+ for (const name of Object.keys(path.getBindingIdentifiers())) {
326
+ scope.removeBinding(name)
327
+ variableIds.push(_core.types.identifier(name))
328
+ }
329
+ path.remove()
330
+ } else if (path.isExportAllDeclaration()) {
331
+ pushModule(path.node.source.value, "exports", path.node)
332
+ path.remove()
333
+ } else if (path.isExportDefaultDeclaration()) {
334
+ const declar = path.node.declaration
335
+ if (_core.types.isClassDeclaration(declar)) {
336
+ const id = declar.id
337
+ if (id) {
338
+ exportNames.push("default")
339
+ exportValues.push(scope.buildUndefinedNode())
340
+ variableIds.push(_core.types.cloneNode(id))
341
+ addExportName(id.name, "default")
342
+ path.replaceWith(
343
+ _core.types.expressionStatement(
344
+ _core.types.assignmentExpression(
345
+ "=",
346
+ _core.types.cloneNode(id),
347
+ _core.types.toExpression(declar),
348
+ ),
349
+ ),
350
+ )
351
+ } else {
352
+ exportNames.push("default")
353
+ exportValues.push(_core.types.toExpression(declar))
354
+ removedPaths.push(path)
355
+ }
356
+ } else if (_core.types.isFunctionDeclaration(declar)) {
357
+ const id = declar.id
358
+ if (id) {
359
+ beforeBody.push(declar)
360
+ exportNames.push("default")
361
+ exportValues.push(_core.types.cloneNode(id))
362
+ addExportName(id.name, "default")
363
+ } else {
364
+ exportNames.push("default")
365
+ exportValues.push(_core.types.toExpression(declar))
366
+ }
367
+ removedPaths.push(path)
368
+ } else {
369
+ path.replaceWith(buildExportCall("default", declar))
370
+ }
371
+ } else if (path.isExportNamedDeclaration()) {
372
+ const declar = path.node.declaration
373
+ if (declar) {
374
+ path.replaceWith(declar)
375
+ if (_core.types.isFunction(declar)) {
376
+ const name = declar.id.name
377
+ addExportName(name, name)
378
+ beforeBody.push(declar)
379
+ exportNames.push(name)
380
+ exportValues.push(_core.types.cloneNode(declar.id))
381
+ removedPaths.push(path)
382
+ } else if (_core.types.isClass(declar)) {
383
+ const name = declar.id.name
384
+ exportNames.push(name)
385
+ exportValues.push(scope.buildUndefinedNode())
386
+ variableIds.push(_core.types.cloneNode(declar.id))
387
+ path.replaceWith(
388
+ _core.types.expressionStatement(
389
+ _core.types.assignmentExpression(
390
+ "=",
391
+ _core.types.cloneNode(declar.id),
392
+ _core.types.toExpression(declar),
393
+ ),
394
+ ),
395
+ )
396
+ addExportName(name, name)
397
+ } else {
398
+ if (_core.types.isVariableDeclaration(declar)) {
399
+ declar.kind = "var"
400
+ }
401
+ for (const name of Object.keys(
402
+ _core.types.getBindingIdentifiers(declar),
403
+ )) {
404
+ addExportName(name, name)
405
+ }
406
+ }
407
+ } else {
408
+ const specifiers = path.node.specifiers
409
+ if (specifiers != null && specifiers.length) {
410
+ if (path.node.source) {
411
+ pushModule(path.node.source.value, "exports", specifiers)
412
+ path.remove()
413
+ } else {
414
+ const nodes = []
415
+ for (const specifier of specifiers) {
416
+ const { local, exported } = specifier
417
+ const binding = scope.getBinding(local.name)
418
+ const exportedName = getExportSpecifierName(
419
+ exported,
420
+ stringSpecifiers,
421
+ )
422
+ if (
423
+ binding &&
424
+ _core.types.isFunctionDeclaration(binding.path.node)
425
+ ) {
426
+ exportNames.push(exportedName)
427
+ exportValues.push(_core.types.cloneNode(local))
428
+ } else if (!binding) {
429
+ nodes.push(buildExportCall(exportedName, local))
430
+ }
431
+ addExportName(local.name, exportedName)
432
+ }
433
+ path.replaceWithMultiple(nodes)
434
+ }
435
+ } else {
436
+ path.remove()
437
+ }
438
+ }
439
+ }
440
+ }
441
+ modules.forEach(function (specifiers) {
442
+ const setterBody = []
443
+ // --- START FORK CHANGES ---
444
+ const targetHint = state.opts.generateIdentifierHint
445
+ ? state.opts.generateIdentifierHint(specifiers.key)
446
+ : specifiers.key
447
+ const target = scope.generateUid(targetHint)
448
+ // --- END FORK CHANGES ---
449
+ for (let specifier of specifiers.imports) {
450
+ if (_core.types.isImportNamespaceSpecifier(specifier)) {
451
+ setterBody.push(
452
+ _core.types.expressionStatement(
453
+ _core.types.assignmentExpression(
454
+ "=",
455
+ specifier.local,
456
+ _core.types.identifier(target),
457
+ ),
458
+ ),
459
+ )
460
+ } else if (_core.types.isImportDefaultSpecifier(specifier)) {
461
+ specifier = _core.types.importSpecifier(
462
+ specifier.local,
463
+ _core.types.identifier("default"),
464
+ )
465
+ }
466
+ if (_core.types.isImportSpecifier(specifier)) {
467
+ const { imported } = specifier
468
+ setterBody.push(
469
+ _core.types.expressionStatement(
470
+ _core.types.assignmentExpression(
471
+ "=",
472
+ specifier.local,
473
+ _core.types.memberExpression(
474
+ _core.types.identifier(target),
475
+ specifier.imported,
476
+ imported.type === "StringLiteral",
477
+ ),
478
+ ),
479
+ ),
480
+ )
481
+ }
482
+ }
483
+ if (specifiers.exports.length) {
484
+ const exportNames = []
485
+ const exportValues = []
486
+ let hasExportStar = false
487
+ for (const node of specifiers.exports) {
488
+ if (_core.types.isExportAllDeclaration(node)) {
489
+ hasExportStar = true
490
+ } else if (_core.types.isExportSpecifier(node)) {
491
+ const exportedName = getExportSpecifierName(
492
+ node.exported,
493
+ stringSpecifiers,
494
+ )
495
+ exportNames.push(exportedName)
496
+ exportValues.push(
497
+ _core.types.memberExpression(
498
+ _core.types.identifier(target),
499
+ node.local,
500
+ _core.types.isStringLiteral(node.local),
501
+ ),
502
+ )
503
+ } else {
504
+ }
505
+ }
506
+
507
+ setterBody.push(
508
+ ...constructExportCall(
509
+ path,
510
+ _core.types.identifier(exportIdent),
511
+ exportNames,
512
+ exportValues,
513
+ hasExportStar ? _core.types.identifier(target) : null,
514
+ stringSpecifiers,
515
+ ),
516
+ )
517
+ }
518
+ sources.push(_core.types.stringLiteral(specifiers.key))
519
+ setters.push(
520
+ _core.types.functionExpression(
521
+ null,
522
+ [_core.types.identifier(target)],
523
+ _core.types.blockStatement(setterBody),
524
+ ),
525
+ )
526
+ })
527
+ let moduleName = (0, _helperModuleTransforms.getModuleName)(
528
+ this.file.opts,
529
+ options,
530
+ )
531
+ if (moduleName) moduleName = _core.types.stringLiteral(moduleName)
532
+ ;(0, _helperHoistVariables.default)(path, (id, name, hasInit) => {
533
+ variableIds.push(id)
534
+ if (!hasInit && name in exportMap) {
535
+ for (const exported of exportMap[name]) {
536
+ exportNames.push(exported)
537
+ exportValues.push(scope.buildUndefinedNode())
538
+ }
539
+ }
540
+ })
541
+ if (variableIds.length) {
542
+ beforeBody.unshift(
543
+ _core.types.variableDeclaration(
544
+ "var",
545
+ variableIds.map((id) => _core.types.variableDeclarator(id)),
546
+ ),
547
+ )
548
+ }
549
+ if (exportNames.length) {
550
+ beforeBody.push(
551
+ ...constructExportCall(
552
+ path,
553
+ _core.types.identifier(exportIdent),
554
+ exportNames,
555
+ exportValues,
556
+ null,
557
+ stringSpecifiers,
558
+ ),
559
+ )
560
+ }
561
+ path.traverse(reassignmentVisitor, {
562
+ exports: exportMap,
563
+ buildCall: buildExportCall,
564
+ scope,
565
+ })
566
+ for (const path of removedPaths) {
567
+ path.remove()
568
+ }
569
+ let hasTLA = false
570
+ path.traverse({
571
+ AwaitExpression(path) {
572
+ hasTLA = true
573
+ path.stop()
574
+ },
575
+ Function(path) {
576
+ path.skip()
577
+ },
578
+ noScope: true,
579
+ })
580
+ path.node.body = [
581
+ buildTemplate({
582
+ SYSTEM_REGISTER: _core.types.memberExpression(
583
+ _core.types.identifier(systemGlobal),
584
+ _core.types.identifier("register"),
585
+ ),
586
+ BEFORE_BODY: beforeBody,
587
+ MODULE_NAME: moduleName,
588
+ SETTERS: _core.types.arrayExpression(setters),
589
+ EXECUTE: _core.types.functionExpression(
590
+ null,
591
+ [],
592
+ _core.types.blockStatement(path.node.body),
593
+ false,
594
+ hasTLA,
595
+ ),
596
+ SOURCES: _core.types.arrayExpression(sources),
597
+ EXPORT_IDENTIFIER: _core.types.identifier(exportIdent),
598
+ CONTEXT_IDENTIFIER: _core.types.identifier(contextIdent),
599
+ }),
600
+ ]
601
+ },
602
+ },
603
+ },
604
+ }
605
+ })
606
+ exports.default = _default
607
+
608
+ //# sourceMappingURL=index.js.map
@@ -1,3 +1,5 @@
1
+ import { fileURLToPath } from "node:url"
2
+ import { urlToRelativeUrl } from "@jsenv/urls"
1
3
  import { readFileSync } from "@jsenv/filesystem"
2
4
  import {
3
5
  createMagicSource,
@@ -15,7 +17,24 @@ import { babelPluginTransformImportMetaResolve } from "./helpers/babel_plugin_tr
15
17
  // because of https://github.com/rpetrich/babel-plugin-transform-async-to-promises/issues/84
16
18
  import customAsyncToPromises from "./async-to-promises.js"
17
19
 
20
+ /*
21
+ * When systemjs format is used by babel, it will generated UID based on
22
+ * the import specifier:
23
+ * https://github.com/babel/babel/blob/97d1967826077f15e766778c0d64711399e9a72a/packages/babel-plugin-transform-modules-systemjs/src/index.ts#L498
24
+ * But at this stage import specifier are absolute file urls
25
+ * So without minification these specifier are long and dependent
26
+ * on where the files are on the filesystem.
27
+ * This can be mitigated by minification that will rename them.
28
+ * But to fix this issue once and for all I have copy-pasted
29
+ * "@babel/plugin-transform-modules-systemjs" to introduce
30
+ * "generateIdentifierHint" options and prevent that from hapenning
31
+ */
32
+ const TRANSFORM_MODULES_SYSTEMJS_PATH = fileURLToPath(
33
+ new URL("./babel_plugin_transform_modules_systemjs.cjs", import.meta.url),
34
+ )
35
+
18
36
  export const convertJsModuleToJsClassic = async ({
37
+ rootDirectoryUrl,
19
38
  systemJsInjection,
20
39
  systemJsClientFileUrl,
21
40
  urlInfo,
@@ -41,7 +60,18 @@ export const convertJsModuleToJsClassic = async ({
41
60
  // proposal-dynamic-import required with systemjs for babel8:
42
61
  // https://github.com/babel/babel/issues/10746
43
62
  requireFromJsenv("@babel/plugin-proposal-dynamic-import"),
44
- requireFromJsenv("@babel/plugin-transform-modules-systemjs"),
63
+ [
64
+ // eslint-disable-next-line import/no-dynamic-require
65
+ requireFromJsenv(TRANSFORM_MODULES_SYSTEMJS_PATH),
66
+ {
67
+ generateIdentifierHint: (key) => {
68
+ if (key.startsWith("file://")) {
69
+ return urlToRelativeUrl(key, rootDirectoryUrl)
70
+ }
71
+ return key
72
+ },
73
+ },
74
+ ],
45
75
  [
46
76
  customAsyncToPromises,
47
77
  {
@@ -1,16 +1,3 @@
1
- /*
2
- * Something to keep in mind:
3
- * When systemjs format is used by babel, it will generated UID based on
4
- * the import specifier:
5
- * https://github.com/babel/babel/blob/97d1967826077f15e766778c0d64711399e9a72a/packages/babel-plugin-transform-modules-systemjs/src/index.ts#L498
6
- * But at this stage import specifier are absolute file urls
7
- * So without minification these specifier are long and dependent
8
- * on where the files are on the filesystem.
9
- * This is mitigated by minification that will shorten them
10
- * But ideally babel should not generate this in the first place
11
- * and prefer to unique identifier based solely on the specifier basename for instance
12
- */
13
-
14
1
  import { urlToFilename } from "@jsenv/urls"
15
2
  import { jsenvPluginAsJsClassicConversion } from "./jsenv_plugin_as_js_classic_conversion.js"
16
3
  import { jsenvPluginAsJsClassicHtml } from "./jsenv_plugin_as_js_classic_html.js"
@@ -98,6 +98,7 @@ export const jsenvPluginAsJsClassicConversion = ({
98
98
  context.urlGraph.deleteUrlInfo(jsModuleUrlInfo.url)
99
99
  }
100
100
  const { content, sourcemap } = await convertJsModuleToJsClassic({
101
+ rootDirectoryUrl: context.rootDirectoryUrl,
101
102
  systemJsInjection,
102
103
  systemJsClientFileUrl,
103
104
  urlInfo,